第89节:用单片机内部定时器做一个时钟
时间:11-22
来源:互联网
点击:
- 的共享变量uiVoiceCnt
- ucKeySec=0;//响应按键服务处理程序后,按键编号清零,避免一致触发
- break;
- case 3://短按设置按键 对应朱兆祺学习板的S9键
- switch(ucWd)//在不同的窗口下,设置不同的参数
- {
- case 1:
- ucPart++;
- if(ucPart>3)
- {
- ucPart=1;
- ucWd=2; //切换到第二个窗口,设置时分秒
- ucWd2Update=1;//窗口2更新显示
- }
- ucWd1Update=1;//窗口1更新显示
- break;
- case 2:
- if(ucPart>0) //在窗口2的时候,要第一次激活设置时间,必须是长按3秒才可以,这里短按激活不了第一次
- {
- ucPart++;
- if(ucPart>3)//设置时间结束
- {
- ucPart=0;
- /* 注释六:
- * 每个月份的天数最大值是不一样的,在写入ds1302时钟芯片内部数据前,应该做一次调整。
- * 有的月份最大28天,有的月份最大29天,有的月份最大30天,有的月份最大31天,
- */
- ucDate=date_adjust(ucYear,ucMonth,ucDate); //日调整 避免日的数值在某个月份超范围
- ucTimerStart=0;//关闭定时器的时间。在更改定时器内部时间数据时,先关闭它,相当于原子锁的加锁作用。
- ucTimerYear=ucYear;//把设置和显示的数据更改到定时器内部的时间变量
- ucTimerMonth=ucMonth;
- ucTimerDate=ucDate;
- ucTimerHour=ucHour;
- ucTimerMinute=ucMinute;
- ucTimerSecond=ucSecond;
- ucTimerStart=1;//打开定时器的时间。在更改定时器内部时间数据后,再打开它,相当于原子锁的解锁作用。
- }
- 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_tabl
单片机内部定时器时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)