📄 ps2.lst
字号:
C51 COMPILER V7.50 PS2 07/27/2007 22:57:32 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN ps2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ps2.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************************
2 * 标题: 蓝海微芯LJD-SY-5200单片机开发系统演示程序 *
3 * 文件: ps2.c *
4 * 日期: 2006-8-11 *
5 * 版本: 1.0 *
6 * 作者: 蓝海微芯 *
7 * 网站: http://www.ljd-2008.com *
8 ********************************************************************************
9 * 描述: *
10 * ps/2键盘测试程序 *
11 * *
12 * *
13 ********************************************************************************
14 * 【版权】 Copyright(C)微芯科技 http://www.bluemcu.com All Rights Reserved *
15 * 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
16 *******************************************************************************/
17 #include "define.h"
18 #include "code.h"
19 #include "LCD1602.h"
20 #define uchar unsigned char
21 bit revchar_flag=0;
22 unsigned char mcu_revchar=0;
23 unsigned char led_status=0;
24 unsigned char (*keycode)[2];
25
26 unsigned char code ASCII[] ="0123456789ABCDEF";
27
28 uchar xdata disp_num[10] = "0123456789";
29 uchar xdata disp_letter[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
30 uchar xdata disp_enter[5] = "Enter";
31 uchar xdata disp_shift[5] = "Shift";
32 uchar xdata disp_back[10] = "Back Space";
33 uchar xdata disp_space[5] = "Space";
34 uchar xdata disp_ctrl[4] = "Ctrl";
35 uchar xdata disp_tab[3] = "Tab";
36 uchar xdata disp_cap[9] = "Caps Lock";
37 uchar xdata disp_esc[3] = "Esc";
38 uchar xdata disp_alt[3] = "Alt";
39 uchar xdata disp_lock[8] = "Num Lock";
40 uchar xdata disp_insert[6] = "Insert";
41 uchar xdata disp_delete[6] = "Delete";
42 uchar xdata disp_end[3] = "End";
43 uchar xdata disp_home[4] = "Home";
44 uchar xdata disp_page_up[7] = "Page Up";
45 uchar xdata disp_page_down[9] = "Page Down";
46 uchar xdata disp_right[5] = "Right";
47 uchar xdata disp_left[4] = "Left";
48 uchar xdata disp_up[2] = "Up";
49 uchar xdata disp_down[4] = "Down";
50
51
52 /*
53 void delay100us (int us)
54 {
55 int i; // millisecond counter
C51 COMPILER V7.50 PS2 07/27/2007 22:57:32 PAGE 2
56 int count;
57 count=SYSCLK/120000;
58 TCON &= ~0x30; // Stop Timer0 and clear overflow flag
59 TMOD |= 0x01;
60 //ET0=1;
61 for (i = 0; i < us; i++)
62 { // count milliseconds
63 TH0 = (-count) >> 8; // Set Timer0 to overflow in 50us
64 TL0 = -count;
65 TR0 = 1; // Start Timer0
66 while (TF0 == 0); // wait for overflow
67 TF0 = 0; // clear overflow indicator
68 TR0 = 0; // Stop Timer0
69 }
70 //ET0=0;//close the interrupt
71 }
72
73 //单片机向PS/2设备发送数据程序
74 void ps2_sentchar(unsigned char sentchar)
75 {
76 unsigned char sentbit_cnt = 0x00;
77 unsigned char sentchar_chk = 0x00;
78
79 EX0 =0;
80
81 //发起一个传送,发起始位
82 PS2_CLK = 0;
83 delay100us(1);
84 PS2_DIO = 0; //起始位
85 PS2_CLK = 1;
86
87 //发送DATA0-7
88 for(sentbit_cnt = 0; sentbit_cnt < 8; sentbit_cnt++)
89 {
90 while(PS2_CLK); //等待时钟线变为低
91 PS2_DIO = sentchar & 0x01; //发送数据
92 if(PS2_DIO)sentchar_chk++; //计算校验
93 while(!PS2_CLK); //等待时钟线变高
94 sentchar >>= 1; //待发送数据右移一位
95 }
96 //发送校验位
97 while(PS2_CLK); //等待时钟线变为低
98 switch(sentchar_chk)
99 {
100 case 0:
101 case 2:
102 case 4:
103 case 6: PS2_DIO = 1; break; //奇校验
104 case 1:
105 case 3:
106 case 5:
107 case 7: PS2_DIO = 0; break; //奇校验
108 default: break;
109 }
110 while(!PS2_CLK); //等待时钟线变高
111 while(PS2_CLK); //等待时钟线变为低
112
113 //发送停止位,停止位总为1
114 PS2_DIO = 1;
115 while(!PS2_CLK); //等待时钟线变高
116 while(PS2_CLK); //等待时钟线变为低
117
C51 COMPILER V7.50 PS2 07/27/2007 22:57:32 PAGE 3
118 //接收ACK
119 //if(PS2_DIO) error(); //ACK信号由键盘发出,总为低电平
120 while(!PS2_CLK); //等待时钟线变高
121
122 EX0 = 1;
123 }
124 */
125 void ps2ini(void)
126 {
127 1 IT1=1; //外部中断1设置为下降沿触发
128 1 EX1=1; //允许外部中断1
129 1 keycode=key;
130 1 }
131 //单片机由PS/2键盘接收数据程序:
132 void Int1_ISR() interrupt 2
133 {
134 1 static unsigned char ps2_revchar_cnt=0;
135 1 EX1=0;
136 1 switch(ps2_revchar_cnt)
137 1 {
138 2 case 1:
139 2 case 2:
140 2 case 3:
141 2 case 4:
142 2 case 5:
143 2 case 6:
144 2 case 7:
145 2 case 8:
146 2 mcu_revchar >>= 1;
147 2 if(PS2_DIO)
148 2 mcu_revchar |= 0x80;
149 2 ps2_revchar_cnt++;
150 2 break;
151 2 case 0:
152 2 ps2_revchar_cnt++;
153 2 break; //开始位,
154 2 case 9:
155 2 ps2_revchar_cnt++;
156 2 break; //校验位,可添加校验程序
157 2 case 10:
158 2 ps2_revchar_cnt=0; //停止位
159 2 revchar_flag=1; //置接收到数据标志位
160 2 break;
161 2 default:
162 2 break;
163 2 }
164 1 EX1=1;
165 1 }
166
167 void decode(void)
168 {
169 1 static unsigned char is_up=0;
170 1 //static unsigned char is_numlock=0;
171 1 //static unsigned char is_capslock=0;
172 1 static unsigned char j;
173 1 unsigned char i;
174 1 CLEARSCREEN;
175 1 // LCD_write_char(2,0,ASCII[mcu_revchar>>4]);
176 1 // LCD_write_char(2,1,ASCII[mcu_revchar&0x0f]);
177 1 if(j>16) j=0;
178 1 switch (mcu_revchar)
179 1 {
C51 COMPILER V7.50 PS2 07/27/2007 22:57:32 PAGE 4
180 2 case 0xF0 :// The up-key identifier
181 2 is_up = 2;
182 2 break;
183 2 case 0xE0 :
184 2 keycode=key_ex;
185 2 break;
186 2 /*
187 2 case 0x77 :
188 2 if(is_up==0)
189 2 if(is_numlock==0)
190 2 {
191 2 led_status |=0x02;
192 2 is_numlock=1;
193 2 }
194 2 else
195 2 {
196 2 led_status &=~0x02;
197 2 is_numlock=0;
198 2 }
199 2 ps2_sentchar(led_status);
200 2 break;
201 2 case 0x58 :
202 2 if(is_up==0)
203 2 if(is_capslock==0)
204 2 {
205 2 led_status |=0x04;
206 2 is_capslock=1;
207 2 }
208 2 else
209 2 {
210 2 led_status &=~0x04;
211 2 is_capslock=0;
212 2 }
213 2 ps2_sentchar(led_status);
214 2
215 2 */
216 2 default:
217 2 for(i = 0; keycode[i][0]!=mcu_revchar && keycode[i][0]; i++);
218 2 if (keycode[i][0] == mcu_revchar) //键值
219 2 {
220 3 LCD_write_char(2,0,keycode[i][1]); //按键名
221 3 LCD_write_char(2,1,'='); //按键名
222 3 LCD_write_char(2,2,ASCII[mcu_revchar>>4]);//键值高
223 3 LCD_write_char(2,3,ASCII[mcu_revchar&0x0f]);//键值低
224 3 //printf("K%c%c ",keycode[i][1],is_up);
225 3 if(is_up==2)
226 3 {
227 4 keycode=key; //defaule is key[][2];
228 4 is_up=0;
229 4 }
230 3 }
231 2 break;
232 2 }
233 1 // LCD_write_char(2,2,ASCII[mcu_revchar>>4]);
234 1 // LCD_write_char(2,3,ASCII[mcu_revchar&0x0f]);
235 1
236 1 /*以下程序段实现的功能是,在液晶屏上显示PS/2键盘上按键的键符*/
237 1 /*
238 1 switch(mcu_revchar)
239 1 {
240 1 case 0x1C:
241 1 LCD_write_char(2,1,disp_letter[0]);
C51 COMPILER V7.50 PS2 07/27/2007 22:57:32 PAGE 5
242 1 break;
243 1 case 0x32:
244 1 LCD_write_char(2,1,disp_letter[1]);
245 1 break;
246 1 case 0x21:
247 1 LCD_write_char(2,1,disp_letter[2]);
248 1 break;
249 1 case 0x23:
250 1 LCD_write_char(2,1,disp_letter[3]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -