论坛» DIY与开源设计» 电子DIY

两周实训周结束了,分享一份RTC的实例。

助工
2012-05-27 09:18 1楼

虽然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]--;
}



——回复可见内容——
助工
2012-05-27 09:28 2楼
自己先抢一下沙发,不知道MCU-DIY过了,这类贴有没有人看呢
工程师
2012-05-27 09:32 3楼

回复看看,学习学习

助工
2012-05-27 10:20 4楼
如果发现数码管没有显示,请把定时器1关联的语句 // 掉,或者把定时器1开启。我写的时候忘记开启定时器1.
工程师
2012-05-27 10:39 5楼

活动是有时间限制,但是知识却是永远没有界限的。

院士
2012-05-27 10:40 6楼
deleted

肯定会死有人看的,这种东西,是长久性功能
助工
2012-05-27 13:38 7楼
看看。。呵呵
菜鸟
2013-06-07 11:17 8楼
HEHE
菜鸟
2019-10-17 23:07 9楼

看看

高工
2021-02-28 10:51 10楼

看看,了解一下。

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]