📄 keyboard.lst
字号:
C51 COMPILER V9.02 KEYBOARD 11/08/2012 21:34:06 PAGE 1
C51 COMPILER V9.02, COMPILATION OF MODULE KEYBOARD
OBJECT MODULE PLACED IN ..\output\KeyBoard.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\source\KeyBoard.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(..\o
-utput\KeyBoard.lst) OBJECT(..\output\KeyBoard.obj)
line level source
1 /*
2 **********************************************************************************************************
-***
3 * Kingst-51
4 * Development board samples
5 *
6 * (c) Copyright 2009-2012, Kingst Studio
7 * All Rights Reserved
8 *
9 * http://www.kingst.org
10 * 文件名:KeyBoard.c
11 * 描 述:键盘功能模块
12 * 版本号:1.0.0
13 **********************************************************************************************************
-***
14 */
15 #define _KEY_BOARD_C
16 #include "config.h"
17 #include "main.h"
18 #include "UartCom.h"
19 #include "Lcd1602.h"
20 #include "KeyBoard.h"
21
22
23 /*
24 ********************************************************************************
25 * ----------------------- Local defines ---------------------------------------
26 ********************************************************************************
27 */
28 const uint8 code KeyCodeMap[4][4] = { //矩阵按键编号到PC标准键盘键码的映射表
29 { '1', '2', '3', 0x26 }, //数字键1、数字键2、数字键3、向上键
30 { '4', '5', '6', 0x25 }, //数字键4、数字键5、数字键6、向左键
31 { '7', '8', '9', 0x28 }, //数字键7、数字键8、数字键9、向下键
32 { '0', 0x1B, 0xC, 0x27 }, //数字键0、ESC键、 回车键、 向右键
33 };
34
35
36 /*
37 ********************************************************************************
38 * ----------------------- Local variables -------------------------------------
39 ********************************************************************************
40 */
41 volatile uint8 KeySta[4][4]; //当前的按键状态
42
43
44 /*
45 ***************************************************************************************************
46 * ---------------------------------- Source codes ------------------------------------------------
47 ***************************************************************************************************
48 */
49
50
51 /*
52 * 函数名:KeyAction
C51 COMPILER V9.02 KEYBOARD 11/08/2012 21:34:06 PAGE 2
53 * 描 述:按键动作的实现函数,根据键码执行相应动作
54 */
55 void KeyAction(uint8 keycode)
56 {
57 1 uint8 buff[4];
58 1
59 1 /* 判断键码执行相应动作 */
60 1 switch (keycode) {
61 2 case 0x0C: //回车键启动/停止秒表计数
62 2 KickStopwatch();
63 2 break;
64 2 case 0x1B: //ESC键重置秒表
65 2 ResetStopwatch();
66 2 break;
67 2 default: //其它键均无动作
68 2 break;
69 2 }
70 1
71 1 /* 将键码值按十六进制形式转换为字符串 */
72 1 buff[0] = (keycode>>4) & 0xF;
73 1 if (buff[0] <= 9) {
74 2 buff[0] += '0';
75 2 }
76 1 else {
77 2 buff[0] += ('A'-10);
78 2 }
79 1 buff[1] = keycode & 0xF;
80 1 if (buff[1] <= 9) {
81 2 buff[1] += '0';
82 2 }
83 1 else {
84 2 buff[1] += ('A'-10);
85 2 }
86 1
87 1 /* 键码显示到液晶屏 */
88 1 buff[2] = '\0';
89 1 Lcd1602ShowStr(buff, 6, 1);
90 1
91 1 /* 键码由串口发送 */
92 1 buff[2] = '\r';
93 1 buff[3] = '\n';
94 1 UartWrite("key code 0x", sizeof("key code 0x")-1);
95 1 UartWrite(buff, 4);
96 1 }
97
98 /*
99 * 函数名:KeyHandle
100 * 描 述:按键动作检测,并提供按键动作函数的执行入口
101 * 备 注:通常本函数需在主循环中调用
102 */
103 void KeyHandle(void)
104 {
105 1 uint8 i, j;
106 1 static uint8 bkKey[4][4];
107 1
108 1 /* 检索按键状态的变化 */
109 1 for (i=0; i<4; i++) {
110 2 for (j=0; j<4; j++) {
111 3 if (bkKey[i][j] != KeySta[i][j]) {
112 4 if (bkKey[i][j] == KEY_UP) {
113 5 /* 按键按下时的动作 */
114 5 KeyAction(KeyCodeMap[i][j]);
C51 COMPILER V9.02 KEYBOARD 11/08/2012 21:34:06 PAGE 3
115 5 }
116 4 else {
117 5 /* 按键弹起时的动作 */
118 5 _nop_();
119 5 }
120 4 bkKey[i][j] = KeySta[i][j];
121 4 }
122 3 }
123 2 }
124 1 }
125
126
127 /*
128 * 函数名:KeyScan
129 * 描 述:4*4矩阵式按键扫描函数
130 * 备 注:本函数需在定时中断中调用,其定时时间、矩阵键盘列数及DEBOUNCE_MASK常数共同决定消抖时间;
131 * 如调用本函数的中断服务函数用using指定了寄存器组,则本函数也需用using指定相同的寄存器组。
132 */
133 void KeyScan(void)
134 {
135 1 uint8 i;
136 1 static uint8 iKeyOut=0;
137 1 static uint8 KeyScanBuff[4][4];
138 1
139 1 /* 扫描按键输入 */
140 1 KeyScanBuff[iKeyOut][0] = ((KeyScanBuff[iKeyOut][0]<<1) | KEY_IN_1) & DEBOUNCE_MASK;
141 1 KeyScanBuff[iKeyOut][1] = ((KeyScanBuff[iKeyOut][1]<<1) | KEY_IN_2) & DEBOUNCE_MASK;
142 1 KeyScanBuff[iKeyOut][2] = ((KeyScanBuff[iKeyOut][2]<<1) | KEY_IN_3) & DEBOUNCE_MASK;
143 1 KeyScanBuff[iKeyOut][3] = ((KeyScanBuff[iKeyOut][3]<<1) | KEY_IN_4) & DEBOUNCE_MASK;
144 1
145 1 /* 消抖后更新按键状态 */
146 1 for (i=0; i<4; i++) {
147 2 if ((KeyScanBuff[iKeyOut][i]&DEBOUNCE_MASK) == DEBOUNCE_MASK) {
148 3 KeySta[iKeyOut][i] = KEY_UP;
149 3 }
150 2 else if ((KeyScanBuff[iKeyOut][i]&DEBOUNCE_MASK) == 0) {
151 3 KeySta[iKeyOut][i] = KEY_DOWN;
152 3 }
153 2 }
154 1
155 1 /* 执行下一列按键输出 */
156 1 iKeyOut = (iKeyOut+1) & 0x3;
157 1 switch (iKeyOut) {
158 2 case 0:
159 2 KEY_OUT_4 = 1;
160 2 KEY_OUT_1 = 0;
161 2 break;
162 2 case 1:
163 2 KEY_OUT_1 = 1;
164 2 KEY_OUT_2 = 0;
165 2 break;
166 2 case 2:
167 2 KEY_OUT_2 = 1;
168 2 KEY_OUT_3 = 0;
169 2 break;
170 2 case 3:
171 2 KEY_OUT_3 = 1;
172 2 KEY_OUT_4 = 0;
173 2 break;
174 2 default:
175 2 break;
176 2 }
C51 COMPILER V9.02 KEYBOARD 11/08/2012 21:34:06 PAGE 4
177 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 458 ----
CONSTANT SIZE = 28 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 49 7
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -