📄 key_scan.lst
字号:
C51 COMPILER V8.02 KEY_SCAN 09/17/2008 10:45:02 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEY_SCAN
OBJECT MODULE PLACED IN key_scan.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe key_scan.c DB OE
line level source
1 // 现在由本机判断按下-〉释放为一个完整的击键后报告给MAIN MCU
2
3 //------------------------------------------------------------------------------------
4 //
5 // FILE NAME : KEY_SCAN.c
6 // TARGET DEVICE : C8051F314
7 // CREATED ON : 07/14/06
8 // CREATED BY : Jzp
9 //
10 // Revision 1.0
11 //
12 //------------------------------------------------------------------------------------
13
14 // 键盘扫描程序
15 // - Pinout:
16 // P1.0 -> 键盘矩阵列选线0
17 // P1.1 -> 键盘矩阵列选线1
18 // P1.2 -> 键盘矩阵列选线2
19 // P1.3 -> 键盘矩阵列选线3
20 // P1.4 -> 键盘矩阵行选线0
21 // P1.5 -> 键盘矩阵行选线1
22 // P1.6 -> 键盘矩阵行选线2
23 // P1.7 -> 键盘矩阵行选线3
24 // P2.0 -> 键盘矩阵行选线4
25 // P2.1 -> 键盘矩阵行选线5
26 // P2.2 -> 键盘矩阵行选线6
27 // P2.3 -> 键盘矩阵行选线7
28 // P2.4 -> 键盘矩阵行选线8
29 // P2.5 -> 键盘矩阵行选线9
30 // P2.6 -> 键盘矩阵行选线10
31 // P2.7 -> alpha LED
32 // P0.6 -> 键盘中断请求线
33 //
34 //------------------------------------------------------------------------------------
35 // Includes
36 //------------------------------------------------------------------------------------
37 #include <c8051f310.h> // SFR declarations
38 #include <math.h>
39 #include "..\\inc\\DEFINE.H"
40 #define KEY_SCAN_GLOBALS
41 #include "..\\inc\\key_scan.h"
42
43 //------------------------------------------------------------------------------------
44 // 全局变量
45 //------------------------------------------------------------------------------------
46 UCHAR KbIsPressed; //=0 表示有键值MAIN MCU未读取
47 UCHAR PreKeyValue; //当次扫描前的按键键值
48 //=0x00 表示无按键
49 //=0xff 表示为无效值
50 // 键盘状态变量
51 UCHAR AltKeyOn; //=1 表示当前ALT键切换为ON状态,键值转义
52 UCHAR AlfaKeyOn; //=1 表示当前alpha键切换为ON状态,键值转义
53 UCHAR CtlKeyOn; //=1 表示当前ctrl键切换为ON状态,键值转义
54 UCHAR CapsKeyOn; //=1 表示当前Caps键切换为ON状态,键值转义
55 UCHAR ShiftKeyOn; //=1 表示当前Caps键切换为ON状态,键值转义
C51 COMPILER V8.02 KEY_SCAN 09/17/2008 10:45:02 PAGE 2
56 UCHAR KbIsValid; //=1 表示缓冲当前为有效值
57
58 UCHAR xdata KeyBlOn_Count; //键盘背光打开计时
59 UCHAR xdata second; // 秒计时
60 UCHAR xdata intcount; // 10ms interrupt counter
61 UCHAR xdata KeyDelayCount;
62 //UCHAR KeyBuffer[8]; //记录按键扫描码,当按键为通码时,第二个字节放扫描码,第一个
63 //字节放0xd0,该字节是内部标识符,iic发送程序通过它判断需发送机个字节
64
65 extern UINT Tmr0Reload;
66 extern UCHAR Tmr0High;
67 extern UCHAR Tmr0Low;
68
69 //------------------------------------------------------------------------------------
70 // 函数原型声明
71 //------------------------------------------------------------------------------------
72 UCHAR GetKeyMatrix(void);
73 void KEY_ROW_LOW(UCHAR index);
74
75 //SCHAR OutputPortBit(char PortNum, char Bit, char Value);
76 //------------------------------------------------------------------------------------
77 // 常量定义
78 //------------------------------------------------------------------------------------
79 #define COLNUM 4
80 #define ROWNUM 11
81 //------------------------------------------------------------------------------------
82 // 键码表
83 //------------------------------------------------------------------------------------
84 UCHAR code key_table[][2] = {
85 0x01, '1',//0x31,
86 0x02, '2',//0x32,
87 0x04, '3',//0x33,
88 0x08, '4',//0x34,
89 0x11, '5',//0x35,
90 0x12, '6',//0x36,
91 0x13, '7',//0x37,
92 0x14, '8',//0x38,
93 0x21, '9',//0x39,
94 0x22, ':',//0x3a,
95 0x24, ';',//0x3b,
96 0x28, '<',//0x3c,
97 0x31, '=',//0x3d,
98 0x32, '>',//0x3e,
99 0x34, '?',//0x3f,
100 0x38, '@',//0x40,
101 0x41, 'A',//0x41,
102 0x42, 'B',//0x42,
103 0x44, 'C',//0x43,
104 0x48, 'D',//0x44,
105 0x51, 'E',//0x45,
106 0x52, 'F',//0x46,
107 0x54, 'G',//0x47,
108 0x58, 'H',//0x48,
109 0x61, 'I',//0x49,
110 0x62, 'J',//0x4a,
111 0x64, 'K',//0x4b,
112 0x68, 'L',//0x4c,
113 0x71, 'M',//0x4d,
114 0x72, 'N',//0x4e,
115 0x74, 'O',//0x4f,
116 0x78, 'P',//0x50,
117 0x81, 'Q',//0x51,
C51 COMPILER V8.02 KEY_SCAN 09/17/2008 10:45:02 PAGE 3
118 0x82, 'R',//0x52,
119 0x84, 'S',//0x53,
120 0x88, 'T',//0x54,
121 0x91, 'U',//0x55,
122 0x92, 'V',//0x56,
123 0x94, 'W',//0x57,
124 0x98, 'X',//0x58,
125 0xa1, 'Y',//0x59,
126 0xa2, 'Z',//0x5a,
127 0xa4, '[',//0x5b,
128 0xa8, '\\',//0x5c,
129 0xff, 0
130 };
131
132 //UCHAR code key_table[][2] = {
133 // 0x01, 1,
134 // 0x02, 2,
135 // 0x04, 3,
136 // 0x08, 4,
137 // 0x11, 5,
138 // 0x12, 6,
139 // 0x13, 7,
140 // 0x14, 8,
141 // 0x21, 9,
142 // 0x22, 10,
143 // 0x24, 11,
144 // 0x28, 12,
145 // 0x31, 13,
146 // 0x32, 14,
147 // 0x34, 15,
148 // 0x38, 16,
149 // 0x41, 17,
150 // 0x42, 18,
151 // 0x44, 19,
152 // 0x48, 20,
153 // 0x51, 21,
154 // 0x52, 22,
155 // 0x54, 23,
156 // 0x58, 24,
157 // 0x61, 25,
158 // 0x62, 26,
159 // 0x64, 27,
160 // 0x68, 28,
161 // 0x71, 29,
162 // 0x72, 30,
163 // 0x74, 31,
164 // 0x78, 32,
165 // 0x81, 33,
166 // 0x82, 34,
167 // 0x84, 35,
168 // 0x88, 36,
169 // 0x91, 37,
170 // 0x92, 38,
171 // 0x94, 39,
172 // 0x98, 40,
173 // 0xa1, 41,
174 // 0xa2, 42,
175 // 0xa4, 43,
176 // 0xa8, 44,
177 // 0xff, 0
178 // };
179
C51 COMPILER V8.02 KEY_SCAN 09/17/2008 10:45:02 PAGE 4
180 /************************************************************
181 -----键盘扫描及取键值程序-----
182 功能: 扫描键盘
183 入口参数: 无
184 出口参数:有按键则键值=阵列号,无按键则键值=0xff
185 //UCHAR GetKeyMatrix(void)
186 *************************************************************/
187
188 UCHAR GetKeyMatrix(void)
189 {
190 1 UCHAR i;//,j;
191 1 UCHAR ColValue = 0; //列线0-3的读取电平存储值
192 1 UCHAR CurKeyValue; //初始化无按键
193 1 // 扫描开始
194 1 CurKeyValue = PreKeyValue;
195 1 KEY_ROW_ALL_LOW; //初始行线全部行线输出低电平,试探有无按键
196 1 ColValue = P1&0x0f; //读取列线电平
197 1 if(ColValue == 0x0f) //当前无按键
198 1 {
199 2 if(KbIsPressed == 0) //之前无按键
200 2 {
201 3 CurKeyValue = 0xff; //=0x00 表示无按键
202 3 PreKeyValue = 0xff;
203 3 return CurKeyValue; //返回无效键值
204 3 }
205 2 else //有按键释放
206 2 {
207 3 KbIsPressed = 0;
208 3 KbIsValid = 1; //等待MAIN MCU读取
209 3 return CurKeyValue;
210 3 }
211 2 }
212 1 //开始逐行扫描
213 1 for(i = 0; i < ROWNUM; i++)
214 1 {
215 2 KEY_ROW_LOW(i); //驱动第i列行线
216 2 ColValue = P1&0x0f; //读取列线电平
217 2 if(ColValue != 0x0f)
218 2 {
219 3 KeyDelayCount = 2; //防抖动20ms
220 3 while(KeyDelayCount == 0);
221 3 ColValue = P1&0x0f; //读取列线电平
222 3 if(ColValue != 0x0f) //确实有键按下
223 3 {
224 4 KeyBlOn_Count = 4; // 背光延时重新计数
225 4 KbBlCtl = 1; // 点亮键盘背光
226 4 CurKeyValue = ((i << 4)&0xf0) + (~ColValue&0x0f);
227 4 KbIsPressed = 1;
228 4 break;
229 4 } //end if(ColValue != 0x0f) 2
230 3 } //end if(ColValue != 0x0f) 1
231 2 } //end for
232 1 PreKeyValue = CurKeyValue; // 替换原键值
233 1 return CurKeyValue;
234 1 }
235
236 /************************************************************
237 -----键值转换为扫描码处理程序-----
238 功能:对特殊功能键作相应处理
239 入口参数:GetKeyMatrix函数取得的键值
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -