第89节:用单片机内部定时器做一个时钟
时间:11-22
来源:互联网
点击:
- gned char ucWd1Part3Update=0; //在窗口1中,局部3的更新显示标志
- unsigned char ucWd2Part1Update=0;//在窗口2中,局部1的更新显示标志
- unsigned char ucWd2Part2Update=0; //在窗口2中,局部2的更新显示标志
- unsigned char ucWd2Part3Update=0; //在窗口2中,局部3的更新显示标志
- unsigned charucYear=15; //用来显示和设置的时间变量
- unsigned charucMonth=1;
- unsigned charucDate=1;
- unsigned charucHour=12;
- unsigned charucMinute=0;
- unsigned charucSecond=0;
- unsigned int uiTimerCnt=0; //计时器的时基
- unsigned charucTimerYear=15; //在定时器内部时基产生的时间变量
- unsigned charucTimerMonth=1;
- unsigned charucTimerDate=1;
- unsigned charucTimerHour=12;
- unsigned charucTimerMinute=0;
- unsigned charucTimerSecond=0;
- unsigned charucTimerDateMax=31; //当前月份的最大天数
- unsigned charucTimerUpdate=0; //定时器每1秒钟所产生的标志
- unsigned charucTimerStart=1;//是否打开定时器内部时间的标志,在本程序相当于原子锁的作用。
- unsigned char ucTemp1=0;//中间过渡变量
- unsigned char ucTemp2=0;//中间过渡变量
- unsigned char ucTemp4=0;//中间过渡变量
- unsigned char ucTemp5=0;//中间过渡变量
- unsigned char ucTemp7=0;//中间过渡变量
- unsigned char ucTemp8=0;//中间过渡变量
- unsigned char ucDelayTimerLock=0; //原子锁
- unsigned intuiDelayTimer=0;
- unsigned char ucDpyTimeLock=0; //原子锁
- unsigned intuiDpyTimeCnt=0;//数码管的闪烁计时器,放在定时中断里不断累加
- //根据原理图得出的共阴数码管字模表
- code unsigned char dig_table[]=
- {
- 0x3f,//0 序号0
- 0x06,//1 序号1
- 0x5b,//2 序号2
- 0x4f,//3 序号3
- 0x66,//4 序号4
- 0x6d,//5 序号5
- 0x7d,//6 序号6
- 0x07,//7 序号7
- 0x7f,//8 序号8
- 0x6f,//9 序号9
- 0x00,//无 序号10
- 0x40,//- 序号11
- 0x73,//P 序号12
- };
- void main()
- {
- initial_myself();
- delay_long(100);
- initial_peripheral();
- while(1)
- {
- key_service(); //按键服务的应用程序
- timer_sampling(); //定时器采样程序,内部每秒钟采集更新一次
- display_service(); //显示的窗口菜单服务程序
- }
- }
- /* 注释二:
- * 系统不用时时刻刻采集定时器的内部数据,每隔1秒钟的时间更新采集一次就可以了。
- * 这个1秒钟的时间是根据定时器内部ucTimerUpdate变量来判断。
- */
- void timer_sampling(void) //采样定时器的程序,内部每秒钟采集更新一次
- {
- if(ucPart==0)//当系统不是处于设置日期和时间的情况下
- {
- if(ucTimerUpdate==1)//每隔1秒钟时间就更新采集一次定时器的时间数据
- {
- ucTimerUpdate=0;//及时清零,避免一直更新。
- ucYear=ucTimerYear; //读取定时器内部的年
- ucMonth=ucTimerMonth; //读取定时器内部的月
- ucDate=ucTimerDate;//读取定时器内部的日
- ucHour=ucTimerHour; //读取定时器内部的时
- ucMinute=ucTimerMinute;//读取定时器内部的分
- ucSecond=ucTimerSecond;//读取定时器内部的秒
- ucWd2Update=1; //窗口2更新显示时间
- }
- }
- }
- /* 注释三:
- * 根据年份和月份来获取当前这个月的最大天数。每个月份的天数最大取值不同,有的最大28日,
- * 有的最大29日,有的最大30,有的最大31。
- */
- unsigned char get_date(unsigned char ucYearTemp,unsigned char ucMonthTemp)
- {
- unsigned char ucDayResult;
- unsigned int uiYearTemp;
- unsigned int uiYearYu;
- ucDayResult=31; //默认最大是31天,以下根据不同的年份和月份来决定是否需要修正这个值
- switch(ucMonthTemp)//根据不同的月份来获取当前月份天数的最大值
- {
- case 2://二月份要计算是否是闰年
- uiYearTemp=2000+ucYearTemp;
- uiYearYu=uiYearTemp%4;
- if(uiYearYu==0) //闰年
- {
- ucDayResult=29;
- }
- else
- {
- ucDayResult=28;
- }
- break;
- case 4:
- case 6:
- case 9:
- case 11:
- ucDayResult=30;
- break;
- }
- return ucDayResult;
- }
- //日调整 每个月份的日最大取值不同,有的最大28日,有的最大29日,有的最大30,有的最大31
- unsigned char date_adjust(unsigned char ucYearTemp,unsigned char ucMonthTemp,unsigned char ucDateTemp) //日调整
- {
- unsigned char ucDayResult;
- unsigned int uiYearTemp;
- unsigned int uiYearYu;
- ucDayResult=ucDateTemp;
- switch(ucMonthTemp)//根据不同的月份来修正不同的日最大值
- {
- case 2://二月份要计算是否是闰年
- uiYearTemp=2000+ucY
单片机内部定时器时 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)