?? 0.lst
字號:
C51 COMPILER V6.12 0 10/02/2007 21:38:14 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE 0
OBJECT MODULE PLACED IN .\0.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\0.c DEBUG OBJECTEXTEND
stmt level source
1 #include <intrins.h>
2 #include<reg51.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5 //#include"absacc.h"
6
7 //#include"intrins.h"
8 #define dport P1
9 #define unchar unsigned char
10 sbit RS=P3^4;
11 sbit RW=P3^3;
12 sbit E=P3^2;
13 unchar xpos; //列方向地址指針
14 unchar ypos; //行方向地址指針
15 #define nodisp 0
16 #define nocur 1
17 #define curnoflash 2
18 #define curflsh 3
19 void lcdwcn(unchar);
20 void lcdwc(unchar);
21 void writechar(unchar);
22 void lcdpos();
23 void lcdwd(unchar);
24 void lcdwdn(unchar);
25
26 uchar table[10]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};//數碼管代碼
27
28 sbit BEEP = P3^5; //蜂鳴器驅動線
29 uchar dis_buf; //顯示緩存
30 uchar temp;
31 uchar key; //鍵順序嗎
32 void mdelay(unsigned int delay)
33 {unsigned int i;
34 1 for( ; delay>0; delay--)
35 1 {for(i=0;i<124;i++)
36 2 { ; }
37 2 }
38 1 }
39 void setcur(unchar cur) //光標設置
40 {switch(cur)
41 1 {case 0x0:
42 2 {lcdwc(0x08); //關顯示
43 3 break;
44 3 }
45 2 case 0x1:
46 2 {lcdwc(0xc); //開顯示但無光標
47 3 break;
48 3 }
49 2 case 0x2:
50 2 {lcdwc(0x0e);//開顯示有光標但不閃
51 3 break;
52 3 }
53 2 case 0x3:
54 2 {lcdwc(0x0f); //開顯示有光標且閃
55 3 break;
C51 COMPILER V6.12 0 10/02/2007 21:38:14 PAGE 2
56 3 }
57 2 default: break;
58 2
59 2 }
60 1 }
61 void clrlcd() //清屏
62 {lcdwc(0x01);} //在指定的行和列顯示
63 void writechar(unchar c)
64 {lcdpos();
65 1 lcdwd(c);
66 1 }
67 void waitidle()//正常讀寫之前LCD控制器
68 {unchar tmp;
69 1 dport=0xff;
70 1 RS=0;
71 1 RW=1;
72 1 E=1;
73 1 _nop_();
74 1 for( ; ; )
75 1 {tmp=dport;
76 2 tmp&=0x80;
77 2 if(tmp==0)
78 2 break;
79 2 }
80 1 E=0;
81 1 }
82 void lcdwdn(unchar c)//不檢測忙子程序
83 {
84 1 RS=1;
85 1 RW=0;
86 1 dport=c;//寫入待寫字符
87 1 E=1;
88 1 _nop_();
89 1 E=0;
90 1 }
91 void lcdwd(unchar c)//帶忙堅檢測的控制字子程序
92 {waitidle();
93 1 lcdwdn(c);}
94 void lcdwcn(unchar c)
95 {RS=0;
96 1 RW=0;
97 1 dport=c;
98 1 E=1;
99 1 _nop_();
100 1 E=0;
101 1 }
102 void lcdwc(unchar c)//檢測忙信號的送控制字子程序
103 {waitidle();
104 1 lcdwcn(c);
105 1 }
106 void lcdpos()
107 {unchar tmp;
108 1 xpos&=0x0f;//范圍為0~15個字符
109 1 ypos&=0x01;//范圍為0~1
110 1 tmp=xpos;
111 1 if(ypos==1)
112 1 {tmp+=0x40;
113 2 }
114 1 tmp|=0x80;//地址加80H
115 1 lcdwc(tmp);
116 1 }
117 void rstlcd()//LCD的復位程序
C51 COMPILER V6.12 0 10/02/2007 21:38:14 PAGE 3
118 {mdelay(15);//延時15S
119 1 lcdwcn(0x38);
120 1 mdelay(5);
121 1 lcdwcn(0x38);
122 1 mdelay(5);
123 1 lcdwcn(0x38);
124 1
125 1 lcdwc(0x38);
126 1 lcdwc(0x08);
127 1 lcdwc(0x01);
128 1 lcdwc(0x06);
129 1 lcdwc(0x0c);
130 1 }
131
132 void beep(); //蜂鳴器
133 void delay0(uchar x); //x*0.14MS
134 //--------------------------------------------------
135 /* 延時子程序*/
136
137 void delay(uchar x)
138 { uchar j;
139 1 while((x--)!=0)
140 1 { for(j=0;j<125;j++)
141 2 {;}
142 2 }
143 1 }
144 //--------------------------------------------------
145 /*鍵掃描子程序*/
146 void keyscan(void)
147 {
148 1 P2=0x0F; //低四位輸入
149 1 delay(1);
150 1 temp=P2; //讀P2口
151 1 temp=temp&0x0F;
152 1 temp=~(temp|0xF0);
153 1 if(temp==1)
154 1 key=0;
155 1 else if(temp==2)
156 1 key=1;
157 1 else if(temp==4)
158 1 key=2;
159 1 else if(temp==8)
160 1 key=3;
161 1 else
162 1 key=16;
163 1
164 1 P2=0xF0; //高四位輸入
165 1 delay(1);
166 1 temp=P2; //讀P2口
167 1 temp=temp&0xF0;
168 1 temp=~((temp>>4)|0xF0);
169 1 if(temp==1)
170 1 key=key+0;
171 1 else if(temp==2)
172 1 key=key+4;
173 1 else if(temp==4)
174 1 key=key+8;
175 1 else if(temp==8)
176 1 key=key+12;
177 1 else
178 1 key=16;
179 1
C51 COMPILER V6.12 0 10/02/2007 21:38:14 PAGE 4
180 1 dis_buf=table[key]; //查表得鍵值
181 1 }
182 //--------------------------------------------------
183 /*判斷鍵是否按下*/
184 void keydown(void)
185 {
186 1 P2=0xF0;
187 1 if(P2!=0xF0)
188 1 {
189 2 keyscan();
190 2 beep();
191 2 // while(P1!=0xF0); //等待鍵釋放
192 2 }
193 1 }
194 //--------------------------------------------------
195 void beep()
196 {
197 1 unsigned char i;
198 1 for (i=0;i<100;i++)
199 1 {
200 2 delay0(4);
201 2 BEEP=!BEEP; //BEEP取反
202 2 }
203 1 BEEP=1; //關閉蜂鳴器
204 1 delay(250); //延時
205 1 }
206 //--------------------------------------------------
207 void delay0(uchar x) //x*0.14MS
208 {
209 1 unsigned char i;
210 1 while(x--)
211 1 {
212 2 for (i = 0; i<13; i++) {}
213 2 }
214 1 }
215 //--------------------------------------------------
216 main()
217 {
218 1 P0=0xFF;
219 1
220 1 dis_buf=0xBF;
221 1
222 1 while(1)
223 1 { int t;
224 2 keydown();
225 2 //P0 = dis_buf; //鍵值送顯示
226 2 t=dis_buf;
227 2 delay(2);
228 2 rstlcd();
229 2 clrlcd();
230 2 setcur(curflsh);
231 2 xpos=2;
232 2 ypos=0;
233 2 writechar(t);
234 2 }
235 1
236 1 }
237
238
239
C51 COMPILER V6.12 0 10/02/2007 21:38:14 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 479 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 15 4
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 + -