📄 calculator.lst
字号:
C51 COMPILER V6.23a CALCULATOR 03/16/2006 12:22:41 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE CALCULATOR
OBJECT MODULE PLACED IN Calculator.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Calculator.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<AT89X52.h>//仅完成个位的四则运算,并可以处理负数结果
2 signed char code a[]={0x3f,0x06,0x5b,0x4f,0x66 ,0x6d ,0x7d ,0x07 ,0x7f ,0x6f,0x00,0x40};
3 unsigned char code tv[]={0xfe,0xfd,0xfb,0xf7};
4 signed int data led[4];
5 signed int data tvdata=0;
6 signed int n=0;//输入状态变量
7 signed int s=0;//存输入值
8 signed int t=0;//计算状态参量
9 signed int x=0;//存第一个数
10 signed int y=0;//存第二个数
11 signed int z=0;//输出结果
12
13 void delay(void)
14 {
15 1 unsigned int i;
16 1 for(i=0;i<100;i++);
17 1 }
18
19 kp_scan()//获取键盘值
20 {
21 1 unsigned char i,j;
22 1 P1=0xff;
23 1 P1=0x0f;
24 1 i=P1;
25 1 P1=0xff;
26 1 P1=0xf0;
27 1 j=P1;
28 1 return(i+j);
29 1 }
30
31 led_show()
32 {
33 1 signed int i,k,m;
34 1 if(tvdata>=0&&tvdata<999)//正数显示
35 1 {
36 2 led[0]=10;//正数时符号位为空
37 2 led[1]=tvdata/100;//取百位
38 2 led[2]=tvdata%100/10;//取十位
39 2 led[3]=tvdata%10;//取个位
40 2
41 2 for(k=0;k<4;k++)
42 2 {
43 3 i=led[k];
44 3 P0=a[i];
45 3 i=led[k];
46 3 P2=tv[k];
47 3 delay();
48 3 }
49 2 }
50 1 if(tvdata<0&&tvdata>-999)//负数显示
51 1 {
52 2 m=tvdata;
53 2 m=-m;
54 2 led[0]=11;//显示负号
55 2 led[1]=m/100;//取百位
C51 COMPILER V6.23a CALCULATOR 03/16/2006 12:22:41 PAGE 2
56 2 led[2]=m%100/10;//取十位
57 2 led[3]=m%10;//取个位
58 2
59 2 for(k=0;k<4;k++)
60 2 {
61 3 i=led[k];
62 3 P0=a[i];
63 3 i=led[k];
64 3 P2=tv[k];
65 3 delay();
66 3 }
67 2 }
68 1 }
69
70 result(t,y,x)
71 {
72 1 signed int z;
73 1 if(t==1)//加法
74 1 {
75 2 z=x+y;
76 2 }
77 1 if(t==2)//减法
78 1 {
79 2 z=x-y;
80 2 }
81 1 if(t==3)//乘法
82 1 {
83 2 z=x*y;
84 2 }
85 1 if(t==4&&y!=0)//除法
86 1 {
87 2 z=x/y;
88 2 }
89 1 else if(t==4&&y==0)//除0错误
90 1 {
91 2 z=999;//超出显示数值范围
92 2 }
93 1 else
94 1 {
95 2 ;
96 2 }
97 1 return(z);
98 1 }
99
100
101 main()
102 {
103 1
104 1 while(1)
105 1 {
106 2 tvdata=kp_scan();
107 2 if(tvdata!=0xff)//保持显示数值
108 2 {
109 3 s=tvdata;
110 3 }
111 2 switch(tvdata)
112 2 {
113 3 case 0xd7:{tvdata=0;s=0;y=s;}break;
114 3 case 0xeb:{tvdata=1;s=1;y=s;}break;
115 3 case 0xdb:{tvdata=2;s=2;y=s;}break;
116 3 case 0xbb:{tvdata=3;s=3;y=s;}break;
117 3 case 0xed:{tvdata=4;s=4;y=s;}break;
C51 COMPILER V6.23a CALCULATOR 03/16/2006 12:22:41 PAGE 3
118 3 case 0xdd:{tvdata=5;s=5;y=s;}break;
119 3 case 0xbd:{tvdata=6;s=6;y=s;}break;
120 3 case 0xee:{tvdata=7;s=7;y=s;}break;
121 3 case 0xde:{tvdata=8;s=8;y=s;}break;
122 3 case 0xbe:{tvdata=9;s=9;y=s;}break;
123 3 case 0xe7:{tvdata=0;s=0;y=0;z=0;}break;//ON/C键
124 3 case 0x77:{s=0;x=y;t=1;}break;//加法键
125 3 case 0x7b:{s=0;x=y;t=2;}break;//减法键
126 3 case 0x7d:{s=0;x=y;t=3;}break;//乘法键
127 3 case 0x7e:{s=0;x=y;t=4;}break;//除法键
128 3 case 0xb7:{s=result(t,y,x);}break;//等于键
129 3 default: ;
130 3 }
131 2 tvdata=s;
132 2 led_show();
133 2 }
134 1 }
135
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 757 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 6
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 + -