?? text1.lst
字號(hào):
C51 COMPILER V8.02 TEXT1 02/27/2008 15:05:22 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include<math.h>
3 #include <intrins.h>
4 #define uchar unsigned char
5 #define uint unsigned int
6 sbit dc=0xa0; /*P2.0 LCD的RS 21*/
7 sbit rw=0xa1; /*P2.1 LCD的R/W 22*/
8 sbit cs=0xa4; /*P2.4 LCD的E 25*/
9 sfr lcdbus=0x80; /*p0 LCD數(shù)據(jù) D0=P0.0*/
10 void soft_nop(){}
11 void lcd_wr(char a);
12 void lcd_wrdata(uchar a);
13 void lcd_init(void);
14 void lcd_cls(void);
15
16 void soft_10ms()/***********12MHZ提供10MS軟件延時(shí)************/
17 { register int i;
18 1 for(i=0;i<711;i++);
19 1 }
20 void soft_20ms()/***********12MHZ提供20MS軟件延時(shí)************/
21 { soft_10ms();
22 1 soft_10ms();
23 1 }
24
25 uchar keyscan( )
26 {uchar rcode , lcode;
27 1 uint i;
28 1 P1=0xf0;
29 1 if((P1 & 0xf0)!=0xf0)
30 1 {for(i=1;i<16;i++)
31 2 soft_20ms();
32 2 if((P1 & 0xf0)!=0xf0)
33 2 {rcode = 0xfe;
34 3 while((rcode & 0x10)!=0)
35 3 {P1 = rcode;
36 4 if((P1 & 0xf0)!=0xf0)
37 4 {lcode = (P1 & 0xf0);
38 5 rcode = (rcode & 0x0f);
39 5 return(rcode + lcode);
40 5 }
41 4 else
42 4 rcode = (rcode<<1)|0x01;
43 4 }
44 3 }
45 2 }
46 1 return(0);
47 1 }
48
49 uchar data lcdcounter;
50 bit lcdusing1,lcdusing2;
51 bit lcd_checkbusy()/*檢查LCD忙*/
52 { register lcdstate;
53 1 dc=0; /*dc=1為數(shù)據(jù),=0為命令.*/
54 1 rw=1; /*rw=1為讀,=0為寫.*/
55 1 cs=1; /*cs=1選通.*/
C51 COMPILER V8.02 TEXT1 02/27/2008 15:05:22 PAGE 2
56 1 soft_nop();
57 1 lcdstate=lcdbus;
58 1 cs=0;
59 1 return((bit)(lcdstate&0x80));
60 1 }
61
62 void lcd_string(char *strpoint) /*在當(dāng)前顯示位置顯示LCD字符串*/
63 { register i=0;
64 1 while(strpoint[i]!=0){
65 2 lcd_wrdata(strpoint[i]);
66 2 i++;
67 2 }
68 1 }
69
70
71 void lcd_wrcmd(uchar lcdcmd) /*寫LCD命令*/
72 { lcdusing1=1;
73 1 while(lcd_checkbusy());
74 1 lcdbus=lcdcmd;
75 1 dc=0; /*dc=1為數(shù)據(jù),=0為命令.*/
76 1 rw=0; /*rw=1為讀,=0為寫.*/
77 1 cs=1; /*cs=1選通.*/
78 1 soft_nop();
79 1 cs=0;
80 1 lcdbus=0xff;
81 1 lcdusing1=0;
82 1 }
83
84 void lcd_wrdata(uchar lcddata) /*在當(dāng)前顯示位置顯示數(shù)據(jù)*/
85 { //char i;
86 1 lcdusing2=1;
87 1 //while(lcd_checkbusy());
88 1 if(lcdcounter==8){
89 2 // lcd_moveto(20);
90 2 lcd_wrcmd(0xC0);
91 2 while(lcd_checkbusy());
92 2 }
93 1
94 1 if(lcdcounter==16){
95 2 // lcd_moveto(0);
96 2 lcd_wrcmd(0x80);
97 2 while(lcd_checkbusy());
98 2 lcdcounter=0;
99 2 } /*為通用而如此*/
100 1 lcdcounter++;
101 1 lcdbus=lcddata;
102 1 dc=1; /*dc=1為數(shù)據(jù),=0為命令.*/
103 1 rw=0; /*rw=1為讀,=0為寫.*/
104 1 cs=1; /*cs=1選通.*/
105 1 soft_nop();
106 1 cs=0;
107 1 lcdbus=0xff;
108 1 lcdusing2=0;
109 1 }
110
111
112 void calc( float* a,int k)
113 { long int out,i=0,out3;
114 1 float out1,out2;
115 1 switch(k)
116 1 {
117 2 case 0:out1=a[0];break;
C51 COMPILER V8.02 TEXT1 02/27/2008 15:05:22 PAGE 3
118 2 case 1:out1=a[0]+a[1];break;
119 2 case 2:out1=a[0]-a[1];break;
120 2 case 3:out1=a[0]*a[1];break;
121 2 case 4:out1=a[0]/a[1];break;
122 2 default:break;
123 2 }
124 1
125 1 if(k==4&&a[1]==0)
126 1 {
127 2 lcd_string("error!");
128 2 }
129 1 else
130 1 {out=(long int)out1;
131 2 if(out<0)
132 2 {lcd_wrdata('-');out=abs(out);}
133 2 if(out/10000)
134 2 {lcd_wrdata(out/10000+'0');i++;}
135 2 if(out%10000/1000)
136 2 {lcd_wrdata(out%10000/1000+'0');i++;}
137 2 else if(i!=0)
138 2 lcd_wrdata('0');
139 2 if(out%1000/100)
140 2 {lcd_wrdata(out%1000/100+'0');i++;}
141 2 else if(i!=0)
142 2 lcd_wrdata('0');
143 2 if(out%100/10)
144 2 lcd_wrdata(out%100/10+'0');
145 2 else if
146 2 (i!=0)lcd_wrdata('0');
147 2 lcd_wrdata(out%10+'0');
148 2 i=0;
149 2 if((out2=out1-out)>=0.001)
150 2 {lcd_wrdata('.');
151 3 out3=(int)(out2*1000);
152 3 lcd_wrdata(out3%1000/100+'0');
153 3 lcd_wrdata(out3%100/10+'0');
154 3 lcd_wrdata(out3%10+'0');
155 3 }
156 2 }
157 1 }
158
159 void lcd_init()/*初始化*/
160 { lcd_wrcmd(0x38); /*設(shè)置8位格式,2行,5*7*/
161 1 lcd_wrcmd(0x0c); /*整體顯示,關(guān)光標(biāo),不閃爍*/
162 1 lcd_wrcmd(0x06); /*設(shè)定輸入方式,增量不移位*/
163 1 //lcd_wrcmd(0x01); /*清除顯示*/
164 1 lcdcounter=0;
165 1 }
166
167 void lcd_cls()/*清除顯示*/
168 { lcd_wrcmd(0x01);
169 1 lcdcounter=0;
170 1 }
171
172
173
174 void main(void)
175 {uchar key;
176 1 int j=0,k=0;
177 1 float a[2]={0,0};
178 1
179 1 lcd_init();
C51 COMPILER V8.02 TEXT1 02/27/2008 15:05:22 PAGE 4
180 1 while(1)
181 1 {
182 2
183 2 key = keyscan();
184 2 switch(key)
185 2 {
186 3 case 0x7e:lcd_wrdata('0');a[j]=a[j]*10+0;break;
187 3 case 0xbe:lcd_wrdata('1');a[j]=a[j]*10+1;break;
188 3 case 0xde:lcd_wrdata('2');a[j]=a[j]*10+2;break;
189 3 case 0xee:lcd_wrdata('3');a[j]=a[j]*10+3;break;
190 3 case 0x7d:lcd_wrdata('4');a[j]=a[j]*10+4;break;
191 3 case 0xbd:lcd_wrdata('5');a[j]=a[j]*10+5;break;
192 3 case 0xdd:lcd_wrdata('6');a[j]=a[j]*10+6;break;
193 3 case 0xed:lcd_wrdata('7');a[j]=a[j]*10+7;break;
194 3 case 0x7b:lcd_wrdata('8');a[j]=a[j]*10+8;break;
195 3 case 0xbb:lcd_wrdata('9');a[j]=a[j]*10+9;break;
196 3 case 0xdb:lcd_wrdata('+');k=1;j=1;break;
197 3 case 0xeb:lcd_wrdata('-');k=2;j=1;break;
198 3 case 0x77:lcd_wrdata('*');k=3;j=1;break;
199 3 case 0xb7:lcd_wrdata('/');k=4;j=1;break;
200 3 case 0xd7:lcd_wrdata('=');calc(a,k);a[0]=0;a[1]=0;j=0,k=0;break;
201 3 case 0xe7:lcd_cls();break;
202 3 default :break;
203 3 }
204 2 soft_20ms();
205 2 soft_20ms();
206 2 soft_20ms();
207 2 soft_20ms();
208 2
209 2 }
210 1
211 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1802 ----
CONSTANT SIZE = 15 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 42
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -