📄 test.lst
字号:
C51 COMPILER V7.50 TEST 08/29/2007 18:00:13 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\c51.exe test.c DB OE
line level source
1 //#include "c8051f040.h"
2 //#include "lcd.h"
3 #include "c8051f040.h"
4 typedef unsigned char uchar;
5 typedef unsigned int uint;
6 typedef unsigned long ulong;
7 sbit lcdrs=P5^2;//硬件控制接口
8 sbit lcdrw=P5^1;
9 sbit lcdcs=P5^0;
10 xdata uchar keybuf[16];//输入缓冲区
11 code uchar disdata[3][16]={"0123456789.+-012","ABCDEFGHIJKLMNOP","QRSTUVWXYZ@#$%&*"};
12 xdata uchar intbuf[16];//显示int型数据缓冲区
13 void config(void){
14 1 //看门狗禁止
15 1 WDTCN = 0x07;
16 1 WDTCN = 0xDE;
17 1 WDTCN = 0xAD;
18 1 SFRPAGE = 0x0F;
19 1 XBR0 = 0x00;
20 1 XBR1 = 0x00;
21 1 XBR2 = 0x40; //交叉开关使能,使得P0-P3口能输出
22 1 XBR3 = 0x00;
23 1 SFRPAGE = 0x0F;
24 1 P0MDOUT = 0x00; //端口配置,P0-P3,P6-P7口为开漏输出
25 1 P1MDOUT = 0x00;
26 1 P2MDOUT = 0x00;
27 1 P3MDOUT = 0x00;
28 1 P4MDOUT = 0x00; //P4口为开漏
29 1 P5MDOUT = 0x07;
30 1 P6MDOUT = 0x00;
31 1 P7MDOUT = 0x00;
32 1 \
33 1 P1MDIN = 0xFF; //所有端口为数字输入,没有模拟输入端口
34 1 P2MDIN = 0xFF;
35 1 P3MDIN = 0xFF;
36 1 SFRPAGE = 0x0F;
37 1 CLKSEL = 0x00;
38 1 OSCXCN = 0x00;
39 1 OSCICN = 0x84;
40 1 //采用内部晶振,为24.5MHZ8分频
41 1 }
42 void delay1ms(uint time){//延迟1ms*time,这不是一个精确值
43 1 uint i;
44 1 uint j;
45 1 for (i=0;i<time;i++){
46 2 for(j=0;j<255;j++);
47 2 }
48 1 }
49 void delay50us(uchar time){//延时50us*time,不是精确值
50 1 uchar i,j;
51 1 for (i=0;i<time;i++){
52 2 for(j=0;j<12;j++);
53 2 }
54 1 }
55 void sendc(uchar c){//给lcd送命令
C51 COMPILER V7.50 TEST 08/29/2007 18:00:13 PAGE 2
56 1 SFRPAGE = 0x0f;//以下为lcd发送命令虚拟时序
57 1 P4=c;
58 1 lcdrs=0;
59 1 lcdrw=0;
60 1 EA=0;
61 1 lcdcs=1;
62 1 lcdcs=0;
63 1 lcdcs=1;
64 1 lcdrw=1;
65 1 P4=0xff;//先置1,后读取
66 1 lcdrs=0;
67 1 while(P4>=0x80);
68 1 lcdcs=0;
69 1 lcdcs=1;
70 1 EA=1;
71 1 if(c==1)
72 1 delay1ms(2);
73 1
74 1 }
75 void sendd(uchar c){//给lcd送数据
76 1 SFRPAGE = 0x0f;
77 1 EA=0;
78 1 P4=c;
79 1 lcdrs=1;
80 1 lcdrw=0;
81 1 lcdcs=1;
82 1 lcdcs=0;
83 1 lcdcs=1;
84 1 lcdrw=1;
85 1 P4=0xff;//先置1,后读取
86 1 lcdrs=0;
87 1 while(P4>=0x80);
88 1 lcdcs=0;
89 1 lcdcs=1;
90 1 EA=1;
91 1 }
92 uchar readd(){//读LCD数据
93 1 uchar k;
94 1 SFRPAGE = 0x0f;
95 1 EA=0;
96 1 lcdrw=1;
97 1 P4=0xff;
98 1 lcdrs=1;
99 1 k=P4;
100 1 lcdcs=0;
101 1 lcdcs=1;
102 1 P4=0xff;//先置1,后读取,否则所读数据可能有误
103 1 lcdrs=0;
104 1 while(P4>=0x80);
105 1 /*读LCD是否为忙,此代码不可省略,否则连续读时若LCD为忙,所读数据是上一周期的数据*/
106 1 lcdcs=0;
107 1 lcdcs=1;
108 1 EA=1;
109 1 return k;
110 1 }
111 void dispini(){ //lcd显示初始化
112 1 delay1ms(100);
113 1 SFRPAGE=0xf;
114 1 lcdcs=0;
115 1 lcdrs=1;
116 1 lcdrw=1;
117 1 delay1ms(30);
C51 COMPILER V7.50 TEST 08/29/2007 18:00:13 PAGE 3
118 1 sendc(0x38);//8位,2行,5*7字体
119 1 delay1ms(100);
120 1 sendc(0x0c);//显示开,光标关;不闪烁字符
121 1 delay1ms(100);
122 1 sendc(0x06);//增量方式,现不移动
123 1 delay1ms(100);
124 1 sendc(0x01);//清屏
125 1 delay1ms(100);
126 1 }
127 void puti(long data inum){
128 1 /*将一个int型数据转化成ascii码字符串,结尾以'\0'结束,并将结果存于intbuf(全局变量数组,可在任何地方被调用)*/
129 1 long data t;
130 1 uchar data c=0;
131 1 bit flag=1;
132 1 t=100000000L;
133 1 for(;c<16;c++)
134 1 intbuf[c]='\0';
135 1 c=0;
136 1 if(inum<0){
137 2 intbuf[0]='-';
138 2 c++;
139 2 inum=-inum;
140 2 }
141 1 for(;t>=10;t/=10){//此为将int型转化成字符串算法
142 2 if(t==10){
143 3 intbuf[c]=inum/t+'0';
144 3 intbuf[++c]=inum%t+'0';
145 3 intbuf[++c]='\0';
146 3 break;
147 3 }
148 2 if(inum<t&flag)
149 2 continue;
150 2 else {
151 3 flag=0;
152 3 intbuf[c]=inum/t;
153 3 inum-=(long)(intbuf[c]) * t;
154 3 intbuf[c]+='0';
155 3 c++;
156 3 }
157 2 }
158 1 }
159 void showline(uchar *str,bit page){//page值为0,显示第一行,page为1,显示第二行
160 1 uchar idata k;
161 1 if(page==0){//控制显示在第几行是通过k的地址不同来实现的
162 2 for(k=0x80;k<0x90;k++){
163 3 if(*str=='\0'){//*str的指针不下移,会执行到k=0x8f为止
164 4 sendc(k);
165 4 sendd(' ');//显示空格清掉上次显示部分
166 4 }
167 3 else{
168 4 sendc(k);
169 4 sendd(*str);
170 4 str++;
171 4 }
172 3 }
173 2 }
174 1 if(page==1){
175 2 for(k=0xc0;k<0xd0;k++){
176 3 if(*str=='\0'){
177 4 sendc(k);
178 4 sendd(' ');
179 4 }
C51 COMPILER V7.50 TEST 08/29/2007 18:00:13 PAGE 4
180 3 else {
181 4 sendc(k);
182 4 sendd(*str);
183 4 str++;
184 4 }
185 3 }
186 2 }
187 1 }
188 void showint(long idata num,bit line){
189 1 puti(num);
190 1 showline(intbuf,line);
191 1 }
192
193
194
195
196
197
198
199
200 uchar idata fifo[60]; //用数组构建产度为60的队列
201 uchar fifoAdd(uchar a){//队列元素增加
202 1 uchar i;
203 1 for(i= 0;i<59;i++){
204 2 fifo[59-i]=fifo[58-i];
205 2 }
206 1 fifo[0] = a;
207 1 return fifo[0];
208 1 }
209 /*--------------------------------------------
210 键盘扫描函数,返回键值:DYT。2008-08-19
211 --------------------------------------------*/
212 /*uchar scankey(void){
213 uchar c;
214 for(;;){
215 P2 = 0xff;
216 c = P2&0x0f;
217
218 switch(c){
219 case 0x0e:c=0;return c;
220 case 0x0d:c=1;return c;
221 case 0x0b:c=2;return c;
222 case 0x07:c=3;return c;
223 }
224 }
225 }*/
226 /*--------------------------------------------
227 矩阵式键盘扫描函数,返回键值:DYT。2008-08-27
228 --------------------------------------------*/
229 Scankey(void){
230 1 xdata uchar col[4]={0x0e,0x0d,0x0b,0x07};
231 1 xdata uchar table[4][4] ={{0,1,2,3,},{4,5,6,7},{8,9,10,11},{12,13,14,15}};
232 1 uchar c,r,p,i;//c:列 r:行 p:端口输入
233 1 for(;;){
234 2 P7 = 0x0f;
235 2 p = P7;
236 2 if(p != 0x0f){break;}
237 2 }
238 1 switch(p){
239 2 case 0x0e:c=0;break;
240 2 case 0x0d:c=1;break;
241 2 case 0x0b:c=2;break;
C51 COMPILER V7.50 TEST 08/29/2007 18:00:13 PAGE 5
242 2 case 0x07:c=3;break;
243 2 }
244 1 //用于IO口高四位依次置1,用移位运算“>>”实现
245 1 for(i=0;i<4;i++){
246 2 p=0x80>>i;
247 2 P7=0x0f;
248 2 P7|=p;
249 2 r=P7;
250 2 r&=0x0f;
251 2 if(r==0x0f ){r=i;break;}
252 2
253 2 }
254 1 return table[r][c];
255 1 }
256
257 /*---------------------------------------------
258 逐位显示函数:DYT.2008-08-19
259 ---------------------------------------------*/
260 void showbit(uchar c,bit line,uchar adr){
261 1 uchar idata k;
262 1 c ='0'+c;
263 1 if(~line){ k = 0x80+adr;}
264 1 else {k = 0xc0+adr;}
265 1 sendc(k);
266 1 delay1ms(255);
267 1 sendd(c);
268 1 }
269 /*---------------------------------------------
270 确定处理函数:DYT.2008-08-29
271 ---------------------------------------------*/
272 bit Confirm(uchar *quest){
273 1 bit flag=1;
274 1 showline(quest,0);
275 1 showline(" *YES* no",1);
276 1 for(;;){
277 2 if(Scankey()==8){
278 3 showline(" yes *NO*",1);
279 3 delay1ms(100);
280 3 flag=0;
281 3 }
282 2 else if(Scankey()==9){
283 3 showline(" *YES* no",1);
284 3 delay1ms(100);
285 3 flag=1;
286 3 }
287 2 else if(Scankey()==13){return flag;}
288 2 }
289 1 }
290
291 main(void){
292 1 ulong idata x = 100;
293 1 uchar idata add = 0;
294 1 config();
295 1 dispini();
296 1 x=Confirm("Return?");
297 1 /*showline("Scankey test",0);
298 1 while(1){
299 1 x = Scankey();
300 1 showint(x,1);
301 1 delay1ms(200);
302 1 }//矩阵键盘扫描测试程序*/
303 1 //showline("Scankey test:",0);
C51 COMPILER V7.50 TEST 08/29/2007 18:00:13 PAGE 6
304 1 /*while(1){
305 1 x = scankey();
306 1 showbit(x,1,add);
307 1 add++;
308 1 }
309 1 while(1){
310 1 if(x<255){
311 1 fifoAdd(x);
312 1 showint(fifo[10],0);
313 1 showint(fifo[20],1);
314 1 x++;
315 1 delay1ms(200);
316 1 }
317 1
318 1 else x = 0;
319 1 }*/
320 1 while(1){
321 2 showint(x,0);
322 2 delay1ms(300);
323 2 x++;
324 2 if(x == 99999) x = 0;
325 2 }
326 1 }
327
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1207 ----
CONSTANT SIZE = 105 ----
XDATA SIZE = 32 20
PDATA SIZE = ---- ----
DATA SIZE = ---- 16
IDATA SIZE = 60 7
BIT SIZE = ---- 5
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -