第48节:利用DS1302做一个实时时钟
时间:11-22
来源:互联网
点击:
- Write1302 (WRITE_PROTECT,0x80); //允许写保护
- }
- ucWd2Update=1;//窗口2更新显示
- }
- break;
- }
- ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
- uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
- ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
- ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
- break;
- case 17://长按3秒设置按键 对应朱兆祺学习板的S9键
- switch(ucWd)//在不同的窗口下,设置不同的参数
- {
- case 2:
- if(ucPart==0) //处于非设置时间的状态下,要第一次激活设置时间,必须是长按3秒才可以
- {
- ucWd=1;
- ucPart=1;//进入到设置日期的状态下
- ucWd1Update=1;//窗口1更新显示
- }
- break;
- }
- ucVoiceLock=1;//原子锁加锁,保护主函数与中断函数的共享变量uiVoiceCnt
- uiVoiceCnt=const_voice_short; //按键声音触发,滴一声就停。
- ucVoiceLock=0;//原子锁解锁,保护主函数与中断函数的共享变量uiVoiceCnt
- ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
- break;
- }
- /* 注释六:
- * 注意,此处就是第一次出现的电平按键程序,跟以往的下降沿按键不一样。
- * ucKey4Sr是经过软件滤波处理后,直接反应IO口电平状态的变量.当电平发生
- * 变化时,就会切换到不同的显示界面,这里多用了一个ucKey4SrRecord变量
- * 记录上一次的电平状态,是为了避免一直刷新显示。
- */
- if(ucKey4Sr!=ucKey4SrRecord)//说明S13的切换按键电平状态发生变化
- {
- ucKey4SrRecord=ucKey4Sr;//及时记录当前最新的按键电平状态避免一直进来触发
- if(ucKey4Sr==1) //松手后切换到显示时间的窗口
- {
- ucWd=2; //显示时分秒的窗口
- ucPart=0;//进入到非设置时间的状态下
- ucWd2Update=1;//窗口2更新显示
- }
- else//按下去切换到显示日期的窗口
- {
- ucWd=1; //显示年月日的窗口
- ucPart=0;//进入到非设置时间的状态下
- ucWd1Update=1;//窗口1更新显示
- }
- }
- }
- void display_drive(void)
- {
- //以下程序,如果加一些数组和移位的元素,还可以压缩容量。但是鸿哥追求的不是容量,而是清晰的讲解思路
- switch(ucDisplayDriveStep)
- {
- case 1://显示第1位
- ucDigShowTemp=dig_table[ucDigShow1];
- if(ucDigDot1==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
- }
- dig_hc595_drive(ucDigShowTemp,0xfe);
- break;
- case 2://显示第2位
- ucDigShowTemp=dig_table[ucDigShow2];
- if(ucDigDot2==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
- }
- dig_hc595_drive(ucDigShowTemp,0xfd);
- break;
- case 3://显示第3位
- ucDigShowTemp=dig_table[ucDigShow3];
- if(ucDigDot3==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
- }
- dig_hc595_drive(ucDigShowTemp,0xfb);
- break;
- case 4://显示第4位
- ucDigShowTemp=dig_table[ucDigShow4];
- if(ucDigDot4==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
- }
- dig_hc595_drive(ucDigShowTemp,0xf7);
- break;
- case 5://显示第5位
- ucDigShowTemp=dig_table[ucDigShow5];
- if(ucDigDot5==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
- }
- dig_hc595_drive(ucDigShowTemp,0xef);
- break;
- case 6://显示第6位
- ucDigShowTemp=dig_table[ucDigShow6];
- if(ucDigDot6==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
- }
- dig_hc595_drive(ucDigShowTemp,0xdf);
- break;
- case 7://显示第7位
- ucDigShowTemp=dig_table[ucDigShow7];
- if(ucDigDot7==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
- }
- dig_hc595_drive(ucDigShowTemp,0xbf);
- break;
- case 8://显示第8位
- ucDigShowTemp=dig_table[ucDigShow8];
- if(ucDigDot8==1)
- {
- ucDigShowTemp=ucDigShowTemp|0x80;//显示小数点
- }
- dig_hc595_drive(ucDigShowTemp,0x7f);
- break;
DS1302实时时 相关文章:
- 如何实现DS1302实时时钟表显示在1602LCD液晶(11-18)
- LCD1602液晶显示DS1302实时时钟Proteus仿真(11-13)
- AT89C2051+LCD1602+DS1302实时时钟设计(c51)(11-10)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)