4乘4矩阵键盘总结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)
186 {
187 P1=0xff;
//P1 口置高,低四位准备接收输入
188 P1_7=0;
//把 P1 口低四位作为输入,高四位作为输出,先扫描第一行,P1^7 发送 0。之前要把高四位进行位
189 if(P1&0x0f!=0x0f) //如果检测到按键有反应
190 {
191 Delay_12M_50ms(); //延迟去抖
4 // 作者:Ryudo 桂林电子科技大学 ryudo@yeah.net
5 // 开发开始时间:2006 年 8 月 15 日
6 // 说明: 涉及到的所有的延时函数配合 C51 延时函数包使用 默认晶振频率 12MHZ
7 // 版本信息:Ver 1.0
8 //*********************************************************
9 // 扫描方法一: 06.8.15 添加 4X4 矩阵按键逐行扫描(一次)识别法函数
10 //
11 // 硬件连接 :
12 //
______________________VCC
13 //
|
|||
14 //
|
|||
15 //
|
|||
16 //
R
RRR
17 //
|
|||
18 //
|
|||
19 //
P X.4 -------/--|---/--|--/--|--/--|
|
|||
|
|||
P X.3 ----------|
|||
|||
|||
P X.2 ----------|------| | |
||
||
P X.1 ----------|------|-----| |
|
|
P X.0 ----------|------|-----|-----|
173 uc_Temp_2=P1;
//把这时 P1 口状态保存在一个变量中 01110000
174 return uc_Temp_1|uc_Temp_2; //'或'操作,返回识别码
01111110
10000001
175 }
176 }
177 }
178 //
179 //**********************************************************************************************
192 if(P1&0x0f!=0x0f) //此时确定有按键按下
193 {
194 switch(P1&0x0f)
195 {
196
case 0x07:
197
/*动作 */; //这里的动作根据实际要求添加,也可以作为返回值使用。
198
break;
199
case 0x0b:
200
/*动作 */;
201
0x18,0x14,0x12,0x11
30 //
|
|||
31 //
|
|||
32 // P X.3 ----------|
|||
33 //
|||
34 //
|||
35 // P X.2 ----------|------|
|
|
36 //
||
37 //
||
38 // P X.1 ----------|------|-----|
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 -------/--|---/--|--/--|--/--|
|
|||
/| /| /| /|
214 P1=0xff;
//P1 口置高,低四位准备接收输入
215 P1_6=0;
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
//延时去抖
169 if(P1&0x0f!=0x0f)
//如果为真,则确实有按键按下
170 {
171 uc_Temp_1=P1; //把这时 P1 口状态保存在一个变量中
00001110
172 P1=0xf0; //把 P1 口高四位置输入,低四位作为输出,注意:这就是'线翻转' (即输入输出翻转)的本质所在
通用识别码: 0x07,0x0b,0x0d,0x0e 0x07,0x0b,0x0d,0x0e 0x07,0x0b,0x0d,0x0e 0x07,0x0b,0x0d,0x0e
115 //*****************************************************************
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 ///////////////////////////////////////
0x48,0x44,0x42,0x41
24 //
|
|||
25 //
/| /| /| /|
26 // P X.5 -------/--|---/--|--/--|--/--|
0x28,0x24,0x22,0x21
27 //
|
|||
28 //
/| /| /| /|
29 // P X.4 -------/--|---/--|--/--|--/--|
|
39 //
|
40 //
|
41 // P X.0 ----------|------|-----|-----|
42 //
43 //************************************************************
44 // 扫Leabharlann Baidu方法二: 06.8.15 添加 4X4 矩阵键盘线翻转识别法函数
/| /| /| /|
20 // P X.7 -------/--|---/--|--/--|--/--| 每个按键对应的识别码是:0x88,0x84,0x82,0x81
21 //
|
|||
22 //
/| /| /| /|
23 // P X.6 -------/--|---/--|--/--|--/--|
123 // 返回的是识别码,调用函数根据识别码动作
124 // 说明:算法稍烦,进阶使用
125
126 unsigned char uc_Line_Scan_Send16(void)
127 {
128 unsigned char uc_Temp_1,uc_Temp_2;
129
P1=0x0f;
//先将所有行线拉低
45 // 硬件连接 :
46 //
|
|||
47 //
/| /| /| /|
48 // P X.7 -------/--|---/--|--/--|--/--|
每个按键对应的识别码是:0x77,0x7b,0x7d,0x7e
49 //
|
|||
50 //
/| /| /| /|
51 // P X.6 -------/--|---/--|--/--|--/--|
116
117 #include<reg51.h>
118 #include<delay.h>
119
120 //********************************************************
121 // 扫描方法一: 4X4 矩阵按键逐行扫描(一次)识别法函数
122 // 函数假设硬件接在 P1 口,及"说明"中 X=1
代码有错,正确的可见单片机上机作业
1 //*********************************************************
2 //****************C51 按键识别函数集源文件 *****************
3 //*********************************************************
156 // 扫描方法二: 4X4 矩阵键盘线翻转识别法函数
157 // 函数假设硬件接在 P1 口,及"说明"中 X=1
158 // 返回的是识别码,调用函数根据识别码动作
159 // 说明 :算法简单易懂,初级使用
160
161 unsigned char uc_Line_Turn(void)
162 {
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();
0xe7,0xeb,0xed,0xee
58 //
|
|||
59 //
|
|||
60 // P X.3 ----------|
|||
61 //
|||
62 //
|||
63 // P X.2 ----------|------|
|
|
64 //
||
65 //
||
66 // P X.1 ----------|------|-----|
136
while(uc_Temp_1&0x08!=0)
//如果四个行线被完整扫描一次还没有完成,就进入循环,继续扫描下一行
137
{
138
P1=uc_Temp_1;
//给 P1 口赋扫描码,每次只拉低一行
139
if(P1&0x0f!=0x0f)
//如果判断为真,则说明找到了按键按下的行
140
{
141
uc_Temp_2=(P1&0x0f)|0xf0;
|
67 //
|
68 //
|
69 // P X.0 ----------|------|-----|-----|
70 //
71
72 //*****************************************************************
73 // 扫描方法三: 06.8.16 添加 4X4 矩阵键盘行扫描识别法函数(只返回 4 个识别码)
148
uc_Temp_1|=0x80; 10111111 11011111 11101111 11110111
149
}
150
}
****0***
151 }
152 }
153 }
154 //
155 //**********************************************************************************************
//计算识别码的算法,灵活性很大。
142
return ((~uc_Temp_1)+(~uc_Temp_2)); //返回识别码,识
143 一个按键,一共有 16 个识别码。
144
}
145
else
//否则依次将第二,第三,第四行拉低
146
{
147
uc_Temp_1>>=1;
01111111 00111111