📄 calculator.lst
字号:
C51 COMPILER V6.12 CALCULATOR 06/10/2005 15:28:44 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE CALCULATOR
OBJECT MODULE PLACED IN .\calculator.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE .\calculator.c DEBUG OBJECTEXTEND
stmt level source
1 #include <math.h>
2 #include <stdio.h>
3 #include <reg51.h>
4
5 #define TRUE 1
6 #define FALSE 0
7 #define ENRD 0 //读有效
8 #define DISRD 1
9 #define ENWR 0
10 #define DISWR 1
11 #define DELAY_VALUE 3
12
13 #define PinDrvKey1 P0_0
14 #define PinDrvKey2 P0_1
15 #define PinDrvKey3 P0_2
16 #define PinDrvKey4 P0_3 //键盘扫描的驱动线
17
18 #define PinScanKey1 P0_0
19 #define PinScanKey2 P0_1
20 #define PinScanKey3 P0_2
21 #define PinScanKey4 P0_3 //键盘扫描的信号获取线
22
23 #define LedSelect0 0x01
24 #define LedSelect1 0x02
25 #define LedSelect2 0x04
26 #define LedSelect3 0x08
27 #define LedSelect4 0x10
28 #define LedSelect5 0x20
29 #define LedSelect6 0x40
30 #define LedSelect7 0x80 //led选择位
31
32 #define num0 0x3f //字符0的编码
33 #define num1 0x06
34 #define num2 0x5b
35 #define num3 0x4f
36 #define num4 0x66
37 #define num5 0x6d
38 #define num6 0x7d
39 #define num7 0x07
40 #define num8 0x7f
41 #define num9 0x67 //字符九的编码
42
43 sbit P0_0=P0^0;
44 sbit P0_1=P0^1;
45 sbit P0_2=P0^2;
46 sbit P0_3=P0^3;
47 sbit P0_4=P0^4;
48 sbit P0_5=P0^5;
49 sbit P0_6=P0^6;
50 sbit P0_7=P0^7;
51
52 sbit P1_0=P1^0;
53 sbit P1_1=P1^1;
54 sbit P1_2=P1^2;
55 sbit P1_3=P1^3;
C51 COMPILER V6.12 CALCULATOR 06/10/2005 15:28:44 PAGE 2
56 sbit P1_4=P1^4;
57 sbit P1_5=P1^5;
58 sbit P1_6=P1^6;
59 sbit P1_7=P1^7;
60
61 sbit P2_0=P2^0;
62 sbit P2_1=P2^1;
63 sbit P2_2=P2^2;
64 sbit P2_3=P2^3;
65 sbit P2_4=P2^4;
66 sbit P2_5=P2^5;
67 sbit P2_6=P2^6;
68 sbit P2_7=P2^7;
69
70 char numtochar(char n)
71 { switch(n)
72 1 {case 0:return num0;
73 2 break;
74 2 case 1:return num1;
75 2 break;
76 2 case 2:return num2;
77 2 break;
78 2 case 3:return num3;
79 2 break;
80 2 case 4:return num4;
81 2 break;
82 2 case 5:return num5;
83 2 break;
84 2 case 6:return num6;
85 2 break;
86 2 case 7:return num7;
87 2 break;
88 2 case 8:return num8;
89 2 break;
90 2 case 9:return num9;
91 2 break;
92 2 default:break;
93 2
94 2 }
95 1 }
96
97
98
99 void initial(void); //初始化子程序
100 void delay(short i);
101 void display(unsigned char i,unsigned char num);
102 unsigned char keyscan(void);
103
104 void main(void)
105 { char Li,Ln; //第Li个le显示数字ln;
106 1 long dt1,dt2,temp;
107 1 char op,keyword;
108 1 dt1=0; //dt1为第一操作数
109 1 dt2=0; //dt2为第二操作数
110 1
111 1 initial();
112 1 //键盘驱动信号都设为低
113 1 for(Li=7;Li>=0;Li--)
114 1 {Ln=keyscan();
115 2 display(Li,Ln);
116 2 }
117 1
C51 COMPILER V6.12 CALCULATOR 06/10/2005 15:28:44 PAGE 3
118 1 /* keyword=0;
119 1 do
120 1 {
121 1 keyword=keyscan();
122 1 if(keyword<=9)
123 1 {
124 1 dt2=dt2*10+keyword;
125 1 temp=dt2;
126 1 for(Li=0;Li<=7;Li++)
127 1 {
128 1 Ln=temp%10;
129 1 temp=temp/10;
130 1 display(Li,Ln); //显示输入的数字
131 1 if(temp==0)break;
132 1 }
133 1 }
134 1 else if(keyword<=13)
135 1 { op=keyword-10;
136 1 dt1=dt2;
137 1 dt2=0;
138 1 switch(op)
139 1 {case 0:display(7,0);
140 1 break;
141 1 case 1:display(7,1);
142 1 break;
143 1 case 2:display(7,2);
144 1 break;
145 1 case 3:display(7,3);
146 1 break;
147 1 default:break;
148 1 }
149 1 }
150 1 }while(keyword!=14);
151 1 switch(op)
152 1 {case 0:dt1=dt1+dt2;
153 1 break;
154 1 case 1:dt1=dt1-dt2;
155 1 break;
156 1 case 2:dt1=dt1*dt2;
157 1 break;
158 1 case 3:dt1=dt1/dt2;
159 1 break;
160 1 default:break;
161 1 }
162 1 for(Li=0;Li<=7;Li++)
163 1 {
164 1 Ln=dt1%10;
165 1 dt1=dt1/10;
166 1 display(Li,Ln); //显示结果
167 1 if(dt1==0)break;
168 1 }
169 1 */
170 1 }
*** WARNING C280 IN LINE 106 OF .\CALCULATOR.C: 'temp': unreferenced local variable
*** WARNING C280 IN LINE 107 OF .\CALCULATOR.C: 'op': unreferenced local variable
*** WARNING C280 IN LINE 107 OF .\CALCULATOR.C: 'keyword': unreferenced local variable
171
172
173 void initial(void)
174 { WR=ENWR;
175 1 P2=0x80;
176 1 P0=0xff;
C51 COMPILER V6.12 CALCULATOR 06/10/2005 15:28:44 PAGE 4
177 1 P2=0x90;
178 1 P0=0x00; //键盘驱动信号都设为低
179 1 WR=DISWR;
180 1 }
181
182 unsigned char keyscan()
183 {
184 1 char kword=0;
185 1 P0=0x00;
186 1 P2=0x80;
187 1 while(1)
188 1 {
189 2 RD=DISRD;
190 2 WR=ENWR;
191 2 PinDrvKey1=TRUE;
192 2 WR=DISWR;
193 2 RD=ENRD;
194 2
195 2 if(PinScanKey1==TRUE)
196 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
197 2 if(PinScanKey1==TRUE)
198 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
199 3 if(PinScanKey1==TRUE)
200 3 kword=1;
201 3 break;} //确认确实有按键信号,返回键值
202 2 if(PinScanKey2==TRUE)
203 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
204 2 if(PinScanKey2==TRUE)
205 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
206 3 if(PinScanKey2==TRUE)
207 3 kword=2;break;} //确认确实有按键信号,返回键值
208 2 if(PinScanKey3==TRUE)
209 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
210 2 if(PinScanKey3==TRUE)
211 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
212 3 if(PinScanKey3==TRUE)
213 3 kword=3;break;} //确认确实有按键信号,返回键值
214 2 if(PinScanKey4==TRUE)
215 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
216 2 if(PinScanKey2==TRUE)
217 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
218 3 if(PinScanKey2==TRUE)
219 3 kword=10;break;} //确认确实有按键信号,返回键值
220 2 //以上语句扫描第一列
221 2
222 2
223 2 RD=DISRD;
224 2 WR=ENWR;
225 2 PinDrvKey1=FALSE;
226 2 PinDrvKey2=TRUE;
227 2 WR=DISWR;
228 2 RD=ENRD;
229 2
230 2 if(PinScanKey1==TRUE)
231 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
232 2 if(PinScanKey1==TRUE)
233 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
234 3 if(PinScanKey1==TRUE)
235 3 kword=4;break;} //确认确实有按键信号,返回键值
236 2 if(PinScanKey2==TRUE)
237 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
238 2 if(PinScanKey2==TRUE)
C51 COMPILER V6.12 CALCULATOR 06/10/2005 15:28:44 PAGE 5
239 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
240 3 if(PinScanKey2==TRUE)
241 3 kword=5;break;} //确认确实有按键信号,返回键值
242 2 if(PinScanKey3==TRUE)
243 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
244 2 if(PinScanKey3==TRUE)
245 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
246 3 if(PinScanKey3==TRUE)
247 3 kword=6;break;} //确认确实有按键信号,返回键值
248 2 if(PinScanKey4==TRUE)
249 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
250 2 if(PinScanKey4==TRUE)
251 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
252 3 if(PinScanKey4==TRUE)
253 3 kword=11;break;} //确认确实有按键信号,返回键值
254 2 //以上语句扫描第二列
255 2
256 2 RD=DISRD;
257 2 WR=ENWR;
258 2 PinDrvKey2=FALSE;
259 2 PinDrvKey3=TRUE;
260 2 WR=DISWR;
261 2 RD=ENRD;
262 2
263 2 if(PinScanKey1==TRUE)
264 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
265 2 if(PinScanKey1==TRUE)
266 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
267 3 if(PinScanKey1==TRUE)
268 3 kword=7;break;} //确认确实有按键信号,返回键值
269 2 if(PinScanKey2==TRUE)
270 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
271 2 if(PinScanKey2==TRUE)
272 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
273 3 if(PinScanKey2==TRUE)
274 3 kword=8;break;} //确认确实有按键信号,返回键值
275 2 if(PinScanKey3==TRUE)
276 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
277 2 if(PinScanKey3==TRUE)
278 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
279 3 if(PinScanKey3==TRUE)
280 3 kword=9;break;} //确认确实有按键信号,返回键值
281 2 if(PinScanKey4==TRUE)
282 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
283 2 if(PinScanKey4==TRUE)
284 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
285 3 if(PinScanKey4==TRUE)
286 3 kword=12;} //确认确实有按键信号,返回键值
287 2 //以上语句扫描第三列
288 2
289 2 RD=DISRD;
290 2 WR=ENWR;
291 2 PinDrvKey3=FALSE;
292 2 PinDrvKey4=TRUE;
293 2 WR=DISWR;
294 2 RD=ENRD;
295 2
296 2 if(PinScanKey4==TRUE)
297 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
298 2 if(PinScanKey1==TRUE)
299 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
300 3 if(PinScanKey1==TRUE)
C51 COMPILER V6.12 CALCULATOR 06/10/2005 15:28:44 PAGE 6
301 3 kword=0;break;} //确认确实有按键信号,返回键值
302 2 if(PinScanKey2==TRUE)
303 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
304 2 if(PinScanKey2==TRUE)
305 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
306 3 if(PinScanKey2==TRUE)
307 3 kword=14;break;} //确认确实有按键信号,返回键值
308 2 if(PinScanKey3==TRUE)
309 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
310 2 if(PinScanKey3==TRUE)
311 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
312 3 if(PinScanKey3==TRUE)
313 3 kword=14;break;} //确认确实有按键信号,返回键值
314 2 if(PinScanKey4==TRUE)
315 2 delay(DELAY_VALUE); //如果判断有信号,则延时一次
316 2 if(PinScanKey4==TRUE)
317 2 { delay(DELAY_VALUE); //假如判断还有信号,则再延时
318 3 if(PinScanKey4==TRUE)
319 3 kword=13;break;} //假如判断还有信号,则再延时
320 2 //以上语句扫描第四列
321 2
322 2 RD=DISRD;
323 2 WR=ENWR;
324 2 PinDrvKey4=FALSE;
325 2 WR=DISWR;
326 2 RD=ENRD;
327 2 }return kword;
328 1 }
329
330
331
332 void display(unsigned char i,unsigned char num)
333 { WR=FALSE;
334 1 if(num >= 0 && num <=9)
335 1 {switch(i)
336 2 { case 0:P2=0x80;
337 3 P0=LedSelect0;
338 3 P2=0x90;
339 3 P0=numtochar(num);
340 3 //Led0显示nu
341 3 break;
342 3 case 1:P2=0x80;
343 3 P0=LedSelect1;
344 3 P2=0x90;
345 3 P0=numtochar(num);
346 3 //Led1显示nu
347 3 break;
348 3 case 2:P2=0x80;
349 3 P0=LedSelect2;
350 3 P2=0x90;
351 3 P0=numtochar(num);
352 3 //Led2显示nu镜氖
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -