0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

单片机8x8矩阵键盘原理说明

姚小熊27 来源:网络整理 2018-02-24 16:14 次阅读

基于单片机接矩阵键盘原理

单片机与矩阵键盘连接如下图:

单片机8x8矩阵键盘原理说明

此图用P1口P1.0---P1.3接4行P1.4--P1.7接4列

矩阵键盘工作原理:由于按键没有接地,4行4列正好占用8个I/O如果4行我们送P3.0到P3.3送入0111然后去读取4列的值,如果P3.0的按键按下那么P3.4---P3.7的值等于0111,假如是第2个键按下的话那么读回来的值是1011,如果第3个键按下去读回来的值是1101,如果第4个键按下去读回来的值是1110,如果没有键按下去读回来就是1111。所以我们就根据读回来的值来判断按下去的是那个键。当然这是对P3.0这一行,因为矩阵键盘是扫描的,所以下次把P3.0给1P3.1给0对第2行,陆续的第3行第4行,0111101111011110而每次都去从新扫描一遍列值列有4个值,以确定是那个键按下。无论何时任何一个时间有一个按键被按下就跳出循环。当然不可能有2个键刚好一起按下你的手没有这么好的力度,就算有2个键一起按键,程序也有先后检测的顺序,只能检测一个后面的检测不到。

P3=0XFE;//第一行给0

temp;定义个变量

temp=P3;读回来由于读需要先写1因为P3=FE已经把高4位给1了所以能读了

temp&oxf0如果没有按键按下结果还是0xf0。如果有键按下结果就不是0xf0了。

num然后我们再定义一个变量让它赋值给这个按下去的按键值。

一次类推把第一行赋值0扫描一遍然后把第2行赋值0扫描一遍。。。。。。。。。。。。。。共扫描16遍。

只要有键按下就会得到一个值num就从1排到16.共16个按键4*4的矩阵键盘。

我再总结下思路:

首先低4位是行共4行分别把每行给0低电平就4次0111、1011、1101、1110对吧

然后去检测高4位4列啊先不考虑极端情况,4列就4个按键只要按下一个P3口的高4位就会有一个值。根据这个值就能判断是那个键了。

如:P3=11111110低四位是行先把第一行给0

有按键下的话temp=P3读回来11011110然后temp&0xf0与运算下就判断下还等于oxf0吗?如还等于就没有按下,如果不等于就肯定有按键按下。定义个变量让它等于这个不是0XF0的值,做个标记。依次类推。

单片机8x8矩阵键盘原理说明

小编使用proteus模拟了一个8x8的矩阵键盘。以下是原理图:

单片机8x8矩阵键盘原理说明

启动后的原来图,还没有按键按下:

单片机8x8矩阵键盘原理说明

再来一张,有按键按下的情况:

单片机8x8矩阵键盘原理说明

代码如下:

#include《reg52.h》

#defineucharunsignedchar

#defineuintunsignedint

//共阴极数码管0~9

ucharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

uchartmp;//暂存P2的值

ucharkeynum;//按键值

ucharshi,ge;//数码管个位和十位显示

sbitP36=P3^6;//数码管时能端

sbitP37=P3^7;

//数码管显示声明

voiddisplay();

//毫秒级延时

voiddelay(uintz)

{

uintx,y;

for(x=z;x》0;x--)

for(y=110;y》0;y--);

}

voidkeyscan()

