单片机/MCU论坛
登录
直播中
韦小齐
12年用户
85经验值
私信
关注
[文章]
新型矩阵键盘编程
键盘
今天逛
论坛
的时候看到一篇讲4*4矩阵键盘的,提出一种矩阵键盘的新型接法,特节省I/O口,贴子没有写程序,只提供了硬件连接,把自己写的程序贴出来供大家交流,有不当之处烦劳各位提出。
硬件连接如下图所示:
可以看到只用了4个口就完成了4*4的键盘。注明:该
电路
非本人所设计。
不才写的程序如下,经过了
proteus
仿真
。
单片机
P1口接1个共阴数码管。键盘连接如上图所示。
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/*void delay(uint x)
{
while(x--);
}*/
uchar keyscan()
{
uchar temp;
P0=0x0f;
temp=P0;
if(temp!=0x0f)
{
delay(3000);
temp=P0;
if(temp!=0x0f)
{
return(temp);
}
}
P0=0x0e;
temp=P0;
if(temp!=0x0e)
{
delay(3000);
temp=P0;
if(temp!=0x0e)
{
temp|=0xf0;
return(temp);
}
}
P0=0x0d;
temp=P0;
if(temp!=0x0d)
{
delay(3000);
temp=P0;
if(temp!=0x0d)
{
temp|=0xe0;
return(temp);
}
}
P0=0x0b;
temp=P0;
if(temp!=0x0b)
{
delay(3000);
temp=P0;
if(temp!=0x0b)
{
temp|=0xd0;
return(temp);
}
}
P0=0x07;
temp=P0;
if(temp!=0x07)
{
delay(3000);
temp=P0;
if(temp!=0x07)
{
temp|=0xc0;
return(temp);
}
}
return 0;
}
void main()
{
uchar whichkey;
P1=0;
while(1)
{
whichkey=keyscan();
switch(whichkey)
{
case 0x0e:P1=table[1];break;
case 0x0d:P1=table[2];break;
case 0x0b:P1=table[3];break;
case 0x07:P1=table[4];break;
case 0xfc:P1=table[5];break;
case 0xfa:P1=table[6];break;
case 0xf6:P1=table[7];break;
case 0xec:P1=table[8];break;
case 0xe9:P1=table[9];break;
case 0xe5:P1=table[10];break;
case 0xda:P1=table[11];break;
case 0xd9:P1=table[12];break;
case 0xd3:P1=table[13];break;
case 0xc6:P1=table[14];break;
case 0xc5:P1=table[15];break;
case 0xc3:P1=table[0];break;
}
}
}
程序比较简单,因为这些天光在论坛上瞎溜达了,没有动手写程序,算是热身了吧。仿真结果显示,按下相应的按键,数码管显示对应的数字。
回帖
(43)
oyl
2012-8-25 21:14:39
四个IO口控制4x4键盘,这种接法不错。你的程序也写的没问题。
P0=0x0f;
p0=0x0e;
p0=0x0d;
p0=0x0b;
p0=0x07;
这几种是可以读回相应键值。写的不错哦。
四个IO口控制4x4键盘,这种接法不错。你的程序也写的没问题。
P0=0x0f;
p0=0x0e;
p0=0x0d;
p0=0x0b;
p0=0x07;
这几种是可以读回相应键值。写的不错哦。
举报
Alex徐
2012-8-26 10:39:52
我有个想法,是用16线4线优先编码器来进行按键信号的处理,这样也只要4个IO口就可以完成一个4*4矩阵键盘的操作,只是不知道是否存在这种编码器。
我有个想法,是用16线4线优先编码器来进行按键信号的处理,这样也只要4个IO口就可以完成一个4*4矩阵键盘的操作,只是不知道是否存在这种编码器。
举报
oyl
2012-8-26 12:31:16
楼主这种方法很不错啊。。
楼主这种方法很不错啊。。
举报
何
2012-8-26 16:36:13
好厉害!
好厉害!
举报
1653494327.257800
2012-8-26 16:42:02
这样的方法还是比较不错的啊
这样的方法还是比较不错的啊
举报
gxyzya
2012-10-19 16:46:51
LZ的程序似乎没有考虑当对地4个按键扫描结束后,扫描其它行时恰好有对地键按下的情况呢,比如P0=0x0f扫描时K1没有按下,扫到P0=0x0e时K1正好按下,此时LZ的程序得到的是K1还是K4按下呢?还有如果是同时按两个按键好像可能会出现误判喔
LZ的程序似乎没有考虑当对地4个按键扫描结束后,扫描其它行时恰好有对地键按下的情况呢,比如P0=0x0f扫描时K1没有按下,扫到P0=0x0e时K1正好按下,此时LZ的程序得到的是K1还是K4按下呢?还有如果是同时按两个按键好像可能会出现误判喔
举报
hzyong
2012-10-19 23:40:23
谢谢分享!!!!!!!
谢谢分享!!!!!!!
举报
7788281
2012-10-20 09:05:24
先顶后看
PCB打样找华强 http://www.hqpcb.com/3 样板2天出货
先顶后看
PCB打样找华强 http://www.hqpcb.com/3 样板2天出货
举报
姜小文
2012-10-21 21:28:14
有点问题,地址重复
有点问题,地址重复
举报
何小飞
2012-10-22 15:43:58
用解码器来实现少量的IO口对多按键的处理控制,我觉得是个思路。
用解码器来实现少量的IO口对多按键的处理控制,我觉得是个思路。
举报
zhanwuplg
2012-10-22 15:49:03
举报
807740
2012-10-22 16:14:53
看看学习
看看学习
举报
869939
2012-10-22 20:17:25
好东西啊 谢谢啦
好东西啊 谢谢啦
举报
ff490029373
2012-10-23 08:40:14
看看 学习 学习
看看 学习 学习
举报
薛凯飞
2012-10-23 11:01:09
不错,值得借鉴...
不错,值得借鉴...
举报
850674
2012-10-23 11:13:27
第一次见这个电路图,感谢分享
第一次见这个电路图,感谢分享
举报
沈凌霄
2012-10-23 12:18:04
举报
richard_wang
2012-10-23 12:21:22
好好学习天天向上谢谢lz
好好学习天天向上谢谢lz
举报
吴勇
2012-10-23 12:58:02
举报
更多回帖
rotate(-90deg);
回复
相关帖子
键盘
矩阵
键盘
C语言
编程
13
4×4
矩阵
键盘
的工作原理与
编程
31
行列反转扫描法在
矩阵
键盘
中的应用及
编程
思想
31
矩阵
键盘
是什么?
矩阵
键盘
怎么用?
1417
一种
新型
的
矩阵
键盘
扫描方式
3405
单片机
矩阵
键盘
编程
2163
矩阵
键盘
的问题
654
矩阵
键盘
4
矩阵
的
键盘
设计
67
矩阵
键盘
0
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分