?? 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 + -