📄 calculator_1.lst
字号:
C51 COMPILER V8.02 CALCULATOR_1 12/08/2008 15:19:11 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE CALCULATOR_1
OBJECT MODULE PLACED IN calculator_1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE calculator_1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /***********计算器************/
2 /*****可处理小数的乘法运算****/
3 /**数码管动态显示六位数字*****/
4 /**P0段选P1位选P2矩阵键盘(4*4)*/
5 /*********0 1 2 3*************/
6 /*********4 5 6 7*************/
7 /*********8 9 .clr************/
8 /*********+ - * =*************/
9 #include<reg52.h>
10 #include<intrins.h>
11 #define uchar unsigned char
12 #define uint unsigned int
13
14 uchar code wordcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
15 0x07,0x7f,0x6f,0x71};
16
17 long int weiq[]={1,10,100,1000,10000,100000}; //位权
18 float weiqp[]={0.1,0.01,0.001,0.0001,0.00001,0.0000001};
19 uchar duan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
20 uchar a[6];
21 uchar b[6];
22 uchar c[6];
23
24 uchar disi; //显示标志在中断显示正使用记录显示到哪一位
25 float af,bf,cf; //参加运算的浮点数
26
27 char key; //键值
28 char abs; //a,b,s的标志
29 char addsub; //加减运算标志1加 2减 3乘
30 uchar apoint,bpoint,cpoint; // 小数点的位置1-6 1表示有一位整数 6表示6位整数 没有小数
31 uchar adeepth,bdeepth,cdeepth; //数组深度可以理解为要显示的位数
32
33 /******延时******/
34 void delay(uchar xms)
35 {
36 1 uint i,j;
37 1 for(i=xms*10;i>0;i--)
38 1 for(j=20;j>0;j--);
39 1 }
40
41 /******键盘扫描翻转法******/
42 /********无键按下返回-5****/
43 /******判断是否大于0*******/
44 char keyscan()
45 {
46 1 uchar line=0,row=0,P2temp;
47 1 P2=0xf0;
48 1 P2temp=P2;
49 1 if(P2temp!=0xf0)
50 1 {
51 2 TR0=0;
52 2 delay(10);
53 2 TR0=1;
54 2 if(P2temp!=0xf0)
55 2 {
C51 COMPILER V8.02 CALCULATOR_1 12/08/2008 15:19:11 PAGE 2
56 3 switch(P2temp)
57 3 {
58 4 case 0x70:row=1;break;
59 4 case 0xb0:row=2;break;
60 4 case 0xd0:row=3;break;
61 4 case 0xe0:row=4;break;
62 4 }
63 3 }
64 2 P2=0x0f;
65 2 P2temp=P2;
66 2 switch(P2temp)
67 2 {
68 3 case 0x07:line=1;break;
69 3 case 0x0b:line=2;break;
70 3 case 0x0d:line=3;break;
71 3 case 0x0e:line=4;break;
72 3 }
73 2 }
74 1 return((row-1)*4+line-1);
75 1 }
76
77
78 /*******将数组的六个数转换成一个浮点数********/
79 float convent(uchar *array,uchar point,uchar deepth)
80 {
81 1 uchar i;
82 1 float temp=0;
83 1 for(i=0;i<point;i++) //计算整数部分
84 1 {
85 2 temp=temp+array[i]*weiq[point-1-i];
86 2 }
87 1 for(i=0;i<deepth-point;i++)
88 1 { //计算小数部分
89 2 temp=temp+array[point+i]*weiqp[i];
90 2 }
91 1 return(temp);
92 1 }
93 /******获得结果的小数点位置******/
94 void getcpoint()
95 {
96 1 if(cf>0&&cf<10)cpoint=1;
97 1 else if (cf>=10&&cf<100)cpoint=2;
98 1 else if (cf>=100&&cf<1000)cpoint=3;
99 1 else if (cf>=1000&&cf<10000)cpoint=4;
100 1 else if (cf>=10000&&cf<100000)cpoint=5;
101 1 else if (cf>=100000&&cf<1000000)cpoint=6;
102 1
103 1 }
104
105 /********分离每位数用于显示********/
106 void cut()
107 {
108 1 uchar i;
109 1 long int cut ;
110 1 cdeepth=6;
111 1 cut=cf*weiq[6-cpoint]; // 先乘一系数取六位整数
112 1 c[0]=cut/weiq[5]; //最高位
113 1 for(i=1;i<6;i++)
114 1 {
115 2 c[i]=(cut%weiq[6-i])/weiq[5-i];
116 2 }
117 1 if(c[5]==0)
C51 COMPILER V8.02 CALCULATOR_1 12/08/2008 15:19:11 PAGE 3
118 1 {
119 2 cdeepth=5;
120 2 if(c[4]==0)
121 2 {
122 3 cdeepth=4;
123 3 if(c[3]==0)
124 3 {
125 4 cdeepth=3;
126 4 if(c[2]==0)
127 4 {
128 5 cdeepth=2;
129 5 if(c[1]==0)
130 5 {
131 6 cdeepth=1;
132 6 if(c[0]==0)
133 6 cdeepth=0;
134 6 }
135 5 }
136 4 }
137 3 }
138 2 }
139 1 }
140
141 /**********运算**********/
142 void opreat()
143 {
144 1 af=convent(a,apoint,adeepth); //计算出浮点数
145 1 bf=convent(b,bpoint,bdeepth);
146 1 if(addsub==1)
147 1 cf=af+bf;
148 1 if(addsub==2)
149 1 cf=af-bf;
150 1 if(addsub==3)
151 1 cf=af*bf;
152 1 getcpoint();
153 1 cut();
154 1 }
155
156
157 void init()
158 {
159 1 uchar i;
160 1 TMOD=0x01; //定时器0 工作方式1
161 1 TH0=0xf8;
162 1 TL0=0xcc; //2ms
163 1 EA=1;
164 1 ET0=1;
165 1 TR0=1;
166 1 for(i=0;i<6;i++)
167 1 {
168 2 a[i]=0;
169 2 b[i]=0;
170 2 c[i]=0;
171 2 }
172 1 apoint=0;
173 1 bpoint=0;
174 1 cpoint=0;
175 1 adeepth=0;
176 1 bdeepth=0;
177 1 cdeepth=0;
178 1 addsub=0;
179 1 abs=0;
C51 COMPILER V8.02 CALCULATOR_1 12/08/2008 15:19:11 PAGE 4
180 1 // disi=0;
181 1 }
182 main()
183 {
184 1 char P2temp;
185 1 init();
186 1 while(1)
187 1 {
188 2 key=keyscan();
189 2 do
190 2 {
191 3 P2=0xf0;
192 3 P2temp=P2;
193 3 }
194 2 while((P2temp&0xf0)!=0xf0);
195 2
196 2 if(key<=9&&key>=0)
197 2 {
198 3 if(abs==0&&adeepth<=6) //六位数未满 接收数
199 3 {
200 4 if(adeepth==0&&key==0)
201 4 {
202 5 apoint=1;
203 5 adeepth=1;
204 5 }
205 4 else
206 4 { //将数存到a
207 5 a[adeepth]=key;
208 5 adeepth++;
209 5 }
210 4 }
211 3 if(abs==1&&bdeepth<=6) //将数传到b
212 3 {
213 4 if(bdeepth==0&&key==0)
214 4 {
215 5 bpoint=1;
216 5 bdeepth=1;
217 5 }
218 4 else
219 4 {
220 5 b[bdeepth]=key;
221 5 bdeepth++;
222 5 }
223 4 }
224 3
225 3 }
226 2 if(key==10)
227 2 { //小数点 记录小数点的位置
228 3 if(abs==1&&bpoint==0)bpoint=bdeepth;
229 3 if(abs==0&&apoint==0)apoint=adeepth;
230 3 }
231 2 if(key==12&&abs==0)
232 2 {
233 3 abs=1; //加号
234 3 addsub=1; //加减标志 1加2 减
235 3 }
236 2 if(key==13&&abs==0)
237 2 {
238 3 abs=1; //减
239 3 addsub=2;
240 3 }
241 2 if(key==14&&abs==0)
C51 COMPILER V8.02 CALCULATOR_1 12/08/2008 15:19:11 PAGE 5
242 2 {
243 3 abs=1; //减
244 3 addsub=3;
245 3 }
246 2 if(key==15&&abs==1)
247 2 {
248 3 if(apoint==0)apoint=adeepth;
249 3 if(bpoint==0)bpoint=bdeepth;
250 3 opreat();
251 3 abs=2;
252 3 }
253 2 if(key==11)init();
254 2 }
255 1 }
256
257 void display() interrupt 1
258 {
259 1 TH0=0xF8;
260 1 TL0=0xcc;
261 1 if(abs==0)
262 1 {
263 2 if(disi!=adeepth)
264 2 {
265 3 P1=duan[adeepth-disi-1];
266 3 if((apoint!=0)&&(disi==apoint-1)) //有小数点
267 3 P0=wordcode[a[disi]]|0x80;
268 3 else
269 3 P0=wordcode[a[disi]];
270 3 disi++;
271 3 }
272 2 else disi=0;
273 2 }
274 1 if(abs==1)
275 1 {
276 2 if(disi!=bdeepth)
277 2 {
278 3 P1=duan[bdeepth-disi-1];
279 3 if((bpoint!=0)&&(disi==bpoint-1)) //有小数点
280 3 P0=wordcode[b[disi]]|0x80;
281 3 else
282 3 P0=wordcode[b[disi]];
283 3 disi++;
284 3 }
285 2 else disi=0;
286 2 }
287 1 if(abs==2)
288 1 {
289 2 if(disi!=cdeepth)
290 2 {
291 3 P1=duan[cdeepth-disi-1];
292 3 if((cpoint!=0)&&(disi==cpoint-1)) //有小数点
293 3 P0=wordcode[c[disi]]|0x80;
294 3 else
295 3 P0=wordcode[c[disi]];
296 3 disi++;
297 3 }
298 2 else disi=0;
299 2 }
300 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
C51 COMPILER V8.02 CALCULATOR_1 12/08/2008 15:19:11 PAGE 6
CODE SIZE = 1467 ----
CONSTANT SIZE = 11 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 94 18
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 + -