虽然MCU-DIY已经结束了,但是还是要跑过来分享一下,自己在实训周写的RTC。功能挺简单,就是用1302实现时钟功能,同时可以设置闹钟。输入时矩阵键盘,输出时四位数码管。
主要有四个任务,读1302时间,数码管显示,键盘扫描,闹钟扫描。利用定时器0循环扫描这四个任务。
下面简单介绍一下程序;
数码管,利用定时器扫描,选中点亮某一位,通过快速反复的扫描数码管实现数码管的动态显示。数码管显示有两种模式,一种的每两秒闪烁四个小数点,另一种是某一位每两秒闪烁一次。
——回复可见内容——
再介绍一个子函数,用于让数码显示大于4位的内容,可以左右循环。不过效果还没调好,感兴趣请自己调试
void Led_fresh(void) //更新显示缓存 Leddis
{ //对显示内容以四位为一组送入显存,
static u8 Head = 17; //让数码管显示大于四位的内容
u8 i = 0;
//送Ledbuf的高位到Leddis的高位
if(Led_flag)
{
if(Head<3)
{Led_flag = 0;Head = 3;}
else
{for(;i<4;i++)Leddis[3-i] = Ledbuf[Head-i];Head--;}
}
else
{
if(Head>17)
{Led_flag = 1;Head = 17;}
else
{for(;i<4;i++)Leddis[3-i] = Ledbuf[Head-i];Head++;}
}
}
键盘扫描使用反转法写的。程序比较长,就不贴出来了,改天我传一下流程图吧。
把main也贴出来好了
void main(void)
{
RTC_Init();
Syscount[0] = 2;//数码管延时时钟
Syscount[1] = 10;//闹钟延时时钟
Syscount[2] = 50;//键盘延时时钟
TMOD = 0X11;
TH0 = (65536-1000)/255;//1ms
TL0 = (65536-1000)%255;//1ms
EA = 1;
ET0 = 1;
TR0 = 1;
while(1)
{
Get_Time();
if(Syscount[0]==0)
{Dis();Syscount[0] = 2;}
if(Syscount[1]==0)
{if(Alarm_flag)Alarm();Syscount[1] = 20;}
if(Syscount[2]==0)
{Select();Syscount[2] = 50;}
}
}
void time0(void) interrupt 1
{
u8 i;
TH0 = (65536-1000)/255;//1ms
TL0 = (65536-1000)%255;//1ms
for(i=0;i<3;i++)if(Syscount[i])Syscount[i]--;
}
——回复可见内容——