这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 两周实训周结束了,分享一份RTC的实例。

共3条 1/1 1 跳转至

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

助工
2012-05-27 09:18:25     打赏

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



——回复可见内容——



关键词: 两周     实训周     结束     分享     一份     实例     显示     Led    

助工
2012-05-27 09:28:08     打赏
2楼
自己先抢一下沙发,不知道MCU-DIY过了,这类贴有没有人看呢

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

共3条 1/1 1 跳转至

回复

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