📄 ps2key.lst
字号:
C51 COMPILER V8.05a PS2KEY 10/20/2008 09:46:38 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE PS2KEY
OBJECT MODULE PLACED IN PS2Key.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS2Key.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 #include <at89x52.h>
3 #include "scancodes.h"
4
5 #define LCM_RW P1_1 //定义LCD引脚
6 #define LCM_RS P1_0
7 #define LCM_E P1_2
8 #define LCM_Data P2
9
10 #define Key_Data P3_4 //定义Keyboard引脚
11 #define Key_CLK P3_2
12
13 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
14
15 void LCMInit(void);
16 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
17 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
18 void Delay5Ms(void);
19 void Delay400Ms(void);
20 void Decode(unsigned char ScanCode);
21 void WriteDataLCM(unsigned char WDLCM);
22 void WriteCommandLCM(unsigned char WCLCM,BuysC);
23
24 unsigned char ReadDataLCM(void);
25 unsigned char ReadStatusLCM(void);
26 unsigned char code cdle_net[] = {" youxitun"};
27 unsigned char code email[] = {" QQ 166388866 "};
28 unsigned char code Cls[] = {" "};
29
30 static unsigned char IntNum = 0; //中断次数计数
31 static unsigned char KeyV; //键值
32 static unsigned char DisNum = 0; //显示用指针
33 static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
34 static unsigned char BF = 0; //标识是否有字符被收到
35
36 void main(void)
37 {
38 1 unsigned char TempCyc;
39 1
40 1 RCAP2L=0XD8;
41 1 RCAP2H=0XFF;
42 1 TL2=0XD8;
43 1 TH2=0XFF;
44 1 T2CON=0X34;
45 1 SCON=0X50; //9600bps,12MHZ,T2
46 1
47 1 Delay400Ms(); //启动等待,等LCM讲入工作状态
48 1 LCMInit(); //LCM初始化
49 1 Delay5Ms(); //延时片刻(可不要)
50 1
51 1 DisplayListChar(0, 0, cdle_net);
52 1 DisplayListChar(0, 1, email);
53 1 ReadDataLCM();//测试用句无意义
54 1 for (TempCyc=0; TempCyc<10; TempCyc++)
55 1 Delay400Ms(); //延时
C51 COMPILER V8.05a PS2KEY 10/20/2008 09:46:38 PAGE 2
56 1 DisplayListChar(0, 1, Cls);
57 1 DisplayListChar(0, 0, Cls);
58 1
59 1 IT0 = 0; //设外部中断0为低电平触发
60 1 EA = 1;
61 1 EX0 = 1; //开中断
62 1
63 1 do
64 1 {
65 2 if (BF)
66 2 Decode(KeyV);
67 2 else
68 2 EA = 1; //开中断
69 2 }
70 1 while(1);
71 1 }
72
73 //写数据
74 void WriteDataLCM(unsigned char WDLCM)
75 {
76 1 ReadStatusLCM(); //检测忙
77 1 LCM_Data = WDLCM;
78 1 LCM_RS = 1;
79 1 LCM_RW = 0;
80 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
81 1 LCM_E = 0; //延时
82 1 LCM_E = 1;
83 1 }
84
85 //写指令
86 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
87 {
88 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
89 1 LCM_Data = WCLCM;
90 1 LCM_RS = 0;
91 1 LCM_RW = 0;
92 1 LCM_E = 0;
93 1 LCM_E = 0;
94 1 LCM_E = 1;
95 1 }
96
97 //读数据
98 unsigned char ReadDataLCM(void)
99 {
100 1 LCM_RS = 1;
101 1 LCM_RW = 1;
102 1 LCM_E = 0;
103 1 LCM_E = 0;
104 1 LCM_E = 1;
105 1 return(LCM_Data);
106 1 }
107
108 //读状态
109 unsigned char ReadStatusLCM(void)
110 {
111 1 LCM_Data = 0xFF;
112 1 LCM_RS = 0;
113 1 LCM_RW = 1;
114 1 LCM_E = 0;
115 1 LCM_E = 0;
116 1 LCM_E = 1;
117 1 while (LCM_Data & Busy); //检测忙信号
C51 COMPILER V8.05a PS2KEY 10/20/2008 09:46:38 PAGE 3
118 1 return(LCM_Data);
119 1 }
120
121 void LCMInit(void) //LCM初始化
122 {
123 1 LCM_Data = 0;
124 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
125 1 Delay5Ms();
126 1 WriteCommandLCM(0x38,0);
127 1 Delay5Ms();
128 1 WriteCommandLCM(0x38,0);
129 1 Delay5Ms();
130 1
131 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
132 1 WriteCommandLCM(0x08,1); //关闭显示
133 1 WriteCommandLCM(0x01,1); //显示清屏
134 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
135 1 WriteCommandLCM(0x0F,1); // 显示开及光标设置
136 1 }
137
138 //按指定位置显示一个字符
139 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
140 {
141 1 Y &= 0x1;
142 1 X &= 0xF; //限制X不能大于15,Y不能大于1
143 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
144 1 X |= 0x80; //算出指令码
145 1 WriteCommandLCM(X, 1); //发命令字
146 1 WriteDataLCM(DData); //发数据
147 1 }
148
149 //按指定位置显示一串字符
150 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
151 {
152 1 unsigned char ListLength;
153 1
154 1 ListLength = 0;
155 1 Y &= 0x1;
156 1 X &= 0xF; //限制X不能大于15,Y不能大于1
157 1 while (DData[ListLength]>0x19) //若到达字串尾则退出
158 1 {
159 2 if (X <= 0xF) //X坐标应小于0xF
160 2 {
161 3 DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
162 3 ListLength++;
163 3 X++;
164 3 }
165 2 }
166 1 }
167
168 //5ms延时
169 void Delay5Ms(void)
170 {
171 1 unsigned int TempCyc = 5552;
172 1 while(TempCyc--);
173 1 }
174
175 //400ms延时
176 void Delay400Ms(void)
177 {
178 1 unsigned char TempCycA = 5;
179 1 unsigned int TempCycB;
C51 COMPILER V8.05a PS2KEY 10/20/2008 09:46:38 PAGE 4
180 1 while(TempCycA--)
181 1 {
182 2 TempCycB=7269;
183 2 while(TempCycB--);
184 2 };
185 1 }
186
187
188
189
190 void Keyboard_out(void) interrupt 0
191 {
192 1 if ((IntNum > 0) && (IntNum < 9))
193 1 {
194 2 KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
195 2 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
196 2 }
197 1 IntNum++;
198 1 while (!Key_CLK); //等待PS/2CLK拉高
199 1
200 1 if (IntNum > 10)
201 1 {
202 2 IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
203 2 BF = 1; //标识有字符输入完了
204 2 EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -