这是自己用一个单片机做的计算器
源代码在线查看: b.lst
C51 COMPILER V8.08 B 03/18/2009 02:33:59 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE B
OBJECT MODULE PLACED IN b.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE b.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2
3 #include
4 #include
5 #include
6 #include
7 #include
8
9 #include
10
11 float f_data;
12 xdata uchar indata[20];
13 xdata uchar out_data[10];
14 code uchar p_float[7]={0x0f,0x17,0x1f,0x27,0x2f,0x37,0x3f};
15 code uchar sign[7]={0x0e,0x16,0x1e,0x26,0x2e,0x36,0x3e};
16 //////////////////////////////////////////////////////////
17
18 ///***************************************************************//
19 //7281
20 //*****************************************************************//
21 void delay(unsigned int dd)
22 {
23 1 unsigned int i;
24 1 for(i=0;i 25 1 return;
26 1 }
27 /***********************接受 符号*********************************************/
28 /*****************************************************************************/
29 unsigned char receive(void)
30 { unsigned char i,k=0;
31 1 clk=0;
32 1 clk=1;
33 1 while(dat);
34 1 clk=0;
35 1 clk=1;
36 1 for(i=0;i 37 1 { delay(4);
38 2 k=k 39 2 if(dat) k=k|0x01;
40 2 else k=k&0xfe;
41 2 clk=0;
42 2 clk=1;
43 2 }
44 1 return k;
45 1 }
46 /***********************************写入*******************************************/
47 /**********************************************************************************/
48 void wr_7281(unsigned char b)
49 {unsigned char i;
50 1 do{
51 2 clk=0;
52 2 clk=1;
53 2 } //B为控制字,C为数据
54 1 while(dat);
55 1 clk=0;
C51 COMPILER V8.08 B 03/18/2009 02:33:59 PAGE 2
56 1 clk=1;
57 1 while(!dat); //建立握手信?
58 1 for(i=0;i 59 1 { if(b 60 2 else dat=1;
61 2 clk=0;
62 2 clk=1;
63 2 b=b 64 2 delay(2);
65 2 }
66 1 dat=1;
67 1 delay(2);
68 1 return ;
69 1 }
70 /**********************************显示位**************************************/
71 /******************************************************************************/
72 void setdisplay(uchar *p,uchar digit )
73 { unsigned m,i;
74 1 for(i=0;i 75 1 {
76 2 m=i 77 2 wr_7281(0x15);
78 2 wr_7281(m|p[i]);
79 2 }
80 1 return;
81 1 }
82 //****************************************运算结果进行输出*************************
83 void LED_OUT()
84 { uchar end_cunt, p_cunt; //分别为浮点数长度和小数点位置
85 1 uchar i,j;
86 1 if(f_data==0) //如果运算结果位0,则仅在最右一位LED显示一个0
87 1 {
88 2 out_data[0]=0;
89 2 setdisplay(out_data,1 );
90 2 }
91 1 else if(f_data>0) //如果运算结果大于0
92 1 {
93 2 sprintf(indata,"%f",f_data); //把一个浮点数复制给一个字符串变量
94 2 if(f_data>99999999)
95 2 { wr_7281(0x18); //设置段显示
96 3 wr_7281(0x00); //显示E 意思为错误或溢出
97 3 wr_7281(0x03); //显示E 意思为错误或溢出
98 3 wr_7281(0x04); //显示E 意思为错误或溢出
99 3 wr_7281(0x05); //显示E 意思为错误或溢出
100 3 wr_7281(0x06); //显示E 意思为错误或溢出
101 3 return;
102 3 }
103 2 j=0;
104 2 end_cunt=0;
105 2 p_cunt=0;
106 2 for(i=0;i 107 2 {
108 3 if(indata[i]!=".")
109 3 {
110 4 if(indata[i]=="/0")
111 4 {
112 5 end_cunt=i; // 保存浮点长度
113 5 break;
114 5 }
115 4 out_data[j]=indata[i];
116 4 j++;
117 4 }
C51 COMPILER V8.08 B 03/18/2009 02:33:59 PAGE 3
118 3 if(indata[i]==".")
119 3 p_cunt=i; //保存小数点位置
120 3 }
121 2 if(p_cunt==0 && end_cunt!=0) //无小数点显示小于8位LED
122 2 {
123 3 setdisplay(out_data,end_cunt );
124 3 }
125 2 if( p_cunt!=0 && end_cunt!=0) //有小数点显示小于8位LED
126 2 {
127 3 wr_7281(0x18); //设置成段显示
128 3 wr_7281(p_float[end_cunt-p_cunt-2]); //显示小数点
129 3 setdisplay(out_data,end_cunt-1 );
130 3 }
131 2 if( p_cunt!=0 && end_cunt==0) //有点超长
132 2 {
133 3 wr_7281(0x18); //设置成显示小数
134 3 wr_7281(p_float[7-p_cunt]); //显示小数点
135 3 setdisplay(out_data,8 );
136 3 }
137 2 }
138 1 else
139 1 {
140 2 sprintf(indata,"%f",f_data);
141 2 if(f_data 142 2 {wr_7281(0x18); //设置段显示
143 3 wr_7281(0x00); //显示E 意思为错误或溢出
144 3 wr_7281(0x03); //显示E 意思为错误 或溢出
145 3 wr_7281(0x04); //显示E 意思为错误 或溢出
146 3 wr_7281(0x05); //显示E 意思为错误 或溢出
147 3 wr_7281(0x06); //显示E 意思为错误或溢出
148 3 return;
149 3 }
150 2 j=0;
151 2 end_cunt=0;
152 2 p_cunt=0;
153 2 for(i=0;i 154 2 {
155 3 if(indata[i]!=".")
156 3 {
157 4 if(indata[i]=="/0")
158 4 {
159 5 end_cunt=i;
160 5 break;
161 5 }
162 4 out_data[j]=indata[i];
163 4 j++;
164 4 }
165 3 if(indata[i]==".")
166 3 p_cunt=i;
167 3 }
168 2 if(p_cunt==0 && end_cunt!=0) //无点不超长
169 2 {
170 3 wr_7281(0x18); //设置成段显示
171 3 wr_7281(sign[end_cunt-1]); //显示负号
172 3 setdisplay(out_data,end_cunt);
173 3 }
174 2 if( p_cunt!=0 && end_cunt!=0) //有点不超长
175 2 {
176 3 wr_7281(0x18); //设置成显示小数
177 3 wr_7281(p_float[end_cunt-p_cunt-2]); //显示小数点
178 3 wr_7281(sign[end_cunt-2]); //显示负号
179 3 setdisplay(out_data,end_cunt);
C51 COMPILER V8.08 B 03/18/2009 02:33:59 PAGE 4
180 3 }
181 2 if( p_cunt!=0 && end_cunt==0) //有点超长
182 2 {
183 3 wr_7281(0x18); //设置成段显示
184 3 wr_7281(p_float[6-p_cunt]); //显示小数点
185 3 wr_7281(sign[6]); //最高位显示负号
186 3 setdisplay(out_data,7);
187 3 }
188 2 }
189 1 return;
190 1 }
191 //*************************************************************************************
192 float add_all(uchar *p_i,uchar *p_f,uchar count) //数组中十进制转化为浮点型数据
193 {
194 1 float add_a;
195 1 uchar tr,i;
196 1 for(i=0;i 197 1 {
198 2 tr=p_i[i];
199 2 p_i[i]=p_i[count-i];
200 2 p_i[count-i]=tr;
201 2 }
202 1 add_a=p_i[7]*10000000+
203 1 p_i[6]*1000000+
204 1 p_i[5]*100000+
205 1 p_i[4]*10000+
206 1 p_i[3]*1000+
207 1 p_i[2]*100+
208 1 p_i[1]*10+
209 1 p_i[0];
210 1 add_a=add_a+
211 1 p_f[0]*0.1+
212 1 p_f[1]*0.01+
213 1 p_f[2]*0.001+
214 1 p_f[3]*0.0001+
215 1 p_f[4]*0.00001+
216 1 p_f[5]*0.000001+
217 1 p_f[6]*0.0000001;
218 1 return add_a;
219 1 }
220
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1654 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = 30 ----
PDATA SIZE = ---- ----
DATA SIZE = 4 25
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)