{

P0=0xfe;//扫描第1行

if(P2!=0xff)//有按键按下

{

tmp=P2;

delay(5);

if(P2!=0xff)//延时后确定有按键按下

{

switch(tmp)

{

case0xfe:keynum=1;break;//第1行第1个按键按下

case0xfd:keynum=2;break;//第1行第2个按键按下

case0xfb:keynum=3;break;//第1行第3个按键按下

case0xf7:keynum=4;break;//第1行第4个按键按下

case0xef:keynum=5;break;//第1行第5个按键按下

case0xdf:keynum=6;break;//第1行第6个按键按下

case0xbf:keynum=7;break;//第1行第7个按键按下

case0x7f:keynum=8;break;//第1行第8个按键按下

}

while(tmp!=0xff)//等待按键松手

{

tmp=P2;

display();

}

}

}

delay(5);

P0=0xfd;//扫描第2行

if(P2!=0xff)//有按键按下

{

tmp=P2;

delay(5);

if(P2!=0xff)//延时后确定有按键按下

{

switch(tmp)

{

case0xfe:keynum=9;break;//第2行第1个按键按下

case0xfd:keynum=10;break;//第2行第2个按键按下

case0xfb:keynum=11;break;//第2行第3个按键按下

case0xf7:keynum=12;break;//第2行第4个按键按下

case0xef:keynum=13;break;//第2行第5个按键按下

case0xdf:keynum=14;break;//第2行第6个按键按下

case0xbf:keynum=15;break;//第2行第7个按键按下

case0x7f:keynum=16;break;//第2行第8个按键按下

}

while(tmp!=0xff)

{

tmp=P2;

display();

}

}

}

delay(5);

P0=0xfb;//扫描第3行

if(P2!=0xff)//有按键按下

{

tmp=P2;

delay(5);

if(P2!=0xff)//延时后确定有按键按下

{

switch(tmp)

{

case0xfe:keynum=17;break;//第3行第1个按键按下

case0xfd:keynum=18;break;//第3行第2个按键按下

case0xfb:keynum=19;break;//第3行第3个按键按下

case0xf7:keynum=20;break;//第3行第4个按键按下

case0xef:keynum=21;break;//第3行第5个按键按下

case0xdf:keynum=22;break;//第3行第6个按键按下

case0xbf:keynum=23;break;//第3行第7个按键按下

case0x7f:keynum=24;break;//第3行第8个按键按下

}

while(tmp!=0xff)

{

tmp=P2;

display();

}

}

}

delay(5);

P0=0xf7;//扫描第4行

if(P2!=0xff)//有按键按下

{

tmp=P2;

delay(5);

if(P2!=0xff)//延时后确定有按键按下

{

switch(tmp)

{

case0xfe:keynum=25;break;//第4行第1个按键按下

case0xfd:keynum=26;break;//第4行第2个按键按下

case0xfb:keynum=27;break;//第4行第3个按键按下

case0xf7:keynum=28;break;//第4行第4个按键按下

case0xef:keynum=29;break;//第4行第5个按键按下

case0xdf:keynum=30;break;//第4行第6个按键按下

case0xbf:keynum=31;break;//第4行第7个按键按下

case0x7f:keynum=32;break;//第4行第8个按键按下

}

while(tmp!=0xff)

{

tmp=P2;

display();

}

}

}

delay(5);

P0=0xef;//扫描第5行

if(P2!=0xff)//有按键按下

{

tmp=P2;

delay(5);

if(P2!=0xff)//延时后确定有按键按下

{

switch(tmp)

{

case0xfe:keynum=33;break;//第5行第1个按键按下

case0xfd:keynum=34;break;//第5行第2个按键按下

case0xfb:keynum=35;break;//第5行第3个按键按下

case0xf7:keynum=36;break;//第5行第4个按键按下

case0xef:keynum=37;break;//第5行第5个按键按下

case0xdf:keynum=38;break;//第5行第6个按键按下

case0xbf:keynum=39;break;//第5行第7个按键按下

case0x7f:keynum=40;break;//第5行第8个按键按下

}

while(tmp!=0xff)

{

tmp=P2;

display();

}

}

}

delay(5);

P0=0xdf;//扫描第6行

if(P2!=0xff)//有按键按下

{

tmp=P2;

delay(5);

if(P2!=0xff)//延时后确定有按键按下

{

switch(tmp)

{

case0xfe:keynum=41;break;//第6行第1个按键按下

case0xfd:keynum=42;break;//第6行第2个按键按下

case0xfb:keynum=43;break;//第6行第3个按键按下

case0xf7:keynum=44;break;//第6行第4个按键按下

case0xef:keynum=45;break;//第6行第5个按键按下

case0xdf:keynum=46;break;//第6行第6个按键按下

case0xbf:keynum=47;break;//第6行第7个按键按下

case0x7f:keynum=48;break;//第6行第8个按键按下

}

while(tmp!=0xff)

{

tmp=P2;

display();

}

}

}

delay(5);

P0=0xbf;//扫描第7行

if(P2!=0xff)//有按键按下

{

tmp=P2;

delay(5);

if(P2!=0xff)//延时后确定有按键按下

{

switch(tmp)

{

case0xfe:keynum=49;break;//第7行第1个按键按下

case0xfd:keynum=50;break;//第7行第2个按键按下

case0xfb:keynum=51;break;//第7行第3个按键按下

case0xf7:keynum=52;break;//第7行第4个按键按下

case0xef:keynum=53;break;//第7行第5个按键按下

case0xdf:keynum=54;break;//第7行第6个按键按下

case0xbf:keynum=55;break;//第7行第7个按键按下

case0x7f:keynum=56;break;//第7行第8个按键按下

}

while(tmp!=0xff)

{

tmp=P2;

display();

}

}

}

delay(5);

P0=0x7f;//扫描第8行

if(P2!=0xff)//有按键按下

{

tmp=P2;

delay(5);

if(P2!=0xff)//延时后确定有按键按下

{

switch(tmp)

{

case0xfe:keynum=57;break;//第8行第1个按键按下

case0xfd:keynum=58;break;//第8行第2个按键按下

case0xfb:keynum=59;break;//第8行第3个按键按下

case0xf7:keynum=60;break;//第8行第4个按键按下

case0xef:keynum=61;break;//第8行第5个按键按下

case0xdf:keynum=62;break;//第8行第6个按键按下

case0xbf:keynum=63;break;//第8行第7个按键按下

case0x7f:keynum=64;break;//第8行第8个按键按下

}

while(tmp!=0xff)

{

tmp=P2;

display();

}

}

}

delay(5);

}

