📄 key_b.lst
字号:
C51 COMPILER V8.08 KEY_B 10/11/2008 11:54:07 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE KEY_B
OBJECT MODULE PLACED IN Key_b.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Key_b.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /****************************************************************************
2 *函数功能:本程序主要通过外部中断INT0及3.3端口读取PS2键盘值并通过LCD1602显示,
3 *键扫描码的解码通过数组方式解码,程序的解码功能主要针对数字及大小写字母和常用
4 *标点符号
5 *创建者: 曹兴
6 *创建日期:2008-10-11
7 *版本号: 2008101101
8 *****************************************************************************/
9 #include"reg51.h"
10 #include"stdio.h"
11 /*****************************端口定义***************************************/
12 #define DATA P0 //LCD数据传输端口
13 sbit RS = P2^7; //LCD控制端口定义
14 sbit RW = P2^6;
15 sbit EP = P2^5;
16 sbit k_data = P3^3; //PS/2数据线端口
17 sbit k_clk = P3^2; //PS/2时钟线端口
18 unsigned char bitcount = 11; //PC键盘数据长度计数
19 unsigned char input = 0; //缓冲区读指针
20 unsigned char k_buf[32]; //键盘缓冲区
21 //没有按下shift键的PC键盘扫描码
22 unsigned char code unshifted[][2]=
23 {28,'a',50,'b',33,'c',35,'d',36,'e',43,'f',52,'g',51,'h',67,'i',59,'j',
24 66,'k',75,'l',58,'m',49,'n',68,'o',77,'p',21,'q',45,'r',27,'s',44,'t',
25 60,'u',42,'v',29,'w',34,'x',53,'y',26,'z',69,'0',22,'1',30,'2',38,'3',
26 37,'4',46,'5',54,'6',61,'7',62,'8',70,'9',14,'`',78,'-',85,'=',
27 84,'[',91,']',76,';',65,',',73,'.',74,'/'};
28 //按下shift键的PC键盘扫描码
29 unsigned char code shifted[][2]=
30 {28,'A',50,'B',33,'C',35,'D',36,'E',43,'F',52,'G',51,'H',67,'I',59,'J',
31 66,'K',75,'L',58,'M',49,'N',68,'O',77,'P',21,'Q',45,'R',27,'S',44,'T',
32 60,'U',42,'V',29,'W',34,'X',53,'Y',26,'Z',69,')',22,'!',30,'@',38,'#',
33 37,'$',46,'%',54,'^',61,'&',62,'*',70,'(',14,'~',78,'_',85,'+',93,'|',
34 84,'{',91,'}',76,':',82,'"',65,'<',73,'>',74,'?'};
35 /*****************************************************************************
36 *函数名称:put_k_buf
37 *函数功能:将解码后的字符放入键盘缓冲区内
38 *入口参数:k_char
39 *出口参数:无
40 *****************************************************************************/
41 void put_k_buf(unsigned char k_char)
42 {
43 1 k_buf[input] = k_char; //送键盘值ASCII码到键盘缓冲区
44 1 if(input<31)
45 1 input++;
46 1 else
47 1 input = 0;
48 1 return;
49 1 }
50 /*****************************************************************************
51 *函数名称:decode
52 *函数功能:解码函数,将接收到的数据转化为其对应的字符
53 *入口参数:k_code
54 *出口参数:无
55 *****************************************************************************/
C51 COMPILER V8.08 KEY_B 10/11/2008 11:54:07 PAGE 2
56 void decode(unsigned char k_code)
57 {
58 1 static unsigned char shift,up,shiftup;
59 1 unsigned i;
60 1 if(k_code==0xf0) //按键释放
61 1 {
62 2 up = 1;
63 2 return;
64 2 }
65 1 if(up==1) //shift键开关
66 1 {
67 2 up = 0;
68 2 if((k_code==0x12)|(k_code==0x59))
69 2 shift = 0;
70 2 return;
71 2 }
72 1 switch(k_code)
73 1 {
74 2 case 0x12: //检测左shift键
75 2 {
76 3 shift = 1;
77 3 shiftup = 1;
78 3 }
79 2 case 0x59: //检测右shift键
80 2 {
81 3 shift = 1;
82 3 shiftup = 1;
83 3 }
84 2 default:
85 2 {
86 3 if(shift==0) //找出没有按下shift键的字符码将其存日键盘缓冲区中
87 3 {
88 4 for(i=0;unshifted[i][0]!=k_code&&unshifted[i][0];i++);
89 4 if(unshifted[i][0]==k_code)
90 4 put_k_buf(unshifted[i][1]);
91 4 }
92 3 else //找出按下shift键的字符码将其存日键盘缓冲区中
93 3 {
94 4 for(i=0;shifted[i][0]!=k_code&&shifted[i][0];i++);
95 4 if(shifted[i][0]==k_code)
96 4 put_k_buf(shifted[i][1]);
97 4 }
98 3 }
99 2 }
100 1 }
101 /*****************************************************************************
102 *函数名称:Keyboard_out
103 *函数功能:中断函数接受键盘发来的数据
104 *入口参数:无
105 *出口参数:无
106 *****************************************************************************/
107 void Keyboard_out(void) interrupt 0 using 0
108 {
109 1 static unsigned char dat;
110 1 switch(bitcount)
111 1 {
112 2 case 11: //接收起始位
113 2 {
114 3 if(k_data ) //若数据线为高则返回
115 3 return ;
116 3 else //若数据线为低则bitcount减1准备接收数据
117 3 bitcount--;
C51 COMPILER V8.08 KEY_B 10/11/2008 11:54:07 PAGE 3
118 3 break;
119 3 }
120 2 case 2: //奇校验位
121 2 {
122 3 bitcount--;
123 3 break;
124 3 }
125 2 case 1: //停止位
126 2 {
127 3 bitcount--;
128 3 if(!k_data ) //若数据线为0,则主机禁止接收放弃数据
129 3 {
130 4 bitcount = 11;
131 4 return;
132 4 }
133 3 else //若数据线为1,则接受停止位
134 3 {
135 4 bitcount = 11;
136 4 decode(dat); //将数据进行解码
137 4 }
138 3 break;
139 3 }
140 2
141 2 default: //通过移位保存接收的8位数据
142 2 {
143 3 dat = (dat>>1);
144 3 if(k_data )
145 3 dat|=0x80;
146 3 bitcount--;
147 3 }
148 2 }
149 1 }
150 /*****************************************************************************
151 *函数名称:delayns
152 *函数功能:LCD延时子程序
153 *入口参数:time
154 *出口参数:无
155 *****************************************************************************/
156 void delayns(unsigned char time)
157 {
158 1 unsigned char i;
159 1 for(;time>0;time--)
160 1 for(i = 0; i< 250; i++) ;
161 1 }
162 /*****************************************************************************
163 *函数名称:lcd_buzy
164 *函数功能:测试LCD忙碌状态
165 *入口参数:无
166 *出口参数:result
167 *****************************************************************************/
168 bit lcd_buzy()
169 {
170 1 bit result;
171 1 RS = 0;
172 1 RW = 1;
173 1 EP = 1;
174 1 delayns(1); //此处延时特别重要 (必不可少)
175 1 result = (bit)(DATA & 0x80);
176 1 delayns(1);
177 1 EP = 0;
178 1 return result;
179 1 }
C51 COMPILER V8.08 KEY_B 10/11/2008 11:54:07 PAGE 4
180 /*****************************************************************************
181 *函数名称:lcd_w_order
182 *函数功能:写指令数据到LCD子程序
183 *入口参数:cmd
184 *出口参数:无
185 *****************************************************************************/
186 void lcd_w_order(unsigned char cmd)
187 {
188 1 while(lcd_buzy()); //判断LCD是否忙碌
189 1 RS = 0;
190 1 RW = 0;
191 1 EP = 1;
192 1 DATA = cmd;
193 1 delayns(1);
194 1 EP = 0;
195 1 }
196 /*****************************************************************************
197 *函数名称:lcd_w_data
198 *函数功能:写入显示数据到LCD子程序
199 *入口参数:dat
200 *出口参数:五
201 *****************************************************************************/
202 void lcd_w_data(unsigned char dat)
203 {
204 1 while(lcd_buzy()); //判断LCD是否忙碌
205 1 RS = 1;
206 1 RW = 0;
207 1 EP = 1;
208 1 DATA = dat;
209 1 delayns(1);
210 1 EP = 0;
211 1 }
212 /*****************************************************************************
213 *函数名称:lcd_post
214 *函数功能:设定显示位置子程序
215 *入口参数:pos
216 *出口参数:无
217 *****************************************************************************/
218 void lcd_post(unsigned char pos)
219
220 {
221 1 lcd_w_order(pos | 0x80);
222 1 }
223 /*****************************************************************************
224 *函数名称:lcd_init
225 *函数功能:LCD初始化子程序
226 *入口参数:无
227 *出口参数:无
228 *****************************************************************************/
229 void lcd_init()
230 {
231 1 lcd_w_order(0x38); //显示模式设置
232 1 delayns(1);
233 1 lcd_w_order(0x0c); //显示光标设置,开显示
234 1 delayns(1);
235 1 lcd_w_order(0x06); //显示光标移动(右移)
236 1 delayns(1);
237 1 lcd_w_order(0x01); //清屏
238 1 delayns(1);
239 1 }
240 /*****************************************************************************
241 *函数名称:main
C51 COMPILER V8.08 KEY_B 10/11/2008 11:54:07 PAGE 5
242 *函数功能:本程序主要通过外部中断INT0及3.3端口读取PS2键盘值并通过LCD1602显示,键
243 *扫描码的解码通过数组方式解码,程序的解码功能主要针对数字及大小写字母和常用标点
244 *符号
245 *入口参数:无
246 *出口参数:无
247 *****************************************************************************/
248 void main()
249 {
250 1 unsigned char j,i=0;
251 1 EA = 1;
252 1 IT0 = 1;
253 1 EX0 = 1;
254 1
255 1 while(1)
256 1 {
257 2 i=0;
258 2 lcd_init(); // 初始化LCD
259 2 delayns(10);
260 2 lcd_post(0x00); //设置显示位置
261 2 while(i<input)
262 2 {
263 3 lcd_w_data(k_buf[i]); //显示字符
264 3 i++;
265 3 if(i==16)
266 3 {
267 4 lcd_post(0x40); // 设置显示位置
268 4 }
269 3 }
270 2 for (j=0;j<20;j++)
271 2 delayns(200);
272 2 }
273 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 495 ----
CONSTANT SIZE = 184 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 38 2
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 + -