📄 calc.lst
字号:
C51 COMPILER V7.07 CALC 10/23/2007 21:19:49 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE CALC
OBJECT MODULE PLACED IN calc.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE calc.c DEBUG OBJECTEXTEND
stmt level source
1 #include"calc.h"
2
3
4 void main(void)
5 {
6 1 init(); //键盘定时扫描初始化
7 1 status=0;
8 1 display(0);
9 1 //getkey();
10 1 while(1)
11 1 {
12 2 Refresh(ledbuf);
13 2 }
14 1 }
15
16 void display(signed long x)
17 {
18 1 signed long data t;
19 1 unsigned long data tc;
20 1 int data i,p,tp;
21 1 int fst=0;
22 1 for(i=0;i<MAX_DISPLAY_CHAR;i++)
23 1 {
24 2 ledbuf[i]=0xff;
25 2 }
26 1 t=x;
27 1 if(x>=100000000||x<=-10000000){return;}//整数溢出
28 1 else if(x>=10000000||x<=-1000000){i=8;}
29 1 else if(x>=1000000||x<=-100000){i=7;}
30 1 else if(x>=100000||x<=-10000){i=6;}
31 1 else if(x>=10000||x<=-1000){i=5;}
32 1 else if(x>=1000||x<=-100){i=4;}
33 1 else if(x>=100||x<=-10){i=3;}
34 1 else if(x>=10||x<0){i=2;}
35 1 else{i=1;}
36 1
37 1 if(x<0)
38 1 {
39 2 ledbuf[--i]=0x2d;//负号处理
40 2 t*=-1;
41 2 }
42 1
43 1 for(p=i-1;p>=0;p--)
44 1 {
45 2 tc=1;
46 2 for(tp=p;tp>0;tp--) tc*=10;
47 2 ledbuf[p]=t/tc;
48 2 t=t-(ledbuf[p]*tc);
49 2 }
50 1 for(i=MAX_DISPLAY_CHAR-1;i>=0;i--)
51 1 {
52 2 if(fst!=0||ledbuf[i]!=0||i==0)
53 2 {
54 3 ledbuf[i]=value2led(ledbuf[i]);
55 3 fst=1;
C51 COMPILER V7.07 CALC 10/23/2007 21:19:49 PAGE 2
56 3 }
57 2 else
58 2 {
59 3 ledbuf[i]=0xff;
60 3 }
61 2 }
62 1 return;
63 1 }
64
65 char value2led(char ch)
66 {
67 1 switch(ch)
68 1 {
69 2 case 0x00: return 0xc0;
70 2 case 0x01: return 0xf9;
71 2 case 0x02: return 0xa4;
72 2 case 0x03: return 0xb0;
73 2 case 0x04: return 0x99;
74 2 case 0x05: return 0x92;
75 2 case 0x06: return 0x82;
76 2 case 0x07: return 0xf8;
77 2 case 0x08: return 0x80;
78 2 case 0x09: return 0x90;
79 2 case 0x2d: return 0xbf;
80 2 }
81 1 }
82
83 void getkey (void) interrupt 1 using 0
84 //定时扫描键盘
85 {
86 1 char data mykey;
87 1 mykey = input();
88 1 if(mykey==0)
89 1 {
90 2 return;
91 2 }
92 1 else
93 1 {
94 2 calc(mykey);
95 2 }
96 1 return;
97 1 }
98
99 void calc(char cur)
100 {
101 1 if(cur=='0')cur=0;
102 1 if(cur>=0x00&&cur<=0x09)
103 1 digits(cur);
104 1 else
105 1 operator(cur);
106 1 return;
107 1 }
108 void digits(char dt)
109 {
110 1 if(status==0)
111 1 {
112 2 if(lvalue>=10000000) return;
113 2 lvalue*=10;
114 2 lvalue+=dt;
115 2 display(lvalue);
116 2 }
117 1 else if(status==1)
C51 COMPILER V7.07 CALC 10/23/2007 21:19:49 PAGE 3
118 1 {
119 2 if(rvalue>=10000000) return;
120 2 rvalue*=10;
121 2 rvalue+=dt;
122 2 display(rvalue);
123 2 }
124 1 return;
125 1 }
126 void operator(char op)
127 {
128 1 status++;
129 1 switch(op)
130 1 {
131 2 case '+':
132 2 case '-':
133 2 case '*':
134 2 case '/':
135 2 if(status==1||status==0)
136 2 {
137 3 lasttoken=op;
138 3 }
139 2 else if(status==2)
140 2 {
141 3 deal();
142 3 }
143 2 status=1;
144 2 break;
145 2 case '=':
146 2 if(lasttoken==0) return;
147 2 deal();
148 2 status=0;
149 2 break;
150 2 case 'C':
151 2 lasttoken=op;
152 2 deal();
153 2 status=0;
154 2 break;
155 2 case 'S':
156 2 lasttoken=op;
157 2 deal();
158 2 status=0;
159 2 }
160 1 return;
161 1 }
162
163 void deal()
164 {
165 1 long result=0;
166 1 long num;
167 1 switch(lasttoken)
168 1 {
169 2 case '+':
170 2 result=lvalue+rvalue;
171 2 break;
172 2 case '-':
173 2 result=lvalue-rvalue;
174 2 break;
175 2 case '*':
176 2 result=lvalue*rvalue;
177 2 break;
178 2 case '/':
179 2 if(rvalue==0) return;
C51 COMPILER V7.07 CALC 10/23/2007 21:19:49 PAGE 4
180 2 result=lvalue/rvalue;
181 2 break;
182 2 case 'C':
183 2 lasttoken=0;
184 2 break;
185 2 case 'S':
186 2 if(status==2&&rvalue!=0) num=rvalue;
187 2 else num=lvalue;
188 2 result=square((double)num);
189 2 lasttoken=0;
190 2 break;
191 2 }
192 1 if(result>=100000000)result=0;
193 1 lvalue=result;
194 1 display(lvalue);
195 1 rvalue=0;
196 1 return;
197 1 }
198 long absc(long dt)
199 {
200 1 if(dt>=0) return dt;
201 1 else return dt*(-1);
202 1 }
203
204 int square(double dt)
205 {
206 1 double result;
207 1 result=dt/2;
208 1 while (absc(result*result-dt)>1)
209 1 result=(result+dt/result)/2;
210 1 return result;
211 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1607 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 18 41
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 + -