?? timer.lst
字號:
C51 COMPILER V7.06 TIMER 03/08/2006 13:20:05 PAGE 1
C51 COMPILER V7.06, 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 /*
2 timer.c file
3 Created by Computer-lov. Date: 2005.5.31
4 Last edited date:2005.5.31
5 Copyright (c) 2005 Computer-lov
6 version 1.0
7 All rigths reserved
8 歡迎訪問我的blog: http://computer00.21ic.org
9 */
10
11 #include "timer.h"
12 #include "main.h"
13 #include "keyboard.h"
14 #include "led.h"
15
16 unsigned char display_buffer[6]; //顯示緩沖區(qū)
17
18 unsigned char second,minute,hour,day,month,year; //分別保存秒、分、時、天、月、年的變量
19 unsigned char n_50m_second; //保存多少個50毫秒的變量
20 unsigned char days_of_month; //保存該月多少天的變量
21
22 void timer0_isr(void) interrupt 1 using 1 //定時器0中斷處理函數(shù)
23 {
24 1 TL0=0xB9;
25 1 TH0=0x3C; //定時器重裝。定時50mS中斷一次
26 1 n_50m_second++;
27 1 if(n_50m_second>=20) //1秒到
28 1 {
29 2 n_50m_second=0; //清50毫秒計數(shù)
30 2 second++; //秒加1
31 2 if(second==60) //如果秒到60
32 2 {
33 3 second=0; //秒清0
34 3 minute++; //分加1
35 3 if(minute==60) //如果分到60
36 3 {
37 4 minute=0; //分清0
38 4 hour++; //小時加1
39 4 if(hour==24) //如果小時到24
40 4 {
41 5 hour=0; //小時清零
42 5 day++; //天加1
43 5 if(day>days_of_month) //如果天大于本月最后一天
44 5 {
45 6 day=1; //天置1
46 6 month++; //月加1
47 6 if(month>12) //如果月大于12
48 6 {
49 7 month=1; //月置1
50 7 year++; //年加1
51 7 if(year>=100) //如果年大于100
52 7 {
53 8 year=0; //年清零
54 8 }
55 7 }
C51 COMPILER V7.06 TIMER 03/08/2006 13:20:05 PAGE 2
56 6 }
57 5 }
58 4 }
59 3 }
60 2 }
61 1 }
62
63 #define NORMAL 0
64 #define SECOND_ADJ 1
65 #define MINUTE_ADJ 2
66 #define HOUR_ADJ 3
67 #define DAY_ADJ 4
68 #define MONTH_ADJ 5
69 #define YEAR_ADJ 6
70
71 #define STATUS_MIN 0
72 #define STATUS_MAX 6
73
74 unsigned char calculate_days(void) //計算本月有多少天
75 {
76 1 unsigned int temp;
77 1 switch (month)
78 1 {
79 2 case 1:
80 2 case 3:
81 2 case 5:
82 2 case 7:
83 2 case 8:
84 2 case 10:
85 2 case 12:
86 2 return 31; //1、3、5、7、8、10、12月為31天
87 2 break;
88 2 case 4:
89 2 case 6:
90 2 case 9:
91 2 case 11: //4、6、9、11月為30天
92 2 return 30;
93 2 break;
94 2 case 2:
95 2 temp=2000+year; //因為year中保存的是年的最后兩位,所以要加上2000
96 2 if((((temp%4)==0)&&((temp%100)!=0))||((temp%400)==0))
97 2 {
98 3 return 29; //閏年2月為29天
99 3 }
100 2 else
101 2 {
102 3 return 28; //平年2月為28天
103 3 }
104 2 }
105 1 }
106
107 unsigned char flicker_time; //閃爍頻率
108 unsigned char display_on; //顯示開關(guān)標(biāo)志。用來產(chǎn)生閃爍效果
109 unsigned char status; //狀態(tài)值
110 unsigned char display_date; //是否是顯示日期
111
112 void timer(void)
113 {
114 1 if(key==KEY_FUNCTION) //如果功能鍵按下
115 1 {
116 2 if(status<STATUS_MAX)status++; //如果狀態(tài)值小于對大狀態(tài),則狀態(tài)值加1
117 2 else status=STATUS_MIN; //否則,狀態(tài)值置最小狀態(tài)值
C51 COMPILER V7.06 TIMER 03/08/2006 13:20:05 PAGE 3
118 2 key=0; //清鍵值
119 2 }
120 1 days_of_month=calculate_days(); //計算本月天數(shù)
121 1 switch (status)
122 1 {
123 2 case NORMAL: //平常狀態(tài)
124 2 {
125 3 if(key==KEY_UP) //如果上翻鍵按下,則顯示日期
126 3 {
127 4 display_date=100; //設(shè)置顯示日期的時間
128 4 key=0;
129 4 }
130 3 if(key==KEY_DOWN) //如果下翻鍵按下,則顯示時間
131 3 {
132 4 display_date=0;
133 4 key=0;
134 4 }
135 3 if(display_date) //如果是顯示日期,則計算日期每位
136 3 {
137 4 display_buffer[5]=16+day%10;
138 4 display_buffer[4]=day/10;
139 4 display_buffer[3]=16+month%10;
140 4 display_buffer[2]=month/10;
141 4 display_buffer[1]=16+year%10;
142 4 display_buffer[0]=year/10;
143 4 display_date--; //經(jīng)過一定時間后,自動顯示時間
144 4 }
145 3 else //如果是顯示時間,則計算時間每位
146 3 {
147 4 display_buffer[5]=second%10;
148 4 display_buffer[4]=second/10;
149 4 display_buffer[3]=16+minute%10;
150 4 display_buffer[2]=minute/10;
151 4 display_buffer[1]=16+hour%10;
152 4 display_buffer[0]=hour/10;
153 4 }
154 3 display(display_buffer); //顯示結(jié)果
155 3 break;
156 3 }
157 2 case SECOND_ADJ: //秒調(diào)整狀態(tài)
158 2 {
159 3 if(key==KEY_UP) //上翻鍵按下,秒增加1
160 3 {
161 4 display_on=1; //開顯示,調(diào)整時能看清楚
162 4 second++;
163 4 if(second>=60)second=0; //如果秒到60,則清0
164 4 key=0;
165 4 }
166 3 if(key==KEY_DOWN) //下翻鍵按下,秒減1
167 3 {
168 4 display_on=1;
169 4 second--;
170 4 if(second>=60)second=59;
171 4 key=0;
172 4 }
173 3 display_buffer[5]=second%10; //計算每位值
174 3 display_buffer[4]=second/10;
175 3 display_buffer[3]=16+minute%10;
176 3 display_buffer[2]=minute/10;
177 3 display_buffer[1]=16+hour%10;
178 3 display_buffer[0]=hour/10;
179 3 if(!display_on) //如果關(guān)顯示
C51 COMPILER V7.06 TIMER 03/08/2006 13:20:05 PAGE 4
180 3 {
181 4 flicker_time++; //閃爍計時加1
182 4 if(flicker_time>20){flicker_time=0;display_on=1;} //如果閃爍計時到20,開顯示
183 4 display_buffer[5]=DISPLAY_OFF;
184 4 display_buffer[4]=DISPLAY_OFF;
185 4 }
186 3 else //如果開顯示
187 3 {
188 4 flicker_time++; //閃爍計時加1
189 4 if(flicker_time>30){flicker_time=0;display_on=0;} //如果閃爍計時到20,關(guān)顯示
190 4 }
191 3 display(display_buffer);
192 3 break;
193 3 }
194 2 case MINUTE_ADJ: //分調(diào)整狀態(tài)
195 2 {
196 3 if(key==KEY_UP)
197 3 {
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -