challis
发表于 2024-1-26 11:04:33
元件和线路测试成功后,主要就是修改程序逻辑了
我考虑的是做一个小时钟,带按钮,平时就正常冒号闪烁显示时间
按mode按钮后分钟闪烁,可以通过up/down按钮来调整分钟
再按一次mode按钮后时钟闪烁,可以通过up/down按钮来调整小时
challis
发表于 2024-1-26 11:05:54
为了显示方便,我用seg_4bit_data来直接储存需要显示的内容,用Timer4来循环显示seg_4bit_data的数据
//2毫秒@6.000MHz
void Timer4_Isr(void) interrupt 20
{
switch(t4_iter)
{
case 0: //seg1
SEG_4 = 0;
t4_iter = 1;
SEG_LED = seg_4bit_data;
SEG_1 = 1;
break;
case 1: //seg2
SEG_1 = 0;
t4_iter = 2;
SEG_LED = seg_4bit_data;
SEG_2 = 1;
break;
case 2: //seg3
SEG_2 = 0;
t4_iter = 3;
SEG_LED = seg_4bit_data;
SEG_3 = 1;
break;
case 3: //seg4
SEG_3 = 0;
t4_iter = 0;
SEG_LED = seg_4bit_data;
SEG_4 = 1;
break;
}
}
challis
发表于 2024-1-26 11:07:45
最开始所有代码都写在main.c中,发现实在太乱套了,于是,数码管设置相关的函数被抽离出来,写到了seg.h中
#ifndef SEG_H
#define SEG_H
#include "STC8H.h"
#define SEG_NULL 0xff
//led数字
uchar xdata seg_led_data[]={
0xC0,//"0"
0xF9,//"1"
0xA4,//"2"
0xB0,//"3"
0x99,//"4"
0x92,//"5"
0x82,//"6"
0xF8,//"7"
0x80,//"8"
0x90,//"9"
0x88,//"A"
0x83,//"B"
0xC6,//"C"
0xA1,//"D"
0x86,//"E"
0x8E,//"F"
0x89,//"H"
0xC7,//"L"
0xC8,//"n"
0xC1,//"u"
0x8C,//"P"
0xA3,//"o"
0xBF,//"-"
0xFF,//熄灭
};
//4位数码管的具体数据
uchar seg_4bit_data = {SEG_NULL,SEG_NULL,SEG_NULL,SEG_NULL};
//设置前2个数码管,show_dot为是否显示冒号
void SetSeg4BitData_1(uchar d,uchar show_dot)
{
if(d == SEG_NULL)
{
seg_4bit_data = 0xff;
if(show_dot)
seg_4bit_data = 0x7f;
else
seg_4bit_data = 0xff;
}
else
{
seg_4bit_data = seg_led_data;
if(show_dot)
seg_4bit_data = seg_led_data & 0x7f;
else
seg_4bit_data = seg_led_data;
}
}
//设置后2个数码管
void SetSeg4BitData_2(uchar d)
{
if(d == SEG_NULL)
{
seg_4bit_data = 0xff;
seg_4bit_data = 0xff;
}
else
{
seg_4bit_data = seg_led_data;
seg_4bit_data = seg_led_data;
}
}
#endif//SEG_H
外部直接调用SetSeg4BitData_1,SetSeg4BitData_2来设置前2位数码管和后2位数码管所显示的内容,也就是seg_4bit_data的内容
challis
发表于 2024-1-26 11:09:21
将时间相关的代码放到了clock.h文件中
#ifndef CLOCK_H
#define CLOCK_H
uchar hour=0,minute=0,second=0;
void AddSec()
{
if(second >= 59)
{
second = 0;
if(minute >= 59)
{
minute = 0;
if(hour >= 23)
hour = 0;
else
++hour;
}
else
++minute;
}
else
++second;
}
#endif //CLOCK_H
AddSec来实现增加一秒,以及自动增加分钟和小时
challis
发表于 2024-1-26 11:13:35
本帖最后由 grstory 于 2024-1-26 11:17 编辑
再开一个Timer3定时器来处理业务流程,控制闪烁用is_show_dot变量,每隔500ms将会在1,0间变动,每隔1000ms调用一次AddSec函数,用SetSeg4Bit函数来将需要显示的数据写入具体变量,以供Timer4进行循环显示
#define Mode_Show_1 minute
#define Mode_Show_2 second
void SetSeg4Bit()
{
SetSeg4BitData_1(Mode_Show_1,is_show_dot);
SetSeg4BitData_2(Mode_Show_2);
}
//100毫秒@6.000MHz
void Timer3_Isr(void) interrupt 19
{
++t3_iter;
if(t3_iter == 5)
{
is_show_dot = !is_show_dot;
SetSeg4Bit();
}
else if(t3_iter == 10)
{
AddSec();
is_show_dot = !is_show_dot;
SetSeg4Bit();
t3_iter = 0;
}
}
challis
发表于 2024-1-26 11:20:06
直接用母对母的插线太不稳定了,经常线就掉了,多掉几根,还需要找对应的接口,于是决定将数码管焊到电路板上,本来想把单片机也焊上去,但是为了以后方便拆卸单片机,就焊了几根带母口的插线到数码管上了,单片机转接板上也焊上了排插
challis
发表于 2024-1-26 11:21:06
为了方便调试,正常应该是显示小时,分钟的现在改为显示分钟,秒钟,用了2个宏定义,方便后期修改#define Mode_Show_1 minute
#define Mode_Show_2 second
challis
发表于 2024-1-26 11:23:54
本帖最后由 grstory 于 2024-1-26 11:25 编辑
烧录程序,接上自制的简易电源,测试,能正常的显示时间流逝,并且冒号闪烁正常了!
challis
发表于 2024-1-26 11:28:27
接下来就是添加按钮,然后实现调整时间的功能了,对了,请问下大佬们,按钮一端接IO口,另一端是接地还是接VCC?中间需要加电阻吗?
manzunzu
发表于 2024-1-26 15:09:43
你好这个代码能分享下吗,我做出来的乱码{:4_187:}
页:
1
2
[3]
4
5
6
7
8
9
10
11