voiddisplay()

{

//显示个位

P37=0;

P1=table[ge];

delay(5);

P37=1;

//显示十位

P36=0;

P1=table[shi];

delay(5);

P36=1;

}

voidmain()

{

while(1)

{

shi=keynum/10;

ge=keynum;

keyscan();

display();//这里的显示是保存上一次的显示值

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620800
  • 矩阵键盘
    +关注

    关注

    7

    文章

    204

    浏览量

    31125
收藏 人收藏

    评论

    相关推荐

    8x8点阵相关问题提问

    本人单片机入门不久,但是没有什么实战经验,现在想做一个8x8点阵的小电路,但是没有这方面的编程经验。所以小弟在此特意求助于各位大神,请多多指教。
    发表于 10-11 23:13

    问一下,51单片机8x8点阵怎么连接到单片机,,,,,谢谢

    问一下,51单片机8x8点阵怎么连接到单片机,,,,,谢谢
    发表于 11-28 16:18

    基于单片机8x8点阵贪吃蛇游戏

    单片机编写一个8x8点阵贪吃蛇游戏,蛇每吃完15颗蛋之后,游戏晋级到下一级,速度加快一级,蛇长恢复两节重新开始,这一部分的代码该怎么写呢?求解?
    发表于 04-20 15:02

    还剩个P1 我要做个8x8矩阵键盘 怎样的拓展方法最合适

    还剩个P1我要做个8x8矩阵键盘怎样的拓展方法最合适 每个键值必须明确
    发表于 03-20 10:43

    8x8矩阵显示LED驱动芯片AS1116相关资料分享

    8x8矩阵显示LED驱动芯片AS1116资料下载内容主要介绍了:AS1116引脚功能AS1116内部方框图AS1116典型应用电路
    发表于 04-01 07:16

    51单片机学习记录(8) “8X8点阵 精选资料推荐

    51单片机学习记录(8) “8x8点阵”8x8点阵就是由64个小led灯组成的矩阵,现在先让我们看一下点阵的内部结构从图中可以了解到(从行看
    发表于 07-15 06:45

    请问51单片机如何实现8X8点阵的显示?

    请问51单片机如何实现8X8点阵的显示?
    发表于 10-15 08:19

    单片机矩阵键盘判断

    单片机矩阵键盘判断某个按键按下这是我第一次发表文章,关于51单片机矩阵键盘逐行逐列扫描是否有按
    发表于 12-08 07:12

    如何利用单片去设计8x8矩阵键盘串口通信

    /*-------------------------------------------------------------------------------------------------------------------------------- 说明:发送端单片机
    发表于 12-13 08:16

    什么是矩阵键盘

    矩形键盘介绍什么是矩阵键盘矩阵键盘的原理驱动电路图软件程序实现介绍什么是矩阵
    发表于 01-07 07:43

    矩阵键盘检测独立按键与单片机连接

    4.2 矩阵键盘检测独立按键与单片机连接时,每个按键都需要单片机的一个I/O口,若单片机系统需要较多按键,如果用独立按键,会占用过多的I/O
    发表于 02-22 06:14

    什么是矩阵键盘矩阵键盘扫描原理介绍

    矩阵键盘矩阵键盘简介矩阵键盘扫描原理端口的配置相关函数的编写主函数与其他串口的接线与
    发表于 02-28 06:32

    使用74HC595的8x8 LED矩阵电路

    描述使用 74HC595 的 8x8 LED 矩阵电路我画这个电路是为了减少与 Arduino 平台的连接数量,它使用 2 个移位寄存器 74HC595 和 8 个限流电阻。它可以看作是 MAX7219 电路的替代方案。它完美地
    发表于 08-09 06:53

    如何在8x8 LED点矩阵屏幕上滚动文本

    。 在这种情况下, LED 屏幕需要能够滚动到文本中 。 此样本代码主要用于演示如何在 8x8 LED 点矩阵屏幕上滚动文本。 我们希望在 LED 点矩阵屏幕上显示文本, 通常通过动态扫描来驱动
    发表于 09-01 06:15

    一种实用的单片机矩阵键盘设计

    矩阵键盘单片机外部设备中所使用的排布类于矩阵键盘组。矩阵式结构的
    发表于 11-24 07:42 558次阅读