📄 16key-b.lst
字号:
C51 COMPILER V8.02 16KEY_B 01/02/2007 14:41:16 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 16KEY_B
OBJECT MODULE PLACED IN 16KEY-B.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 16KEY-B.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************/
2 /* */
3 /* ME500单片机开发系统演示程序 - 矩阵键盘键值显示 */
4 /* */
5 /* LCD1602显示 */
6 /* */
7 /* 版本: V1.0 (2006/11/20) */
8 /* 作者: gguoqing (Email: gguoqing@willar.com) */
9 /* 网站: www.willar.com(伟纳电子) www.mcusj.com(伟纳单片机世界) */
10 /* 时间: 2006/05/27 */
11 /* */
12 /*【版权】Copyright(C)伟纳电子 www.willar.com All Rights Reserved */
13 /*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! */
14 /* */
15 /*******************************************************************/
16
17 #include <reg51.h>
18 #include <intrins.h>
19
20 #define uchar unsigned char
21 #define uint unsigned int
22
23 sbit BEEP = P3^7; //蜂鸣器驱动线
24 uchar dis_buf; //显示缓存
25 uchar temp;
26 uchar key; //键顺序吗
27
28 void beep(); //蜂鸣器
29 void delay0(uchar x); //x*0.14MS
30
31 sbit LCD_RS = P2^0;
32 sbit LCD_RW = P2^1;
33 sbit LCD_EN = P2^2;
34
35 uchar code cdis1[ ] = {" KEY NUMBER "};
36 uchar code cdis2[ ] = {" KEY-CODE: H "};
37
38 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
39
40 /*************************************************************/
41 /* */
42 /* 延时子程序 */
43 /* */
44 /*************************************************************/
45
46 void delay(uchar x)
47 { uchar j;
48 1 while((x--)!=0)
49 1 { for(j=0;j<125;j++)
50 2 {;}
51 2 }
52 1 }
53
54 /*************************************************************/
55 /* */
C51 COMPILER V8.02 16KEY_B 01/02/2007 14:41:16 PAGE 2
56 /*检查LCD忙状态 */
57 /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据 */
58 /* */
59 /*************************************************************/
60 bit lcd_busy()
61 {
62 1 bit result;
63 1 LCD_RS = 0;
64 1 LCD_RW = 1;
65 1 LCD_EN = 1;
66 1 delayNOP();
67 1 result = (bit)(P0&0x80);
68 1 LCD_EN = 0;
69 1 return(result);
70 1 }
71
72 /*******************************************************************/
73 /* */
74 /*写指令数据到LCD */
75 /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
76 /* */
77 /*******************************************************************/
78 void lcd_wcmd(uchar cmd)
79
80 {
81 1 while(lcd_busy());
82 1 LCD_RS = 0;
83 1 LCD_RW = 0;
84 1 LCD_EN = 0;
85 1 _nop_();
86 1 _nop_();
87 1 P0 = cmd;
88 1 delayNOP();
89 1 LCD_EN = 1;
90 1 delayNOP();
91 1 LCD_EN = 0;
92 1 }
93
94 /*******************************************************************/
95 /* */
96 /*写显示数据到LCD */
97 /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
98 /* */
99 /*******************************************************************/
100 void lcd_wdat(uchar dat)
101 {
102 1 while(lcd_busy());
103 1 LCD_RS = 1;
104 1 LCD_RW = 0;
105 1 LCD_EN = 0;
106 1 P0 = dat;
107 1 delayNOP();
108 1 LCD_EN = 1;
109 1 delayNOP();
110 1 LCD_EN = 0;
111 1 }
112
113 /*************************************************************/
114 /* */
115 /* LCD初始化设定 */
116 /* */
117 /*************************************************************/
C51 COMPILER V8.02 16KEY_B 01/02/2007 14:41:16 PAGE 3
118 void lcd_init()
119 {
120 1 delay(15);
121 1 lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
122 1 delay(5);
123 1 lcd_wcmd(0x38);
124 1 delay(5);
125 1 lcd_wcmd(0x38);
126 1 delay(5);
127 1
128 1 lcd_wcmd(0x0c); //显示开,关光标
129 1 delay(5);
130 1 lcd_wcmd(0x06); //移动光标
131 1 delay(5);
132 1 lcd_wcmd(0x01); //清除LCD的显示内容
133 1 delay(5);
134 1 }
135
136 /*************************************************************/
137 /* */
138 /* 设定显示位置 */
139 /* */
140 /*************************************************************/
141
142 void lcd_pos(uchar pos)
143 {
144 1 lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
145 1 }
146
147 /*************************************************************/
148 /* */
149 /* 键扫描子程序 */
150 /* */
151 /*************************************************************/
152 void keyscan(void)
153 {
154 1 P1=0x0F; //低四位输入
155 1 delay(1);
156 1 temp=P1; //读P1口
157 1 temp=temp&0x0F;
158 1 temp=~(temp|0xF0);
159 1 if(temp==1)
160 1 key=0;
161 1 else if(temp==2)
162 1 key=1;
163 1 else if(temp==4)
164 1 key=2;
165 1 else if(temp==8)
166 1 key=3;
167 1 else
168 1 key=16;
169 1
170 1 P1=0xF0; //高四位输入
171 1 delay(1);
172 1 temp=P1; //读P1口
173 1 temp=temp&0xF0;
174 1 temp=~((temp>>4)|0xF0);
175 1 if(temp==1)
176 1 key=key+0;
177 1 else if(temp==2)
178 1 key=key+4;
179 1 else if(temp==4)
C51 COMPILER V8.02 16KEY_B 01/02/2007 14:41:16 PAGE 4
180 1 key=key+8;
181 1 else if(temp==8)
182 1 key=key+12;
183 1 else
184 1 key=16;
185 1
186 1 dis_buf = key; //键值入显示缓存
187 1 dis_buf = dis_buf & 0x0f;
188 1
189 1 if(dis_buf>9) //转换为ASCII码
190 1 dis_buf = dis_buf+0x37;
191 1 else
192 1 dis_buf = dis_buf+0x30;
193 1 }
194
195 /*************************************************************/
196 /* */
197 /*判断键是否按下 */
198 /* */
199 /*************************************************************/
200 void keydown(void)
201 {
202 1 P1=0xF0;
203 1 if(P1!=0xF0)
204 1 {
205 2 keyscan();
206 2 beep();
207 2 }
208 1 }
209
210 /*************************************************************/
211 /* */
212 /* 蜂鸣器响一声 */
213 /* */
214 /*************************************************************/
215 void beep()
216 {
217 1 unsigned char i;
218 1 for (i=0;i<180;i++)
219 1 {
220 2 delay0(6);
221 2 BEEP=!BEEP; //BEEP取反
222 2 }
223 1 BEEP=1; //关闭蜂鸣器
224 1 delay(250); //延时
225 1 }
226
227 /*************************************************************/
228 /* */
229 /* 延时 x*0.14ms */
230 /* */
231 /*************************************************************/
232
233 void delay0(uchar x)
234 {
235 1 unsigned char i;
236 1 while(x--)
237 1 {
238 2 for (i = 0; i<13; i++) {}
239 2 }
240 1 }
241 /*************************************************************/
C51 COMPILER V8.02 16KEY_B 01/02/2007 14:41:16 PAGE 5
242 /* */
243 /* 主程序 */
244 /* */
245 /*************************************************************/
246 main()
247 {
248 1 uchar m;
249 1 P0=0xFF; //置P0口
250 1 P2=0xFF; //置P2口
251 1 delay(10); //延时
252 1 lcd_init(); //初始化LCD
253 1
254 1 lcd_pos(0); //设置显示位置为第一行
255 1 for(m=0;m<16;m++)
256 1 lcd_wdat(cdis1[m]);
257 1
258 1 lcd_pos(0x40); //设置显示位置为第二行
259 1
260 1 for(m=0;m<16;m++)
261 1 lcd_wdat(cdis2[m]);
262 1 dis_buf = 0x2d; //显示字符"-"
263 1
264 1 while(1)
265 1 {
266 2 keydown();
267 2 lcd_pos(0x4c);
268 2 lcd_wdat(dis_buf); //第一位数显示
269 2 }
270 1 }
271
272 /************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 435 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 1
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -