?? ps2_bin.lst
字號:
C51 COMPILER V7.07 PS2_BIN 05/26/2005 16:04:50 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE PS2_BIN
OBJECT MODULE PLACED IN PS2_BIN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS2_BIN.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*****************************************************************************/
2 //main.c
3 //功能:從PS/2口接受鍵盤信息,解碼成ACSII碼,通過UART發送出去,并且控制鍵盤
4 //修改:
5 //時間:2006-7-8
6 //作者:R.S.J
7 /*****************************************************************************/
8
9 #include <reg51.h>
10 #include <intrins.h>
11
12 //#include "PS2.h"
13
14 #define EINT (EA = 1)
15 #define DINT (EA = 0)
16
17 #define MAXBUFFER 15
18
19 #define WAITFORKEYBOARDPULSE while(!scl); while(scl)
20
21 #define COMMAND_RESET 0xFF //命令:復位鍵盤
22 #define COMMAND_READID 0xF2 //命令:讀鍵盤ID
23 #define COMMAND_SETSTATUS 0xED //命令:設置狀態CapsLock,NumLock,ScrollLock
24 #define COMMAND_SETRATE 0xF3 //命令:設置速率,延時
25 #define COMMAND_ENABLE 0xF4 //命令:使能鍵盤
26 #define CAPSLOCK_EN 0x04 //使能CapsLock 燈
27 #define NUMLOCK_EN 0x02 //使能NumLock 燈
28 #define SCROLLLOCK_EN 0x01 //使能ScrollLock燈
29 #define CAPSLOCK_DIS 0x03 //關閉CapsLock燈
30 #define NUMLOCK_DIS 0x05 //關閉NumLock燈
31 #define SCROLLLOCK_DIS 0x06 //關閉ScrollLock燈
32 #define DISALL 0x00 //關閉所有燈
33
34
35 #define CODE_POST 0xAA //鍵盤上電自檢成功 Power On Self Test
36 #define CODE_ACK 0xFA //鍵盤應答碼
37 #define CODE_ECHO 0xEE //鍵盤的回應碼
38 #define CODE_BREAK 0xF0 //斷碼
39 #define CODE_EXTEND 0xE0 //擴展碼
40 #define CODE_PAUSE 0xE1 //Pause鍵起始碼 E1+14+77/E1+F0+14/F0+77
41 #define CODE_LSHIFT 0x12 //左Shift鍵通碼
42 #define CODE_RSHIFT 0x59 //右Shift鍵通碼
43 #define CODE_LCTRL 0x14 //左CTRL鍵通碼
44 #define CODE_RCTRL 0x14 //右CTRL鍵通碼 0xE0,0x14
45 #define CODE_LALT 0x11 //左ALT鍵通碼
46 #define CODE_RALT 0x11 //右ALT鍵通碼 0xE0,0x11
47 #define CODE_NUMLOCK 0x77 //NumLock鍵
48 #define CODE_CAPSLOCK 0x58 //CapsLock鍵
49 #define CODE_SCROLLLOCK 0x7E//SCROLLLOCK鍵
50 #define nodefinedkey 0x00//
51
52 #define OUTPORT P2 //電平輸出口定義
53
54 /* 函數定義 */
55 unsigned char ReadPS2(); //讀PS2端口獲取PS2發送的數據
C51 COMPILER V7.07 PS2_BIN 05/26/2005 16:04:50 PAGE 2
56 void KeyScan(); //獲得鍵值
57 void KeyTransmit(); //發送鍵值
58 void Order(unsigned char); //向鍵盤發送命令
59 //void KickDog(); //喂狗
60 void Delay(unsigned char);
61 void LedLock(unsigned char);
62 /* 變量定義 */
63 sbit sda = P3^4; //P3.7做為數據線//^^^^^^^^^^^^^^^^^^^^^^
64 sbit scl = P3^2; //P3.2做為時鐘線
65 sbit key_sw = P1^1; //P1.2作為鍵盤電源開關
66
67 int i;
68 unsigned char KeyCodeBuff[MAXBUFFER+1] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//鍵值緩存
69 unsigned char KeyCodeSum = 0; //鍵碼數
70 bit KeyFlag = 0; //有鍵標志
71 bit KeyUpFlag = 0; //鍵彈起標志
72 bit KeyExtendFlag = 0; //擴展鍵標志
73 bit KeyLedLockFlag = 0; //三個Led鍵被按下的標志
74 bit KeyBoardConnectFlag = 0; //鍵盤連接標志
75 bit KeyPauseFlag = 0; //Pause鍵標志
76 bit KeyMakeCodeFlag = 0; //鍵盤發送通碼標志
77 /*
78 bit CapsLockFlag = 0; //CapsLock標志
79 bit NumLockFlag = 0; //NumLock標志
80 bit ScrollLockFlag = 0; //ScrollLock標志
81 */
82 unsigned char E1flag = 0;//我家的
83 unsigned char E0flag = 0;//
84 ///////////////////////////////////////////
85 unsigned char KeyIDLo = 0; //鍵盤ID低字節
86 unsigned char KeyIDHi = 0; //鍵盤ID高字節
87 unsigned char LedStatus = 0; //NumLock,CapsLock,ScrollLock燈控制
88 unsigned char dat[6]= 0x00; // 輸出數據緩存
89 unsigned char sum=0x00;
90 /*********************************************************/
91 //函數:main()
92 //功能:主函數
93 //輸入:無
94 //輸出:無
95 //描述:
96 /*********************************************************/
97 unsigned char code keyval[]=
98 {
99 0x76,0x05,0x06,0x04,0x0c,0x03,0x0b,0x83,0x0a,0x01,0x09,0x78,0x07,
100 0x0e,0x16,0x1e,0x26,0x25,0x2e,0x36,0x3d,0x3e,0x46,0x45,0x4e,0x55,
101 0x5d,0x66,0x0d,0x15,0x1d,0x24,0x2d,0x2c,0x35,0x3c,0x43,0x44,0x4d,
102 0x54,0x5b,0x58,0x1c,0x1b,0x23,0x2b,0x34,0x33,0x3b,0x42,0x4b,0x4c,
103 0x52,0x5a,0x12,0x1a,0x22,0x21,0x2a,0x32,0x31,0x3a,0x41,0x49,0x4a,
104 0x59,0x14,0x11,0x29,0x7e,0x77,0x7c,0x7b,0x6c,0x75,0x7d,0x6b,0x73,
105 0x74,0x69,0x72,0x7a,0x70,0x71,0x69,0x79,
106
107 };
108 unsigned char code e0_keyval[]=
109 {0x11,0x1F,0x14,0x12,0x70,0x6c,0x7d,0x71,0x69,0x7a,0x4a,0x5a,0x75,0x6b,0x72,0x74,0x5e,0x3f,0x37,0x7c,0x27,
-0x2f};
110 unsigned char code pausekey[]={0xe1,0x14};
111 //unsigned char code pausekey[]={0xe1,0x14}
112
113 void main()
114 {
115 1 DINT; //關中斷
116 1
C51 COMPILER V7.07 PS2_BIN 05/26/2005 16:04:50 PAGE 3
117 1 for(i=0;i<1000;i++)
118 1 ;//延時穩定
119 1
120 1 /* 初始化變量 */
121 1 sda = 0;
122 1 scl = 0; //端口設置為高
123 1 key_sw = 1; //關鍵盤
124 1 for(i=0;i<1000;i++)
125 1 Delay(10);
126 1 for(i = 0;i<16;i++)
127 1 {
128 2 KeyCodeBuff[i] = 0;
129 2 }
130 1 KeyCodeSum = 0;
131 1 KeyFlag = 0;
132 1 KeyUpFlag = 0;
133 1 KeyExtendFlag = 0;
134 1 KeyLedLockFlag = 0;
135 1 KeyBoardConnectFlag = 0;
136 1 KeyPauseFlag = 0;
137 1 KeyMakeCodeFlag = 0;
138 1 KeyIDLo = 0;
139 1 KeyIDHi = 0;
140 1 LedStatus = 0;
141 1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
142 1 TMOD=0x22; // 定時器1 工作于方式2
143 1 //20
144 1 SCON=0x40; // 串口工作于方式1
145 1 TH1=0xfa; //裝入初值,22.1184MHZ 的晶振,9600 的波特率
146 1 TL1=0xfa;
147 1 TL0 = 0xff;
148 1 TH0 = 0xff;
149 1 PCON=0x00; //波特率無倍增
150 1 TR1=1; //開啟定時器1 開始工作
151 1 TR0=1; //開啟定時器0 開始工作
152 1 //EA=1;
153 1 WDT_CONTR = 0x3f; //開硬件狗
154 1 ES=1;
155 1 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
156 1 /*
157 1 TMOD = 0x22; //T1為波特率發生器設置19200波特率
158 1 //T0為采樣鍵盤時鐘發生器
159 1 TL1 = 0xFD;
160 1 TH1 = 0xFD;
161 1 // TL0 =
162 1 // TH0 =
163 1 PCON |= 0x80; //SMOD設置為1
164 1 SCON = 0x50; //串口控制寄存器
165 1 //工作方式
166 1 //非多機通訊方式
167 1 //允許接收
168 1 //
169 1
170 1 TR1 = 1; //定時器1開始
171 1 */
172 1 IT0 = 0; //低電平引起中斷
173 1
174 1 ES = 1; //開串口中斷
175 1 EX0 = 1; //開外部0中斷
176 1 key_sw = 0; //開鍵盤電源
177 1 scl = 1;
178 1 sda = 1;
C51 COMPILER V7.07 PS2_BIN 05/26/2005 16:04:50 PAGE 4
179 1
180 1 Delay(1);
181 1 while(!KeyBoardConnectFlag)
182 1 ReadPS2();//等待鍵盤自檢成功
183 1
184 1 Order(COMMAND_RESET); //復位鍵盤
185 1 ReadPS2(); //等待鍵盤應答
186 1 Delay(5);
187 1
188 1 Order(COMMAND_SETSTATUS);//設置狀態燈CapsLock,NumLock,ScrollLock
189 1 ReadPS2(); //等待鍵盤應答
190 1 LedStatus = DISALL;
191 1 Order(LedStatus); //關閉所有燈
192 1 ReadPS2(); //等待鍵盤應答
193 1 /*
194 1 Order(COMMAND_READID); //讀鍵盤ID
195 1 ReadPS2(); //等待鍵盤應答
196 1 KeyIDLo = ReadPS2(); //獲得鍵盤ID低字節
197 1 KeyIDHi = ReadPS2(); //獲得鍵盤ID高字節
198 1 */
199 1 LedStatus = NUMLOCK_EN; //開NumLock燈
200 1 Order(COMMAND_SETSTATUS);
201 1 ReadPS2(); //等待應答
202 1 Order(LedStatus); //
203 1 ReadPS2(); //等待應答
204 1 Order(COMMAND_SETRATE); //設置速率延時
205 1 ReadPS2(); //等待應答
206 1 Order(0x20); //500ms/30
207 1 ReadPS2();
208 1 Order(COMMAND_ENABLE); //使能鍵盤
209 1 ReadPS2();
210 1 Order(COMMAND_SETRATE); //設置速率延時
211 1 ReadPS2();
212 1 Order(0x20); //
213 1 ReadPS2();
214 1
215 1 Delay(200); //延時
216 1
217 1 EINT; //開總中斷
218 1
219 1 while(1)
220 1 {
221 2 // KeyScan();//掃描鍵盤
222 2 if(KeyFlag == 1)
223 2 {
224 3 KeyFlag = 0;
225 3 KeyTransmit();//
226 3
227 3 }
228 2
229 2 WDT_CONTR = 0x3f;// 喂狗
230 2
231 2 }
232 1 }
233
234 /*********************************************************/
235 //函數:uart
236 //功能:串口中斷
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -