外观
五、矩阵按键实验
开发板开源工程链接:https://oshwhub.com/xiezhaoyan/51-dan-pian-ji-diy-kai-fa-ban-97-zhi-cha-jian
1 开发板硬件部分
矩阵按键模块由4*4共计16个按键组成,包括SW1~SW16。矩阵按键的四根行线连接单片机的P2.7、P2.6、P2.5和P2.4(第一行至第四行);四根列线连接单片机的P2.3、P2.2、P2.1、P2.0(第一列至第四列)。
2 Proteus仿真电路
矩阵按键的Proteus仿真电路如图3所示,具体绘制过程,可以参考我的B站视频:https://www.bilibili.com/video/BV1wP411n7zu/?spm_id_from=333.788。
Proteus仿真电路的工程文件见百度网盘链接。
3 Keil程序
矩阵按键16个按键控制最左端数码管显示数字0~9和A、b、C、d、E、F。程序代码见第四部分百度网盘链接。
程序采用行列式扫描方法,便于初学者更好的理解矩阵按键的检测方法。
C
/************************************************************
*实验4-矩阵按键实验
************************************************************/
# include "reg51.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //显示0~F的值
sbit L1=P2^3; //定义列,第一列P2.3
sbit L2=P2^2; //定义列,第二列P2.2
sbit L3=P2^1; //定义列,第三列P2.1
sbit L4=P2^0; //定义列,第四列P2.0
/************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数, i=1时,大约延时10us
************************************************************/
void delay(u16 i)
{
while(i--);
}
/************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
************************************************************/
void main()
{
while(1)
{
P2=0x7F; //行扫描初值,01111111,P2.7=0,第一行
if(L1==0) P0=smgduan[0]; //检测第一列有无按键按下,若有,对应的键值为0
if(L2==0) P0=smgduan[1]; //检测第二列有无按键按下,若有,对应的键值为1
if(L3==0) P0=smgduan[2]; //检测第三列有无按键按下,若有,对应的键值为2
if(L4==0) P0=smgduan[3]; //检测第四列有无按键按下,若有,对应的键值为3
delay(500);
P2=0xBF; //行扫描初值,10111111,P2.6=0,第二行
if(L1==0) P0=smgduan[4]; //检测第一列有无按键按下,若有,对应的键值为4
if(L2==0) P0=smgduan[5]; //检测第二列有无按键按下,若有,对应的键值为5
if(L3==0) P0=smgduan[6]; //检测第三列有无按键按下,若有,对应的键值为6
if(L4==0) P0=smgduan[7]; //检测第四列有无按键按下,若有,对应的键值为7
delay(500);
P2=0xDF; //行扫描初值,11011111,P2.5=0,第三行
if(L1==0) P0=smgduan[8]; //检测第一列有无按键按下,若有,对应的键值为8
if(L2==0) P0=smgduan[9]; //检测第二列有无按键按下,若有,对应的键值为9
if(L3==0) P0=smgduan[10]; //检测第三列有无按键按下,若有,对应的键值为A
if(L4==0) P0=smgduan[11]; //检测第四列有无按键按下,若有,对应的键值为B
delay(500);
P2=0xEF; //行扫描初值,11101111,P2.4=0,第四行
if(L1==0) P0=smgduan[12]; //检测第一列有无按键按下,若有,对应的键值为C
if(L2==0) P0=smgduan[13]; //检测第二列有无按键按下,若有,对应的键值为D
if(L3==0) P0=smgduan[14]; //检测第三列有无按键按下,若有,对应的键值为E
if(L4==0) P0=smgduan[15]; //检测第四列有无按键按下,若有,对应的键值为F
delay(500);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
4 演示视频
具体演示视频,可以参考我的B站视频:https://www.bilibili.com/video/BV1wP411n7zu/?spm_id_from=333.788
相关资源:
链接:https://pan.baidu.com/s/1ONzpoa_dN318TL7SiH9U7A?pwd=ddwy
提取码:ddwy
喜欢的话请关注点赞,开发板的技术交流可以加群:834029577,感谢关注!!!