📄 ps2.lst
字号:
C51 COMPILER V8.05a PS2 04/24/2009 21:28:43 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN PS2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS2.C OPTIMIZE(4,SPEED) DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include "PS2.H"
3 #include <stdio.h>
4
5 BYTE PS2RecChar=0xCC;
6 BOOL KeyBoardFlag=FALSE; //scan code
7 // DB 0C0H,0F9H,0A4H,0B0H ;0-3
8 // DB 099H,092H,082H,0F8H ;4-7
9 // DB 080H,090H,088H,083H ;8-B
10 // DB 0A7H,0A1H,086H,08EH ;C-F
11 unsigned int code SCANCODE[16][8]={ 0xe06b,0xe074,0xe075,0x23,0x3c,0x33,0x42,0x43, //1 行
12 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //2
13 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //3
14 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //4
15 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //5
16 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //6
17 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //7
18 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //8
19 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //9
20 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //10
21 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //11
22 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //12
23 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //13
24 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //14
25 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //15
26 0x15,0xe074,0xe075,0xe06b,0xe072,0x3c,0x33,0x43, //16
27
28
29 };
30 sbit P00=P0^0;
31 sbit P01=P0^1;
32 sbit P02=P0^2;
33 sbit P03=P0^3;
34 sbit P04=P0^4;
35 sbit P05=P0^5;
36 sbit P06=P0^6;
37 sbit P07=P0^7;
38 bit fillDogFlag;
39
40 void OnKeyBoardOnline(BOOL i)
41 {
42 1 KeyBoardFlag=i;
43 1 }
44 //---------------------------------------------------------------------------
45 void OnPS2ReceiveChar(BYTE ReceChar,BOOL P)
46 {
47 1 BOOL ParityBit=0;
48 1 ACC=ReceChar;
49 1 CY=P;
50 1 ParityBit=(BOOL)(CY?0x00:0x80);//奇校验位
51 1 if(P==ParityBit);
52 1 PS2RecChar=ReceChar;
53 1 }
54 //---------------------------------------------------------------------------
55 int OnPS2SendChar(BYTE dat)
C51 COMPILER V8.05a PS2 04/24/2009 21:28:43 PAGE 2
56 { int temp;
57 1 BOOL ParityBit;
58 1 BYTE i;
59 1 ACC=dat;
60 1 CY=P;
61 1
62 1 ParityBit=(BOOL)(CY?0x00:0x80); //奇校验位
63 1
64 1
65 1 CLSSIGNAL();
66 1
67 1 CT_KB=OFF;
68 1 EA=0; //Int0 disable
69 1
70 1 H_DATA=0;Delay10us();//start bit
71 1 H_CLK=1;
72 1 if(H_CLK==1)
73 1 {
74 2 Delay10us();
75 2 H_CLK=0;
76 2 Delay30us();
77 2
78 2 for(i=0;i<8;i++)
79 2 {
80 3 if(dat&0x01==0x01){H_DATA=1;Delay10us();}
81 3 else {H_DATA=0;Delay10us();}
82 3 dat>>=1;
83 3 H_CLK=1;
84 3 Delay10us();
85 3 H_CLK=0;
86 3 Delay30us();
87 3 }
88 2
89 2 H_DATA=ParityBit;Delay10us();//parity bit
90 2 H_CLK=1;
91 2 Delay10us();
92 2 H_CLK=0;
93 2 Delay30us();
94 2
95 2 H_DATA=1;Delay10us();//stop bit
96 2 H_CLK=1;
97 2 Delay10us();
98 2 H_CLK=0;
99 2 Delay30us();
100 2 temp=0x0000;
101 2 }
102 1 else temp=0xffff;// Pc封锁发送 发送失败 errcode 0xfff
103 1
104 1 IE0=0; // cls INt0 ID
105 1
106 1 H_CLK=1;
107 1 H_DATA=1;
108 1
109 1 CT_KB=ON; //大键盘闭合 pc clk Data 连接大键盘
110 1 Delay30us();
111 1 EA=1; // eanble int0
112 1 return temp;
113 1 }
114
115
116
117 //---------------------------------------------------------------------------
C51 COMPILER V8.05a PS2 04/24/2009 21:28:43 PAGE 3
118 void ExternInterrupt0(void) interrupt 0
119 {
120 1 BOOL ParityBit=0,CLKFlag=1;
121 1 BYTE i=0,j=8,dat=0x00;
122 1
123 1 EA=0;
124 1
125 1 while(CLKFlag)
126 1 {
127 2 i++;
128 2 if(H_CLK==1)CLKFlag=0;
129 2 if(i>0xEE)
130 2 { printf("Rcv err At Flag\n");
131 3 IE0=0;
132 3 EX0=1;
133 3 return ;
134 3 }
135 2 }
136 1 //while(j--)//延时等待大键盘的动作
137 1 //{
138 1 // for(i=0;i<0x88;i++)//检查是否有数据处理 0x88
139 1 // {
140 1 // if(H_CLK==0)//有动作则是大键盘存在
141 1 // {
142 1 // OnKeyBoardOnline(TRUE);//大键盘存在,开机由大键盘应答
143 1 // IE0=0;
144 1 // EX0=1;
145 1 //// return ;//存在的话置标志位,并返回
146 1 // }
147 1 // }
148 1 //}
149 1
150 1 OnKeyBoardOnline(FALSE);//大键盘不存在,由小键盘应答
151 1
152 1
153 1 //转到接收
154 1 for(i=0;i<8;i++)//read 8bit
155 1 {
156 2 Delay30us();
157 2 H_CLK=0;
158 2 Delay30us();
159 2 H_CLK=1;
160 2 dat=dat>>1;
161 2 if(H_DATA)dat|=0x80;
162 2
163 2 if(H_CLK==0){ printf("Rcv Err\n"); return ; }//如果时钟被拉低,则有错误发生
164 2 }
165 1
166 1 Delay30us();
167 1 H_CLK=0;
168 1 Delay30us();
169 1 H_CLK=1;
170 1 if(H_DATA)ParityBit=1;
171 1 else ParityBit=0;
172 1
173 1 Delay30us();
174 1 H_CLK=0;
175 1 Delay30us();
176 1 H_CLK=1;//STOP BIT H_DATA 0 ERR
177 1
178 1 Delay10us();
179 1 H_DATA=0; //ACK bit
C51 COMPILER V8.05a PS2 04/24/2009 21:28:43 PAGE 4
180 1 Delay10us();
181 1 H_CLK=0;
182 1 Delay30us();Delay30us();
183 1 H_CLK=1;
184 1 Delay30us();
185 1 H_DATA=1;
186 1
187 1 OnPS2ReceiveChar(dat,ParityBit); // 记录到PS2Recchar 中
188 1 printf("RcvDat %x\n",(unsigned int)PS2RecChar);
189 1 IE0=0; //Cls Biao ji
190 1 EA=1; //允许中断
191 1 return ;
192 1 }
193 //---------------------------------------------------------------------------
194 void ProcessPS2(void)
195 { EA=0;
196 1 if(PS2RecChar!=0xCC )//大键盘不存在
197 1 {
198 2 if(PS2RecChar==0xF3)//1
199 2 {
200 3 OnPS2SendChar(0xFA);
201 3 PS2RecChar=0xCC;
202 3 }
203 2 else if(PS2RecChar==0x00)//11
204 2 {
205 3 OnPS2SendChar(0xFA);
206 3 PS2RecChar=0xCC;
207 3 }
208 2 else if(PS2RecChar==0x02)//111
209 2 {
210 3 OnPS2SendChar(0xFA);
211 3 PS2RecChar=0xCC;
212 3 }
213 2 else if(PS2RecChar==0x20)//1111
214 2 {
215 3 OnPS2SendChar(0xFA);
216 3 PS2RecChar=0xCC;
217 3 }
218 2 else if(PS2RecChar==0xED)//2 0xED (Set/Reset LEDs) 主机在本命令后跟随一个参数字节用于指示键盘上Num Lock
-, Caps Lock,
219 2 // and Scroll Lock LED 的状态这个参数字节的定义如下
220 2 {
221 3 OnPS2SendChar(0xFA);
222 3 PS2RecChar=0xCC;
223 3 }
224 2 else if(PS2RecChar==0xF0) //3
225 2 {
226 3 OnPS2SendChar(0xFA);
227 3 PS2RecChar=0xCC;
228 3 }
229 2 else if(PS2RecChar==0xF2)//4 *0xF2 (Read ID) 键盘回应两个字节的设备ID 0xAB 0x83
230 2 {
231 3 OnPS2SendChar(0xFA);
232 3 Delay30us();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -