📄 ps2key.lst
字号:
122 =1 0x7D, '9',
123 =1 };
33 #include "assic.h"
1 =1
2 =1 code unsigned char ASSIC2_1[61][2]=
3 =1 {
4 =1 0X15,'q',
5 =1 0x16,'1',
6 =1 0x1a,'z',
7 =1 0x1b,'s',
8 =1 0x1c,'a',
9 =1 0x1d,'w',
10 =1 0x1e,'2',
11 =1 0x21,'c',
12 =1 0x22,'x',
13 =1 0x23,'d',
14 =1 0x24,'e',
15 =1 0x25,'4',
16 =1 0x26,'3',
17 =1 0x29,' ',
C51 COMPILER V7.08 PS2KEY 04/08/2006 16:38:20 PAGE 7
18 =1 0x2a,'v',
19 =1 0x2b,'f',
20 =1 0x2c,'t',
21 =1 0x2d,'r',
22 =1 0x2e,'5',
23 =1 0x31,'n',
24 =1 0x32,'b',
25 =1 0x33,'h',
26 =1 0x34,'g',
27 =1 0x35,'y',
28 =1 0x36,'6',
29 =1 0x3a,'m',
30 =1 0x3b,'j',
31 =1 0x3c,'u',
32 =1 0x3d,'7',
33 =1 0x3e,'8',
34 =1 0x41,',',
35 =1 0x42,'k',
36 =1 0x43,'i',
37 =1 0x44,'o',
38 =1 0x45,'0',
39 =1 0x46,'9',
40 =1 0x49,'.',
41 =1 0x4a,'/',
42 =1 0x4b,'l',
43 =1 0x4c,':',
44 =1 0x4d,'p',
45 =1 0x4e,'-',
46 =1 0x52,'\'',
47 =1 0x54,'[',
48 =1 0x55,'=',
49 =1 0x5b,']',
50 =1 0x5d,'\\',
51 =1 0x69,'1',
52 =1 0x6b,'4',
53 =1 0x6c,'7',
54 =1 0x70,'0',
55 =1 0x71,'.',
56 =1 0x72,'2',
57 =1 0x73,'5',
58 =1 0x74,'6',
59 =1 0x75,'8',
60 =1 0x79,'+',
61 =1 0x7a,'3',
62 =1 0x7b,'-',
63 =1 0x7c,'*',
64 =1 0x7d,'9'
65 =1 };
66 =1 code unsigned char ASSIC2_2[61][2]=
67 =1 {
68 =1 0X15,'Q',
69 =1 0x16,'1',
70 =1 0x1a,'Z',
71 =1 0x1b,'S',
72 =1 0x1c,'A',
73 =1 0x1d,'W',
74 =1 0x1e,'2',
75 =1 0x21,'C',
76 =1 0x22,'X',
77 =1 0x23,'D',
78 =1 0x24,'E',
79 =1 0x25,'4',
C51 COMPILER V7.08 PS2KEY 04/08/2006 16:38:20 PAGE 8
80 =1 0x26,'3',
81 =1 0x29,' ',
82 =1 0x2a,'V',
83 =1 0x2b,'F',
84 =1 0x2c,'T',
85 =1 0x2d,'R',
86 =1 0x2e,'5',
87 =1 0x31,'N',
88 =1 0x32,'B',
89 =1 0x33,'H',
90 =1 0x34,'G',
91 =1 0x35,'Y',
92 =1 0x36,'6',
93 =1 0x3a,'M',
94 =1 0x3b,'J',
95 =1 0x3c,'U',
96 =1 0x3d,'7',
97 =1 0x3e,'8',
98 =1 0x41,',',
99 =1 0x42,'K',
100 =1 0x43,'I',
101 =1 0x44,'O',
102 =1 0x45,'0',
103 =1 0x46,'9',
104 =1 0x49,'.',
105 =1 0x4a,'/',
106 =1 0x4b,'l',
107 =1 0x4c,':',
108 =1 0x4d,'P',
109 =1 0x4e,'-',
110 =1 0x52,'\'',
111 =1 0x54,'[',
112 =1 0x55,'=',
113 =1 0x5b,']',
114 =1 0x5d,'\\',
115 =1 0x69,'1',
116 =1 0x6b,'4',
117 =1 0x6c,'7',
118 =1 0x70,'0',
119 =1 0x71,'.',
120 =1 0x72,'2',
121 =1 0x73,'5',
122 =1 0x74,'6',
123 =1 0x75,'8',
124 =1 0x79,'+',
125 =1 0x7a,'3',
126 =1 0x7b,'-',
127 =1 0x7c,'*',
128 =1 0x7d,'9'
129 =1
130 =1
131 =1
132 =1
133 =1
134 =1
135 =1 };
34 #define LCM_RW P2_6 //定义LCD引脚
35 #define LCM_RS P2_7
36 #define LCM_E P2_5
37 #define LCM_Data P0
38
39 #define Key_Data P3_4 //定义Keyboard引脚
C51 COMPILER V7.08 PS2KEY 04/08/2006 16:38:20 PAGE 9
40 #define Key_CLK P3_3
41
42 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
43
44 void LCMInit(void);
45 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
46 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
47 void Delay5Ms(void);
48 void Delay400Ms(void);
49 void Decode(unsigned char ScanCode);
50 void WriteDataLCM(unsigned char WDLCM);
51 void WriteCommandLCM(unsigned char WCLCM,BuysC);
52
53 unsigned char ReadDataLCM(void);
54 unsigned char ReadStatusLCM(void);
55
56 unsigned char dcode(unsigned char index);
57 char Keyboard_out(void);
58
59 unsigned char code cdle_net[] = {"--www.cdle.net--"};
60 unsigned char code email[] = {"pnzwzw@cdle.net"};
61 unsigned char code Cls[] = {" "};
62 static unsigned char IntNum = 0; //中断次数计数
63 static unsigned char KeyV; //键值
64 static unsigned char DisNum = 0; //显示用指针
65 static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
66 static unsigned char BF = 0; //标识是否有字符被收到
67
68 static unsigned char tt[20];
69 static unsigned char t=0;
70
71
72
73
74 void main(void)
75 {
76 1
77 1 unsigned char TempCyc;
78 1 unsigned n;
79 1 n=dcode(0);
80 1 Delay400Ms(); //启动等待,等LCM讲入工作状态
81 1 LCMInit(); //LCM初始化
82 1 Delay5Ms(); //延时片刻(可不要)
83 1
84 1 DisplayListChar(0, 0, cdle_net);
85 1 DisplayListChar(0, 1, email);
86 1 ReadDataLCM();//测试用句无意义
87 1 for (TempCyc=0; TempCyc<10; TempCyc++)
88 1 Delay400Ms(); //延时
89 1 DisplayListChar(0, 1, Cls);
90 1
91 1 IT1 = 1; //设外部中断1为低电平触发
92 1 EA = 1;
93 1 EX1 = 1; //开中断
94 1
95 1 do
96 1 {
97 2 EX1=1;
98 2 t=Keyboard_out();
99 2 DisplayOneChar(0, 1, dcode(t));
100 2
101 2
C51 COMPILER V7.08 PS2KEY 04/08/2006 16:38:20 PAGE 10
102 2 }
103 1 while(1);
104 1 }
105
106 //写数据
107 void WriteDataLCM(unsigned char WDLCM)
108 {
109 1 ReadStatusLCM(); //检测忙
110 1 LCM_Data = WDLCM;
111 1 LCM_RS = 1;
112 1 LCM_RW = 0;
113 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
114 1 LCM_E = 0; //延时
115 1 LCM_E = 1;
116 1 }
117
118 //写指令
119 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
120 {
121 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
122 1 LCM_Data = WCLCM;
123 1 LCM_RS = 0;
124 1 LCM_RW = 0;
125 1 LCM_E = 0;
126 1 LCM_E = 0;
127 1 LCM_E = 1;
128 1 }
129
130 //读数据
131 unsigned char ReadDataLCM(void)
132 {
133 1 LCM_RS = 1;
134 1 LCM_RW = 1;
135 1 LCM_E = 0;
136 1 LCM_E = 0;
137 1 LCM_E = 1;
138 1 return(LCM_Data);
139 1 }
140
141 //读状态
142 unsigned char ReadStatusLCM(void)
143 {
144 1 LCM_Data = 0xFF;
145 1 LCM_RS = 0;
146 1 LCM_RW = 1;
147 1 LCM_E = 0;
148 1 LCM_E = 0;
149 1 LCM_E = 1;
150 1 while (LCM_Data & Busy); //检测忙信号
151 1 return(LCM_Data);
152 1 }
153
154 void LCMInit(void) //LCM初始化
155 {
156 1 LCM_Data = 0;
157 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
158 1 Delay5Ms();
159 1 WriteCommandLCM(0x38,0);
160 1 Delay5Ms();
161 1 WriteCommandLCM(0x38,0);
162 1 Delay5Ms();
163 1
C51 COMPILER V7.08 PS2KEY 04/08/2006 16:38:20 PAGE 11
164 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
165 1 WriteCommandLCM(0x08,1); //关闭显示
166 1 WriteCommandLCM(0x01,1); //显示清屏
167 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
168 1 WriteCommandLCM(0x0F,1); // 显示开及光标设置
169 1 }
170
171 //按指定位置显示一个字符
172 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
173 {
174 1 Y &= 0x1;
175 1 X &= 0xF; //限制X不能大于15,Y不能大于1
176 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
177 1 X |= 0x80; //算出指令码
178 1 WriteCommandLCM(X, 1); //发命令字
179 1 WriteDataLCM(DData); //发数据
180 1 }
181
182 //按指定位置显示一串字符
183 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
184 {
185 1 unsigned char ListLength;
186 1
187 1 ListLength = 0;
188 1 Y &= 0x1;
189 1 X &= 0xF; //限制X不能大于15,Y不能大于1
190 1 while (DData[ListLength]>0x19) //若到达字串尾则退出
191 1 {
192 2 if (X <= 0xF) //X坐标应小于0xF
193 2 {
194 3 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
195 3 ListLength++;
196 3 X++;
197 3 }
198 2 }
199 1 }
200
201 //5ms延时
202 void Delay5Ms(void)
203 {
204 1 unsigned int TempCyc = 5552;
205 1 while(TempCyc--);
206 1 }
207
208 //400ms延时
209 void Delay400Ms(void)
210 {
211 1 unsigned char TempCycA = 5;
212 1 unsigned int TempCycB;
213 1 while(TempCycA--)
214 1 {
215 2 TempCycB=7269;
216 2 while(TempCycB--);
217 2 };
218 1 }
219 /*
220 void Keyboard_out(void) interrupt 2
221 {
222 unsigned int time;
223 EX1 = 0;
224 do{
225 time=0;
C51 COMPILER V7.08 PS2KEY 04/08/2006 16:38:20 PAGE 12
226 while(Key_CLK){
227 time++;
228 if(time>10000)break;
229 }
230 if ((IntNum > 0) && (IntNum < 9))
231 {
232 KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
233 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
234 }
235 IntNum++;
236 time=0;
237 while (!Key_CLK){
238 time++;
239 if(time>10000)break;
240 }
241 //等待PS/2CLK拉高
242
243 }
244 while(IntNum<11);
245 IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
246 BF = 1; //标识有字符输入完了
247 // EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -