📄 keyboard.lst
字号:
C51 COMPILER V7.50 KEYBOARD 12/01/2006 18:46:01 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE KEYBOARD
OBJECT MODULE PLACED IN keyboard.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE keyboard.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"reg52.h"
2 #include "intrins.h"
3 #include "string.h"
4 #include "key.h" //按键通码与ascii对照表
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define cmd_word 0xff //复位命令
8 sbit Clk_Line = P3^3; //时钟线
9 sbit Data_Line=P3^4; //键盘数据线
10 uchar key=0; //按键最终值
11 uint Key_Value=0;
12 uchar Int_Time=0;
13 uchar save=0;
14 uchar display[40];
15 uint num = 0;
16 uchar blank;
17 uchar flag;
18 uchar comf = 0x01;
19 //**************************************************************************
20 void init(void);
21 void delay(uint us); //us=12大约100us
22 void command(uchar cmd);
23 void interrupt1_receive(void);
24 void getkey(void) ;////内部中断0 用来处理缓冲区里的数据
25 void keyprocess(void);
26 void lcdclr(void);
27 //**************************************************************************
28 //Port Definitions**********************************************************
29 sbit LcdRs = P1^0;
30 sbit LcdRw = P1^1;
31 sbit LcdEn = P1^2;
32 sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
33
34 sbit LcdLight = DBPort^4;
35
36 void Delay1ms(unsigned int count)
37 {
38 1 unsigned int i,j;
39 1 for(i=0;i<count;i++)
40 1 for(j=0;j<120;j++);
41 1 }
42 //内部等待函数**************************************************************************
43 unsigned char LCD_Wait(void)
44 {
45 1 LcdRs=0;
46 1 LcdRw=1; _nop_();
47 1 LcdEn=1; _nop_();
48 1 while(DBPort&0x80); //或do{ACC=DBPort;} while(ACC_7==1); 忙信号??为1忙
49 1 LcdEn=0;
50 1 Delay1ms(1);
51 1 return ACC;
52 1 }
53 //向LCD写入命令或数据************************************************************
54 #define LCD_COMMAND 0x00 // Command
55 #define LCD_DATA 0x01 // Data
C51 COMPILER V7.50 KEYBOARD 12/01/2006 18:46:01 PAGE 2
56 #define LCD_CLEAR_SCREEN 0x01 // 清屏
57 #define LCD_HOMING 0x02 // 光标返回原点
58 void LCD_Write(unsigned char style, unsigned char input)
59 {
60 1 LcdRs=style;
61 1 LcdRw=0; _nop_();
62 1 LcdEn=1; _nop_();
63 1 DBPort=input; _nop_();
64 1 LcdEn=0; _nop_();
65 1 LCD_Wait();
66 1 }
67
68 //设置显示模式************************************************************
69 #define LCD_SHOW 0x04 //显示开
70 #define LCD_HIDE 0x00 //显示关
71
72 #define LCD_CURSOR 0x02 //显示光标
73 #define LCD_NO_CURSOR 0x00 //无光标
74
75 #define LCD_FLASH 0x01 //光标闪动
76 #define LCD_NO_FLASH 0x00 //光标不闪动
77
78 void LCD_SetDisplay(unsigned char DisplayMode)
79 {
80 1 LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
81 1 }
82
83 //设置输入模式************************************************************
84 #define LCD_AC_UP 0x02
85 #define LCD_AC_DOWN 0x00 // default
86
87 #define LCD_MOVE 0x01 // 画面可平移
88 #define LCD_NO_MOVE 0x00 //default
89
90 void LCD_SetInput(unsigned char InputMode)
91 {
92 1 LCD_Write(LCD_COMMAND, 0x04|InputMode);
93 1 }
94
95 //移动光标或屏幕************************************************************
96 #define LCD_CURSOR 0x02
97 #define LCD_SCREEN 0x08
98 #define LCD_LEFT 0x00
99 #define LCD_RIGHT 0x04
100 void LCD_Move(unsigned char object, unsigned char direction)
101 {
102 1 if(object==LCD_CURSOR)
103 1 LCD_Write(LCD_COMMAND,0x10|direction);
104 1 if(object==LCD_SCREEN)
105 1 LCD_Write(LCD_COMMAND,0x18|direction);
106 1 }
107
108 //初始化LCD************************************************************
109 void LCD_Initial()
110 {
111 1 LcdEn=0;
112 1 Delay1ms(80);
113 1 LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
114 1 Delay1ms(10);
115 1 LCD_Write(LCD_COMMAND,0x38);
116 1 Delay1ms(10);
117 1 LCD_SetDisplay(LCD_SHOW|LCD_CURSOR); //开启显示, 无光标
C51 COMPILER V7.50 KEYBOARD 12/01/2006 18:46:01 PAGE 3
118 1 //LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
119 1 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
120 1 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
121 1 }
122
123 //************************************************************************
124 void GotoXY(unsigned char x, unsigned char y)//y是行 ,x是列
125 {
126 1 if(y==0)
127 1 LCD_Write(LCD_COMMAND,0x80|x);
128 1 if(y==1)
129 1 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
130 1 }
131 void Print(unsigned char *str)
132 {
133 1 while(*str!='\0')
134 1 {
135 2 LCD_Write(LCD_DATA,*str);
136 2 str++;
137 2 }
138 1 }
139 void LCD_LoadChar(unsigned char user[8], unsigned char place)
140 {
141 1 unsigned char i;
142 1 LCD_Write(LCD_COMMAND,0x40|(place*8));
143 1 for(i=0; i<8; i++)
144 1 LCD_Write(LCD_DATA,user[i]);
145 1 }
146 //************************************************************************
147 void lcdclr(void)
148 {
149 1 uchar clrstr[17];
150 1 uchar i = 0;
151 1 while(i < 16)
152 1 {
153 2 clrstr[i++] = ' ';
154 2 }
155 1 clrstr[i] = 0;
156 1 GotoXY(0, 0);
157 1 Print(clrstr); //在LCD上显示按键值
158 1 GotoXY(0, 1);
159 1 Print(clrstr); //在LCD上显示按键值
160 1 }
161 //************************************************************************
162
163 void main(void)
164 {
165 1 uchar thir=2;
166 1 init(); //初始化
167 1 LCD_Initial();
168 1 command(cmd_word);
169 1 delay(150);
170 1 while(1)
171 1 {
172 2 EX1=1;
173 2 while(EX1) ;
174 2 getkey();
175 2 keyprocess();
176 2 }
177 1 }
178 void init(void)
179 {
C51 COMPILER V7.50 KEYBOARD 12/01/2006 18:46:01 PAGE 4
180 1 EA = 1;
181 1 IT1 = 1; //外部中断1是下降沿触发方式
182 1 }
183
184 void getkey(void)
185 {
186 1 uchar i=0;
187 1 //static uint num = 0;
188 1 save = Key_Value;
189 1 for(i=0;i<49;i++)
190 1 {
191 2 if(noshift[i][0] == save) //普按键的通码在缓冲区的第一位
192 2 {
193 3 key = noshift[i][1]; //搜索到字母后进行相应的处理
194 3 P2 = key;
195 3 if(num == 32)
196 3 {
197 4 //num = 0;
198 4 while(num)
199 4 {
200 5 display[--num] = 0;
201 5 }
202 4 blank = 0;
203 4 lcdclr();
204 4 }
205 3 display[num++] = key;
206 3 flag = 0;
207 3 break;
208 3 }
209 2 }
210 1 }
211 void keyprocess(void)
212 {
213 1 delay(10);
214 1 if((save == back)&&num)
215 1 {
216 2 flag = 0;
217 2 if(num == 16 && blank)
218 2 {
219 3 while(--blank)
220 3 {
221 4 display[--num] = 0;
222 4 GotoXY(num,0);
223 4 Print(" ");
224 4 }
225 3 }
226 2 else
227 2 {
228 3 display[--num] = 0;
229 3 if(num<16)
230 3 GotoXY(num,0);
231 3 else
232 3 GotoXY(num-16,1);
233 3 Print(" ");
234 3 }
235 2 }
236 1 if(num<=16)
237 1 {
238 2 if(save == enter)
239 2 {
240 3 flag = 0;
241 3 blank = 17 - num;
C51 COMPILER V7.50 KEYBOARD 12/01/2006 18:46:01 PAGE 5
242 3 while( num < 16 )
243 3 {
244 4 display[num++] = ' ';
245 4 }
246 3 flag = 1;
247 3 }
248 2 else
249 2 {
250 3 GotoXY(0, 0);
251 3 Print(display); //在LCD上显示按键值
252 3 }
253 2
254 2 }
255 1 else
256 1 {
257 2 GotoXY(0, 1);
258 2 Print(display+16);
259 2 }
260 1 if(flag == 1)
261 1 {
262 2 GotoXY(0, 1);
263 2 }
264 1 }
265 void delay(uint us) //us=12大约100us
266 {
267 1 while(us--) ;
268 1 }
269 void interrupt1_receive(void) interrupt 2
270 {
271 1 _nop_();
272 1 if(Data_Line)
273 1 Key_Value|=0x8000;
274 1 Int_Time++;
275 1 if(Int_Time==11)
276 1 {
277 2 Key_Value>>=6;
278 2 Int_Time=0;
279 2 EX1=0;
280 2 }
281 1 Key_Value>>=1;
282 1 }
283 void command(uchar cmd)
284 {
285 1 uchar parity;
286 1 uchar i;
287 1 comf = 0x01;
288 1 parity=0;
289 1
290 1 Clk_Line=1;
291 1 Data_Line=1;
292 1 delay(100);
293 1 Clk_Line=0;
294 1 delay(20);
295 1 Data_Line=0;
296 1 Clk_Line = 1;
297 1 for(i=0;i<8;i++)
298 1 {
299 2 Clk_Line = 1;
300 2 while(Clk_Line);
301 2 Data_Line = 0;
302 2 if(cmd & (comf<<1))
303 2 {
C51 COMPILER V7.50 KEYBOARD 12/01/2006 18:46:01 PAGE 6
304 3 Data_Line = 1;
305 3 parity++;
306 3 }
307 2 }
308 1 while(!Clk_Line) ;
309 1 while(Clk_Line) ;
310 1
311 1 if((parity&0x01))
312 1 Data_Line=0;
313 1 else Data_Line=1;
314 1 while(!Clk_Line) ;
315 1 while(Clk_Line) ;
316 1 Data_Line=1;
317 1 while(!Clk_Line);
318 1 while(Data_Line) ;
319 1 while(Clk_Line) ;
320 1 while(!Clk_Line) ;
321 1 while(!Data_Line);
322 1 }
323
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 871 ----
CONSTANT SIZE = 256 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 50 28
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 + -