📄 calculator.lst
字号:
C51 COMPILER V6.23a CALCULATOR 05/09/2008 20:15:25 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE CALCULATOR
OBJECT MODULE PLACED IN calculator.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE calculator.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /******************************************************************************************************
2 ******************************************************************************************************/
3 #include<reg51.h>
4 #define uchar unsigned char
5 #define uint unsigned int
6 #define ulong unsigned long
7
8 uchar keyVal=0; //读取的键盘值
9 uint lOpD=0; //左操作数
10 uint rOpD=0; //右操作数
11 ulong res=0; //计算结果
12 /*uchar code table0[16]={
13 0x48,0x84,0x44,0x24, // 0 1 2 3
14 0x82,0x42,0x22,0x81, // 4 5 6 7
15 0x41,0x21,0x18,0x14, // 8 9 + -
16 0x12,0x11,0x88,0x28 // * / C =
17 };*/
18 uchar code table1[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //LED段码
19 uchar getKey(ulong d);
20 void display(ulong d);
21 void delay(uchar t);
22
23 //====================================================================================================
24 //====================================================================================================
25 void main()
26 {
27 1 uchar op1,op2,count=0,key=0;
28 1 while(1)
29 1 {
30 2 key=0;
31 2 count=0;
32 2 L: while(key<10) //获取左操作数
33 2 {
34 3
35 3 display(res);
36 3 key=getKey(lOpD);
37 3 if(count==0&&key>=10) //第一次按键是操作符时继续
38 3 {
39 4 lOpD=0;
40 4 key=0;
41 4 }
42 3 count++;
43 3 if(key<10)
44 3 {
45 4 lOpD=lOpD*10+key;
46 4 display(lOpD);
47 4 }
48 3
49 3 if(key==14||lOpD>=65535) //若按下 ON/C 键或溢出全部清0重来
50 3 {
51 4 lOpD=0;
52 4 key=0;
53 4 }
54 3 if(key==15) //若按下 = 继续读左操作数
55 3 key=0;
C51 COMPILER V6.23a CALCULATOR 05/09/2008 20:15:25 PAGE 2
56 3 }
57 2 op1=key; //保存操作符
58 2 key=0;
59 2
60 2 R: while(key<10) //获取右操作数
61 2 {
62 3 key=getKey(rOpD);
63 3 display(rOpD);
64 3 if(key<10)
65 3 {
66 4 rOpD=rOpD*10+key;
67 4 display(rOpD);
68 4 }
69 3 if(key==14||lOpD>=65535) //若按下 ON/C 键或溢出全部清0重来
70 3 {
71 4 lOpD=0;
72 4 rOpD=0;
73 4 key=0;
74 4 goto L;
75 4 }
76 3 }
77 2 op2=key;
78 2 switch(op1)
79 2 {
80 3 case 10:res=lOpD+rOpD;break; //
81 3 case 11:res=lOpD-rOpD;break; //
82 3 case 12:res=lOpD*rOpD;break; //
83 3 case 13:res=lOpD/rOpD;break; //
84 3 default:res=0;break;
85 3 }
86 2 if(res>999999) //结果溢出
87 2 {
88 3 lOpD=0;
89 3 rOpD=0;
90 3 res=0;
91 3 key=0;
92 3 P3=0xFF;
93 3 }
94 2 display(res);
95 2 if(op2>=10&&op2<=13)
96 2 {
97 3 op1=op2;
98 3 lOpD=res;
99 3 key=0;
100 3 goto R;
101 3 }
102 2 P0=0xF0;
103 2 while(P0==0xF0)
104 2 {
105 3 display(res);
106 3 P0=0xF0;
107 3 };
108 2 key=getKey(res);
109 2 if(14==key)
110 2 {
111 3 lOpD=0;
112 3 rOpD=0;
113 3 res=0;
114 3 key=0;
115 3 //P3=0x00;
116 3 display(0);
117 3 }
C51 COMPILER V6.23a CALCULATOR 05/09/2008 20:15:25 PAGE 3
118 2 }
119 1 }
120
121 //====================================================================================================
122 //====================================================================================================
123 uchar getKey(ulong d)
124 {
125 1 uchar temp=0;
126 1 uchar low=0x0F;
127 1 uchar row=0;
128 1 uchar col=0;
129 1 uchar key=0;
130 1 uchar i=0,move;
131 1 P3=0x00;
132 1 S: P0=0x0F;
133 1 temp=P0&0x0F;
134 1 while(temp==0xF)
135 1 {
136 2 P0=0x0F;
137 2 temp=P0&0x0F;
138 2 display(d);
139 2 };
140 1 delay(20);
141 1 P0=0x0F;
142 1 temp=P0&0x0F;
143 1 if(temp==0x0F)
144 1 goto S;
145 1 temp=0x0F&temp;
146 1 switch(temp)
147 1 {
148 2 case 0x0E:row=0;break;
149 2 case 0x0D:row=1;break;
150 2 case 0x0B:row=2;break;
151 2 case 0x07:row=3;break;
152 2 default:row=0;break;
153 2 }
154 1 move=0xF0;
155 1 for(i=0;i<4;i++)
156 1 {
157 2 move<<=1;
158 2 P0=move|0x0F;
159 2 temp=P0&0x0F;
160 2 if(temp!=0x0F)
161 2 {
162 3 col=3-i;
163 3 break;
164 3 }
165 2 }
166 1 key=row*4+col;
167 1 P0=0x0F;
168 1 temp=P0&0x0F;
169 1 while(temp!=0xF)
170 1 {
171 2 display(d);
172 2 P0=0x0F;
173 2 temp=P0&0x0F;
174 2 }; //wait for key up
175 1 return key;
176 1 }
177
178 //====================================================================================================
179 //====================================================================================================
C51 COMPILER V6.23a CALCULATOR 05/09/2008 20:15:25 PAGE 4
180 void display(ulong d)
181 {
182 1 uchar out[6]={0,0,0,0,0,0};
183 1 uchar temp,i,j,k;
184 1 ulong t=100000;
185 1 ulong b=d;
186 1 uchar count=5,move=0;
187 1 for(i=0;i<6;i++)
188 1 {
189 2 temp=b/t;
190 2 b=b%t;
191 2 t/=10;
192 2 out[i]=table1[temp];
193 2 if(count==5&&temp!=0)
194 2 count=i;
195 2 }
196 1 for(j=0;j<20;j++)
197 1 {
198 2 move=0x80;
199 2 for(k=5;k>=count;k--)
200 2 {
201 3 P3=move;
202 3 P2=out[k];
203 3 move>>=1;
204 3 delay(1);
205 3 }
206 2 }
207 1
208 1 }
209 //====================================================================================================
210 //====================================================================================================
211 void delay(uchar t) //1ms*t
212 {
213 1 uchar i,j;
214 1 for(i=0;i<t;i++)
215 1 {
216 2 for(j=0;j<121;j++);
217 2 }
218 1 }
219 //====================================================================================================
220 //====================================================================================================
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 911 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 38
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 + -