📄 ps2.lst
字号:
C51 COMPILER V7.06 PS2 12/06/2007 14:42:02 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN PS2.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE PS2.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 // PS2 相关口线
2 #include <REG51.H>
3 #define Key_Data P3_0//定义Keyboard引脚
4 #define Key_CLK P3_2
5
6
7 unsigned char Keyboard_out(void) ; // 读 PS2 键盘
8 unsigned char Decode(unsigned char ScanCode) ; // 解码
9 void Delay5Ms();
10 void Delay400Ms();
11
12 void main(void)
13 {
14 1 unsigned char TempCyc;
15 1 unsigned char KEY=0;
16 1
17 1 Delay5Ms(); // 延时片刻(可不要)
18 1
19 1 for (TempCyc=0; TempCyc<10; TempCyc++);
20 1 Delay400Ms(); //
21 1 DisplayListChar(0, 1, Cls);
*** WARNING C206 IN LINE 21 OF PS2.C: 'DisplayListChar': missing function-prototype
*** ERROR C267 IN LINE 21 OF PS2.C: 'DisplayListChar': requires ANSI-style prototype
*** ERROR C202 IN LINE 21 OF PS2.C: 'Cls': undefined identifier
22 1 IT0 = 0; // 设外部中0?为低电平触发
23 1 IT1 = 0; // 设外部中断1为低电平触发
24 1
25 1
26 1 do
27 1 {
28 2 KEY=Keyboard_out(); // 读键盘
29 2 if(KEY)
30 2 {
31 3 CW_char(KEY);
32 3 ROCK(0,KEY);
33 3 KEY=0;
34 3 }
35 2
36 2 }
37 1 while(1);
38 1 }
39
40
41 unsigned char Keyboard_out(void)
42 {
43 1 unsigned char KeyV=0;
44 1 unsigned char IntNum = 0;
45 1 Key_CLK=1;
46 1 EA=0;
47 1 if(!Key_CLK)
48 1 {
49 2 do {
50 3 if ((IntNum >0) && (IntNum < 9))
51 3 {
52 4 KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
C51 COMPILER V7.06 PS2 12/06/2007 14:42:02 PAGE 2
53 4 if (Key_Data)
54 4 KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
55 4 }
56 3 Key_CLK=1;
57 3 IntNum++;
58 3 while (!Key_CLK); //等待PS/2CLK拉高
59 3 while (Key_CLK); //等待PS/2CLK拉低 51fuzi添加
60 3 } while (IntNum<11); //51fuzi更正 原为 while Num<12);
61 2 return (Decode(KeyV)); // 键盘解码
62 2 }
63 1 return 0;
64 1 }
65
66
67 unsigned char Decode(unsigned char ScanCode)
68 //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H?
69 //也就是说shift的通码+G的通码+shift的断码+G的断码
70 {
71 1 unsigned char TempCyc;
72 1 unsigned char KeyChar=0;
73 1 if (!Key_UP) //当键盘松开时
74 1 {
75 2 switch (ScanCode)
76 2 {
77 3 case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
78 3 Key_UP = 1;
79 3 break;
80 3
81 3 case 0x12 : // 左 SHIFT
82 3 Shift = 1;
83 3 break;
84 3
85 3 case 0x59 : // 右 SHIFT
86 3 Shift = 1;
87 3 break;
88 3
89 3 default:
90 3 if (DisNum > 15) DisNum = 0;
91 3 if(!Shift) //如果SHIFT没按下
92 3 {
93 4 for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
94 4 if (UnShifted[TempCyc][0] == ScanCode)
95 4 KeyChar=UnShifted[TempCyc][1];
96 4 DisNum++;
97 4 }
98 3 else //按下SHIFT
99 3 {
100 4 for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
101 4 if (Shifted[TempCyc][0] == ScanCode)
102 4 KeyChar=Shifted[TempCyc][1];
103 4 DisNum++;
104 4 }
105 3
106 3 break;
107 3 }
108 2 }
109 1 else
110 1 {
111 2 Key_UP = 0;
112 2 switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
113 2 {
114 3 case 0x12 : // 左 SHIFT
C51 COMPILER V7.06 PS2 12/06/2007 14:42:02 PAGE 3
115 3 Shift = 0;
116 3 break;
117 3 case 0x59 : // 右 SHIFT
118 3 Shift = 0;
119 3 break;
120 3 }
121 2 }
122 1 return KeyChar;
123 1 }
124
125 void Delay5Ms();
126 {
127 unsigned char i,j;
128 for(i=0;i++;i<5)
129 for (j=0;j++;j<i)
130 ;
131 }
132
133 void Delay400Ms(); {
134 unsigned char i,j;
135 for(i=0;i++;i<400)
136 for (j=0;j++;j<i)
137 ;
138 }
C51 COMPILATION COMPLETE. 1 WARNING(S), 2 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -