当前位置:文档之家› 4乘4矩阵键盘总结

4乘4矩阵键盘总结


|
39 //
|
40 //
|
41 // P X.0 ----------|------|-----|-----|
42 //
43 //************************************************************
44 // 扫描方法二: 06.8.15 添加 4X4 矩阵键盘线翻转识别法函数
0xe7,0xeb,0xed,0xee
58 //
|
|||
59 //
|
|||
60 // P X.3 ----------|
|||
61 //
|||
62 //
|||
63 // P X.2 ----------|------|
|
|
64 //
||
65 //
||
66 // P X.1 ----------|------|-----|
//计算识别码的算法,灵活性很大。
142
return ((~uc_Temp_1)+(~uc_Temp_2)); //返回识别码,识
143 一个按键,一共有 16 个识别码。
144
}
145
else
//否则依次将第二,第三,第四行拉低
146
{
147
uc_Temp_1>>=1;
01111111 00111111
|
67 //
|
68 //
|
69 // P X.0 ----------|------|-----|-----|
70 //
71
72 //*****************************************************************
73 // 扫描方法三: 06.8.16 添加 4X4 矩阵键盘行扫描识别法函数(只返回 4 个识别码)
192 if(P1&0x0f!=0x0f) //此时确定有按键按下
193 {
194 switch(P1&0x0f)
195 {
196
case 0x07:
197
/*动作 */; //这里的动作根据实际要求添加,也可以作为返回值使用。
198
break;
199
case 0x0b:
200
/*动作 */;
201
0x48,0x44,0x42,0x41
24 //
|
|||
25 //
/| /| /| /|
26 // P X.5 -------/--|---/--|--/--|--/--|
0x28,0x24,0x22,0x21
27 //
|
|||
28 //
/| /| /| /|
29 // P X.4 -------/--|---/--|--/--|--/--|
74 // 硬件连接 :
75 //
|
|||
76 //
/| /| /| /|
77 // 78 // 79 // 80 // 81 // 82 // 83 // 84 // 85 // 86 // 87 // 88 // 89 // 90 // 91 // 92 // 93 // 94 // 95 // 96 // 97 // 98 // 99 // 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
186 {
187 P1=0xff;
//P1 口置高,低四位准备接收输入
188 P1_7=0;
//把 P1 口低四位作为输入,高四位作为输出,先扫描第一行,P1^7 发送 0。之前要把高四位进行位
189 if(P1&0x0f!=0x0f) //如果检测到按键有反应
190 {
191 Delay_12M_50ms(); //延迟去抖
116
117 #include<reg51.h>
118 #include<delay.h>
119
120 //********************************************************
121 // 扫描方法一: 4X4 矩阵按键逐行扫描(一次)识别法函数
122 // 函数假设硬件接在 P1 口,及"说明"中 X=1
代码有错,正确的可见单片机上机作业
1 //*********************************************************
2 //****************C51 按键识别函数集源文件 *****************
3 //*********************************************************
163 unsigned char uc_Temp_1,uc_Temp_2;
164 P1=0xff;
//P1 口置高电平,准备输入
165 P1=0x0f;
//P1 口高 4 位作为输出,输出 0,低四位作为输入
166 if(P1&0x0f!=0x0f)
//如果按键有反应
167 {
168 Delay_12M_50ms();
0xb7,0xbb,0xbd,0xbe
52 //
|
|||
53 //
/| /| /| /|
54 // P X.5 -------/--|---/--|--/--|--/--|
0xd7,0xdb,0xdd,0xde
55 //
|
|||
56 //
/| /| /| /|
57 // P X.4 -------/--|---/--|--/--|--/--|
180 // 扫描方法三:4X4 矩阵键盘行扫描识别法函数(4 个识别码)
181 // 函数假设硬件接在 P1 口,及"说明"中 X=1
182 // 说明:个人不推荐使用这种方法,代码比较长,占用大量 CPU 时间,按键有时反应不够灵敏
183 //
184
185 void Line_Scan_Send4(void)
156 // 扫描方法二: 4X4 矩阵键盘线翻转识别法函数
157 // 函数假设硬件接在 P1 口,及"说明"中 X=1
158 // 返回的是识别码,调用函数根据识别码动作
159 // 说明 :算法简单易懂,初级使用
160
161 unsigned char uc_Line_Turn(void)
162 {
130 if(P1&0x0f!=0x0f)
//如果列线有变化
131 {
132 Delay_12M_50ms();
//延迟一段时间。
133 if((P1&0x0f)!=0x0f)
//如果此时此刻列线还有变化,说明确实有按键按下
134 {
135 uc_Temp_1=0x7f;
//用变量保存下第一次发送的扫描码 0111,1111
P X.7 -------/--|---/--|--/--|--/--|
|
|||
/| /| /| /|
P X.6 -------/--|---/--|--/--|--/--|
|
|||
/| /| /| /|
P X.5 -------/--|---/--|--/--|--/--|
|
|||
/| /| /| /|
9 // 扫描方法一: 06.8.15 添加 4X4 矩阵按键逐行扫描(一次)识别法函数
10 //
11 // 硬件连接 :
12 //
______________________VCC
13 //
|
|||
14 //
|
|||
15 //
|
|||
16 //
R
RRR
17 //
|
|||
18 //
|
|||
19 //
123 // 返回的是识别码,调用函数根据识别码动作
124 // 说明:算法稍烦,进阶使用
125
126 unsigned char uc_Line_Scan_Send16(void)
127 {
128 unsigned char uc_Temp_1,uc_Temp_2;
129
P1=0x0f;
//先将所有行线拉低
break;
202
case 0x0d:
203
/*动作 */;
204
break;
205
case 0x0e:
206
/*动作 */;
207
break;
208
default:break;
//不动作
209 }
210 while(P1&0x0f!=0x0f); //等待按键跳起
211 }
212 }
213 ///////////////////////////////////////
通用识别码: 0x07,0x0b,0x0d,0x0e 0x07,0x0b,0x0d,0x0e 0x07,0x0b,0x0d,0x0e 0x07,0x0b,0x0d,0x0e
115 //*****************************************************************
136
while(uc_Temp_1&0x08!=0)
//如果四个行线被完整扫描一次还没有完成,就进入循环,继续扫描下一行
相关主题