📄 digitalclock.lst
字号:
C51 COMPILER V7.08 DIGITALCLOCK 02/13/2006 15:17:11 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE DIGITALCLOCK
OBJECT MODULE PLACED IN DigitalClock.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE DigitalClock.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2
3 ********************************************************************************
4 * 描述: *
5 * 简易电子时钟,LED数码管显示 *
6 * K1---时调整 *
7 * K2---分调整 *
8 * *
9 * 上电时初始化显示: 12-00-00 *
10 * *
11 * * **** **** **** **** **** *
12 * * * * * * * * * * * *
13 * * * * * * * * * * * *
14 * * **** ****** * * * * ****** * * * * *
15 * * * * * * * * * * * *
16 * * * * * * * * * * * *
17 * * **** **** **** **** **** *
18 * *
19 * *
20
21 *******************************************************************************/
22
23 #include <reg51.h>
24 #include <intrins.h>
25
26 unsigned char data dis_digit;
27 unsigned char key_s, key_v;
28
29 unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
30 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
31 unsigned char data dis_buf[8];
32 unsigned char data dis_index;
33 unsigned char hour,min,sec;
34 unsigned char sec100;
35
36 sbit K1 = P3^6;
37 sbit K2 = P3^7;
38
39 bit scan_key();
40 void proc_key();
41 void inc_sec();
42 void inc_min();
43 void inc_hour();
44 void display();
45 void delayms(unsigned char ms);
46
47 void main(void)
48 {
49 1 P0 = 0xff;
50 1 P2 = 0xff;
51 1 TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式
52 1 TH1 = 0xdc;
53 1 TL1 = 0;
54 1
55 1 TH0 = 0xFC;
C51 COMPILER V7.08 DIGITALCLOCK 02/13/2006 15:17:11 PAGE 2
56 1 TL0 = 0x17;
57 1
58 1 hour = 12;
59 1 min = 00;
60 1 sec = 00;
61 1
62 1 sec100 = 0;
63 1
64 1 dis_buf[0] = dis_code[hour / 10]; // 时十位
65 1 dis_buf[1] = dis_code[hour % 10]; // 时个位
66 1 dis_buf[3] = dis_code[min / 10]; // 分十位
67 1 dis_buf[4] = dis_code[min % 10]; // 分个位
68 1 dis_buf[6] = dis_code[sec / 10]; // 秒十位
69 1 dis_buf[7] = dis_code[sec % 10]; // 秒个位
70 1 dis_buf[2] = 0xbf; // 显示"-"
71 1 dis_buf[5] = 0xbf; // 显示"-"
72 1
73 1 dis_digit = 0xfe;
74 1 dis_index = 0;
75 1
76 1 TCON = 0x01;
77 1 IE = 0x8a; // 使能timer0,1 中断
78 1
79 1 TR0 = 1;
80 1 TR1 = 1;
81 1
82 1 key_v = 0x03;
83 1
84 1 while(1)
85 1 {
86 2 if(scan_key())
87 2 {
88 3 delayms(10);
89 3 if(scan_key())
90 3 {
91 4 key_v = key_s;
92 4 proc_key();
93 4 }
94 3 }
95 2
96 2 }
97 1 }
98
99 bit scan_key()
100 {
101 1 key_s = 0x00;
102 1 key_s |= K2;
103 1 key_s <<= 1;
104 1 key_s |= K1;
105 1 return(key_s ^ key_v);
106 1 }
107
108 void proc_key()
109 {
110 1 EA = 0;
111 1 if((key_v & 0x01) == 0) // K1
112 1 {
113 2 inc_hour();
114 2 }
115 1 else if((key_v & 0x02) == 0) // K2
116 1 {
117 2 min++;
C51 COMPILER V7.08 DIGITALCLOCK 02/13/2006 15:17:11 PAGE 3
118 2 if(min > 59)
119 2 {
120 3 min = 0;
121 3 }
122 2 dis_buf[3] = dis_code[min / 10]; // 分十位
123 2 dis_buf[4] = dis_code[min % 10]; // 分个位
124 2 }
125 1
126 1 EA = 1;
127 1 }
128
129 void timer0() interrupt 1
130 // 定时器0中断服务程序, 用于数码管的动态扫描
131 // dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
132 // dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
133 // 选通P2.0口数码
134 // dis_buf --- 显于缓冲区基地址
135 {
136 1 TH0 = 0xFC;
137 1 TL0 = 0x17;
138 1
139 1 P2 = 0xff; // 先关闭所有数码管
140 1 P0 = dis_buf[dis_index]; // 显示代码传送到P0口
141 1 P2 = dis_digit; //
142 1
143 1 dis_digit = _crol_(dis_digit,1); // 位选通值左移, 下次中断时选通下一位数码管
144 1 dis_index++; //
145 1
146 1 dis_index &= 0x07; // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
147 1 }
148
149 void timer1() interrupt 3
150 {
151 1 TH1 = 0xdc;
152 1
153 1 sec100++;
154 1
155 1 if(sec100 >= 100)
156 1 {
157 2 sec100 = 0;
158 2 inc_sec();
159 2 }
160 1 }
161
162 void inc_sec()
163 {
164 1 sec++;
165 1 if(sec > 59)
166 1 {
167 2 sec = 0;
168 2 inc_min();
169 2 }
170 1 dis_buf[6] = dis_code[sec / 10]; // 秒十位
171 1 dis_buf[7] = dis_code[sec % 10]; // 秒个位
172 1 }
173
174 void inc_min()
175 {
176 1 min++;
177 1 if(min > 59)
178 1 {
179 2 min = 0;
C51 COMPILER V7.08 DIGITALCLOCK 02/13/2006 15:17:11 PAGE 4
180 2 inc_hour();
181 2 }
182 1 dis_buf[3] = dis_code[min / 10]; // 分十位
183 1 dis_buf[4] = dis_code[min % 10]; // 分个位
184 1 }
185
186 void inc_hour()
187 {
188 1 hour++;
189 1 if(hour > 23)
190 1 {
191 2 hour = 0;
192 2 }
193 1 if(hour > 9)
194 1 dis_buf[0] = dis_code[hour / 10]; // 时十位
195 1 else
196 1 dis_buf[0] = 0xff; // 当小时的十位为0时不显示
197 1 dis_buf[1] = dis_code[hour % 10]; // 时个位
198 1
199 1 }
200
201
202 void delayms(unsigned char ms)
203 // 延时子程序
204 {
205 1 unsigned char i;
206 1 while(ms--)
207 1 {
208 2 for(i = 0; i < 120; i++);
209 2 }
210 1 }
211
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 502 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 16 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -