?? 123.lst
字號:
C51 COMPILER V8.02 123 12/30/2008 11:30:31 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 123
OBJECT MODULE PLACED IN 123.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 123.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /**************************
2 0 1 2 3
3 4 5 6 7
4 8 9 . CLR
5 + - = CLR
6 ***************************/
7 /***************************
8 用鍵盤掃描,數碼管顯示實現計算功能,能實現xxx.x任意正數的加減
9 運算,超過范圍顯0000,功能鍵如上,并將所得結果儲入EEPROM
10 ****************************/
11 #include <reg52.h>
12 #include<intrins.h>
13 #define uchar unsigned char
14 #define uint unsigned int
15 /*sfr ISP_DATA=0Xe2;
16 sfr ISP_ADDRH=0xe3;
17 sfr ISP_ADDRL=0xe4;
18 sfr ISP_CMD=0xe5;
19 sfr ISP_TRIG=0xe6;
20 sfr ISP_CONTR=0xe7;*/
21 //sfr LedPort=0x80; //P0口段選
22 //sfr LedBit=0x90; //P1口位選
23
24 uchar code table[]=
25 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
26 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef
27 };//0,1,2,3,4,5,6,7,8,9,0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,
28 uchar temp,dat;
29 uchar buf1[5];
30 uchar buf2[5];
31 uchar end[5];
32
33 /**************延時程序*************/
34 void delay(uint z)
35 {
36 1 uint x,y;
37 1 for(x=z;x>0;x--)
38 1 for(y=110;y>0;y--);
39 1 }
40
41 /***********鍵盤掃描***************/
42 uchar keyscan()
43 {
44 1 uchar num=0;
45 1 P2=0x7f;
46 1 temp=P2;
47 1 temp=temp&0x0f;
48 1 if(temp!=0x0f)
49 1 {
50 2 delay(5);
51 2 temp=P2;
52 2 temp=temp&0x0f;
53 2 if(temp!=0x0f)
54 2 {
55 3 temp=P2;
C51 COMPILER V8.02 123 12/30/2008 11:30:31 PAGE 2
56 3 switch(temp)
57 3 {
58 4 case 0x77:num=1;break;
59 4 case 0x7b:num=2;break;
60 4 case 0x7d:num=3;break;
61 4 case 0x7e:num=4;break;
62 4 }
63 3 }
64 2 }
65 1 P2=0xbf;
66 1 temp=P2;
67 1 temp=temp&0x0f;
68 1 if(temp!=0x0f)
69 1 {
70 2 delay(5);
71 2 temp=P2;
72 2 temp=temp&0x0f;
73 2 if(temp!=0x0f)
74 2 {
75 3 temp=P2;
76 3 switch(temp)
77 3 {
78 4 case 0xb7:num=5;break;
79 4 case 0xbb:num=6;break;
80 4 case 0xbd:num=7;break;
81 4 case 0xbe:num=8;break;
82 4 }
83 3
84 3 }
85 2 }
86 1 P2=0xdf;
87 1 temp=P2;
88 1 temp=temp&0x0f;
89 1 if(temp!=0x0f)
90 1 {
91 2 delay(5);
92 2 temp=P2;
93 2 temp=temp&0x0f;
94 2 if(temp!=0x0f)
95 2 {
96 3 temp=P2;
97 3 switch(temp)
98 3 {
99 4 case 0xd7:num=9;break;
100 4 case 0xdb:num=10;break;
101 4 case 0xdd:num=11;break;
102 4 case 0xde:num=12;break;
103 4 }
104 3
105 3 }
106 2 }
107 1 P2=0xef;
108 1 temp=P2;
109 1 temp=temp&0x0f;
110 1 if(temp!=0x0f)
111 1 {
112 2 delay(5);
113 2 temp=P2;
114 2 temp=temp&0x0f;
115 2 if(temp!=0x0f)
116 2 {
117 3 temp=P2;
C51 COMPILER V8.02 123 12/30/2008 11:30:31 PAGE 3
118 3 switch(temp)
119 3 {
120 4 case 0xe7:num=13;break;
121 4 case 0xeb:num=14;break;
122 4 case 0xed:num=15;break;
123 4 case 0xee:num=16;break;
124 4 }
125 3 }
126 2 }
127 1 return num;
128 1 }
129
130 /*********在數碼管上顯示四位數字**********/
131 void show(uchar *dis)
132 {
133 1
134 1 P1=0xf7;
135 1 P0=table[dis[3]];
136 1 delay(5);
137 1 P1=0xfb;
138 1 P0=table[dis[2]];
139 1 delay(5);
140 1 P1=0xfd;
141 1 P0=table[dis[1]];
142 1 delay(5);
143 1 P1=0xfe;
144 1 P0=table[dis[0]];
145 1 delay(5);
146 1 }
147
148 /*********eeprom里讀數據******************/
149 /*uchar EEPROM_Read(uint address)
150 {
151 ISP_ADDRH=address/256; // 待寫入扇區首地址
152 ISP_ADDRL=address%256;
153 ISP_CONTR=0X83; //控制字節
154 ISP_CMD=0X01; //讀命令
155 ISP_TRIG=0X46; //命令觸發寄存器
156 ISP_TRIG=0XB9;
157 _nop_();
158
159 ISP_CONTR=0X00; //初始化
160 ISP_CMD=0X00;
161 ISP_TRIG=0X00;
162 ISP_ADDRH=0x00;
163 ISP_ADDRL=0x00;
164
165 return(ISP_DATA); //返回讀出的值
166 }
167
168 /*********向eeprom里寫數據**********************/
169 /*void EEPROM_Write(uint address,uchar DataTemp)
170 {
171 ISP_DATA=DataTemp;
172 ISP_ADDRH=address/256;
173 ISP_ADDRL=address%256;
174 ISP_CMD=0X02; //寫指令
175 ISP_TRIG=0X46; //觸發,數據寫入
176 ISP_TRIG=0XB9;
177 _nop_();
178
179 ISP_CONTR=0X00; //初始化
C51 COMPILER V8.02 123 12/30/2008 11:30:31 PAGE 4
180 ISP_CMD=0X00;
181 ISP_TRIG=0X00;
182 ISP_ADDRH=0x00;
183 ISP_ADDRL=0x00;
184 }*/
185
186 /*************扇區擦除**********************/
187 /*void EEPROM_Eares(uint address) //扇區擦除
188 {
189 ISP_ADDRL=address;
190 ISP_ADDRH=address>>6;
191 ISP_CONTR=0X83;
192 ISP_CMD=0X03; //扇區命令
193 ISP_TRIG=0X46; //命令觸發寄存器
194 ISP_TRIG=0XB9;
195 _nop_();
196
197 ISP_ADDRL=0x00;
198 ISP_ADDRH=0x00;
199 ISP_CONTR=0X00;
200 ISP_CMD=0X00;
201 ISP_TRIG=0X00;
202 }*/
203
204 /********主程序里進行運算********************/
205 void main(void)
206 {
207 1 uchar i,key,flag,addflag;
208 1 addflag=1;
209 1 while(1)
210 1 {
211 2 key=keyscan();
212 2 if(addflag==1)
213 2 show(buf1);
214 2 if(addflag==2)
215 2 show(buf2);
216 2 if(addflag==3)
217 2 show(end);
218 2
219 2 if(key>0&&key<12&&addflag==1) //第一次輸入的數
220 2 {
221 3 do
222 3 {
223 4 show(buf1);
224 4 P2=0x0f;
225 4 temp=P2;
226 4 }
227 3 while(temp!=0x0f);
228 3 if(key!=11)
229 3 {
230 4 buf1[4]=buf1[3];
231 4 buf1[3]=buf1[2];
232 4 buf1[2]=buf1[1];
233 4 buf1[1]=buf1[0];
234 4 buf1[0]=key-1;
235 4 }
236 3 else
237 3 buf1[0]=buf1[0]+10;
238 3 if(buf1[4]!=0)
239 3 {
240 4 for(i=0;i<4;i++)
241 4 buf1[i]=0;
C51 COMPILER V8.02 123 12/30/2008 11:30:31 PAGE 5
242 4 }
243 3 }
244 2
245 2 if(key>0&&key<12&&addflag==2) //第二次輸入的數
246 2 {
247 3 do
248 3 {
249 4 show(buf2);
250 4 P2=0x0f;
251 4 temp=P2;
252 4 }
253 3 while(temp!=0x0f);
254 3 if(key!=11)
255 3 {
256 4 buf1[4]=buf1[3];
257 4 buf2[3]=buf2[2];
258 4 buf2[2]=buf2[1];
259 4 buf2[1]=buf2[0];
260 4 buf2[0]=key-1;
261 4 }
262 3 else
263 3 buf2[0]=buf2[0]+10;
264 3
265 3 }
266 2 if(key==13) //+
267 2 {
268 3 addflag=2;
269 3 flag=1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -