📄 keypad.lst
字号:
C51 COMPILER V7.50 KEYPAD 07/01/2008 10:35:01 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE KEYPAD
OBJECT MODULE PLACED IN keypad.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE keypad.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /*
3 ****************************************************
4
5 键盘
6
7 ****************************************************
8 */
9
10
11 #include <reg52.H>
12 #include "Typedef.H"
13 #include "UserDef.H"
14 #include "Keypad.h"
15
16
17 //==============================<< 修改1 >>===============================================================
-======
18 // 修改KeyMap,给出正确的按键扫描码
19 // 可在程序的第118行处设断点,并观察按键按下后变量img的值来确定对应的扫描码
20 //========================================================================================================
-=====
21 /* 按键对照表 */
22 static INT32U code KeyMap[][2] = {
23 // 扫描码 虚键码
24 0xFFFF, VK_NULL,
25 0xF7FF, VK_0,
26 0xBFFF, VK_1,
27 0xFBFF, VK_2,
28 0xFFBF, VK_3,
29 0xDFFF, VK_4,
30 0xFDFF, VK_5,
31 0xFFDF, VK_6,
32 0xEFFF, VK_7,
33 0xFEFF, VK_8,
34 0xFFEF, VK_9,
35 0xFFF7, VK_ADD,
36 0xFFFB, VK_SUB,
37 0xFFFD, VK_MUL,
38 0xFFFE, VK_DIV,
39 0xFF7F, VK_EQU,
40 0x7FFF, VK_CLR,
41 };
42
43
44 /* 端口定义 */
45 sbit KP_Col0 = P1^0;
46 sbit KP_Col1 = P1^1;
47 sbit KP_Col2 = P1^2;
48 sbit KP_Col3 = P1^3;
49 sbit KP_Row0 = P1^4;
50 sbit KP_Row1 = P1^5;
51 sbit KP_Row2 = P1^6;
52 sbit KP_Row3 = P1^7;
53
C51 COMPILER V7.50 KEYPAD 07/01/2008 10:35:01 PAGE 2
54
55 /* 全局变量 */
56
57
58 /***************************************************
59
60 按键扫描程序
61
62 ****************************************************/
63 INT8U Keypad_GetKey(void)
64 {
65 1 static INT8U cnt = 0; //按键消抖计数器
66 1 static INT16U PrevImg = 0x0FFF; //上次的扫描码
67 1 static INT16U PrevKey = VK_NULL; //上次有效按键的虚键码
68 1 INT16U img;
69 1 INT8U n;
70 1 BOOLEAN find;
71 1
72 1 img = 0;
73 1 find = FALSE;
74 1
75 1 //获取扫描码
76 1 P1 = 0xFF;
77 1 KP_Col0 = 0;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 1;
78 1 img |= (P1>>4); img <<= 4;
79 1 KP_Col0 = 1;KP_Col1 = 0;KP_Col2 = 1;KP_Col3 = 1;
80 1 img |= (P1>>4); img <<= 4;
81 1 KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 0;KP_Col3 = 1;
82 1 img |= (P1>>4); img <<= 4;
83 1 KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 0;
84 1 img |= (P1>>4);
85 1
86 1 //消抖
87 1 if (PrevImg != img)
88 1 {
89 2 cnt = 0;
90 2 PrevImg = img;
91 2 return VK_NULL;
92 2 }
93 1
94 1 PrevImg = img;
95 1 cnt ++;
96 1 if (cnt < 5)
97 1 {
98 2 return VK_NULL;
99 2 }
100 1
101 1 //本次消抖完毕,计数器清零,为下次消抖做准备
102 1 cnt = 0;
103 1
104 1 //获取按键的虚键码
105 1 for (n=0;n<(sizeof(KeyMap)/8);n++)
106 1 {
107 2 if (KeyMap[n][0] == img)
108 2 {
109 3 find = TRUE;
110 3 break;
111 3 }
112 2 }
113 1
114 1 if (find == TRUE)
115 1 {
C51 COMPILER V7.50 KEYPAD 07/01/2008 10:35:01 PAGE 3
116 2 if (KeyMap[n][1] != PrevKey) //只识别改变的按键动作
117 2 {
118 3 PrevKey = KeyMap[n][1];
119 3 return KeyMap[n][1];
120 3 }
121 2 else
122 2 return VK_NULL;
123 2 }
124 1 else
125 1 return VK_INVALID;
126 1 }
127
128
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 293 ----
CONSTANT SIZE = 136 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 3
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -