📄 timer.lst
字号:
C51 COMPILER V7.02a TIMER 09/12/2008 14:50:32 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE TIMER
OBJECT MODULE PLACED IN timer.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE timer.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <at89x51.h>
2 #include "keyboard.h"
3 #include "led.h"
4 #include "LCD1602.h"
5
6 unsigned char display_buffer[6]; //显示缓冲区
7
8 unsigned char second,minute,hour,day,month,year; //分别保存秒、分、时、天、月、年的变量
9 unsigned char n_50m_second; //保存多少个50毫秒的变量
10 unsigned char days_of_month; //保存该月多少天的变量
11
12 void timer0_isr(void) interrupt 1 using 1 //定时器0中断处理函数
13 {
14 1 TL0=0xB9;
15 1 TH0=0x3C; //定时器重装。定时50mS中断一次
16 1 n_50m_second++;
17 1 if(n_50m_second>=20) //1秒到
18 1 {
19 2 n_50m_second=0; //清50毫秒计数
20 2 second++; //秒加1
21 2 if(second==60) //如果秒到60
22 2 {
23 3 second=0; //秒清0
24 3 minute++; //分加1
25 3 if(minute==60) //如果分到60
26 3 {
27 4 minute=0; //分清0
28 4 hour++; //小时加1
29 4 if(hour==24) //如果小时到24
30 4 {
31 5 hour=0; //小时清零
32 5 day++; //天加1
33 5 if(day>days_of_month) //如果天大于本月最后一天
34 5 {
35 6 day=1; //天置1
36 6 month++; //月加1
37 6 if(month>12) //如果月大于12
38 6 {
39 7 month=1; //月置1
40 7 year++; //年加1
41 7 if(year>=100) //如果年大于100
42 7 {
43 8 year=0; //年清零
44 8 }
45 7 }
46 6 }
47 5 }
48 4 }
49 3 }
50 2 }
51 1 }
52
53 #define NORMAL 0
54 #define SECOND_ADJ 1
55 #define MINUTE_ADJ 2
C51 COMPILER V7.02a TIMER 09/12/2008 14:50:32 PAGE 2
56 #define HOUR_ADJ 3
57 #define DAY_ADJ 4
58 #define MONTH_ADJ 5
59 #define YEAR_ADJ 6
60
61 #define STATUS_MIN 0
62 #define STATUS_MAX 6
63
64 unsigned char calculate_days(void) //计算本月有多少天
65 {
66 1 unsigned int temp;
67 1 switch (month)
68 1 {
69 2 case 1:
70 2 case 3:
71 2 case 5:
72 2 case 7:
73 2 case 8:
74 2 case 10:
75 2 case 12:
76 2 return 31; //1、3、5、7、8、10、12月为31天
77 2 break;
78 2 case 4:
79 2 case 6:
80 2 case 9:
81 2 case 11: //4、6、9、11月为30天
82 2 return 30;
83 2 break;
84 2 case 2:
85 2 temp=2000+year; //因为year中保存的是年的最后两位,所以要加上2000
86 2 if((((temp%4)==0)&&((temp%100)!=0))||((temp%400)==0))
87 2 {
88 3 return 29; //闰年2月为29天
89 3 }
90 2 else
91 2 {
92 3 return 28; //平年2月为28天
93 3 }
94 2 }
95 1 }
96
97 unsigned char flicker_time; //闪烁频率
98 unsigned char display_on; //显示开关标志。用来产生闪烁效果
99 unsigned char status; //状态值
100 unsigned char display_date; //是否是显示日期
101
102 void timer(void)
103 {
104 1 if(key==KEY_FUNCTION) //如果功能键按下
105 1 {
106 2 if(status<STATUS_MAX)status++; //如果状态值小于对大状态,则状态值加1
107 2 else status=STATUS_MIN; //否则,状态值置最小状态值
108 2 key=0; //清键值
109 2 }
110 1
111 1
112 1 /*****************************************************/
113 1 // 我加入的代码
114 1 if(key==KEY_ENTER) //如果确定键按下
115 1 {
116 2 status=NORMAL;
117 2 key=0;
C51 COMPILER V7.02a TIMER 09/12/2008 14:50:32 PAGE 3
118 2 }
119 1 /*****************************************************/
120 1
121 1 days_of_month=calculate_days(); //计算本月天数
122 1 switch (status)
123 1 {
124 2 case NORMAL: //平常状态
125 2 {
126 3 if(key==KEY_UP) //如果上翻键按下,则显示日期
127 3 {
128 4 display_date=100; //设置显示日期的时间
129 4 key=0;
130 4 }
131 3 if(key==KEY_DOWN) //如果下翻键按下,则显示时间
132 3 {
133 4 display_date=0;
134 4 key=0;
135 4 }
136 3 if(display_date) //如果是显示日期,则计算日期每位
137 3 {
138 4 display_buffer[5]=16+day%10;
139 4 display_buffer[4]=day/10;
140 4 display_buffer[3]=16+month%10;
141 4 display_buffer[2]=month/10;
142 4 display_buffer[1]=16+year%10;
143 4 display_buffer[0]=year/10;
144 4 display_date--; //经过一定时间后,自动显示时间
145 4 }
146 3 else //如果是显示时间,则计算时间每位
147 3 {
148 4 display_buffer[5]=second%10;
149 4 display_buffer[4]=second/10;
150 4 display_buffer[3]=16+minute%10;
151 4 display_buffer[2]=minute/10;
152 4 display_buffer[1]=16+hour%10;
153 4 display_buffer[0]=hour/10;
154 4 }
155 3 display(display_buffer); //显示结果
156 3 break;
157 3 }
158 2 case SECOND_ADJ: //秒调整状态
159 2 {
160 3 if(key==KEY_UP) //上翻键按下,秒增加1
161 3 {
162 4 display_on=1; //开显示,调整时能看清楚
163 4 second++;
164 4 if(second>=60)second=0; //如果秒到60,则清0
165 4 key=0;
166 4 }
167 3 if(key==KEY_DOWN) //下翻键按下,秒减1
168 3 {
169 4 display_on=1;
170 4 second--;
171 4 if(second>=60)second=59;
172 4 key=0;
173 4 }
174 3 display_buffer[5]=second%10; //计算每位值
175 3 display_buffer[4]=second/10;
176 3 display_buffer[3]=16+minute%10;
177 3 display_buffer[2]=minute/10;
178 3 display_buffer[1]=16+hour%10;
179 3 display_buffer[0]=hour/10;
C51 COMPILER V7.02a TIMER 09/12/2008 14:50:32 PAGE 4
180 3 if(!display_on) //如果关显示
181 3 {
182 4 flicker_time++; //闪烁计时加1
183 4 if(flicker_time>20){flicker_time=0;display_on=1;} //如果闪烁计时到20,开显示
184 4 display_buffer[5]=DISPLAY_OFF;
185 4 //display_buffer[4]=DISPLAY_OFF;
186 4 }
187 3 else //如果开显示
188 3 {
189 4 flicker_time++; //闪烁计时加1
190 4 if(flicker_time>30){flicker_time=0;display_on=0;} //如果闪烁计时到20,关显示
191 4 }
192 3 display(display_buffer);
193 3 break;
194 3 }
195 2 case MINUTE_ADJ: //分调整状态
196 2 {
197 3 if(key==KEY_UP)
198 3 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -