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