51单片机2X2单片机矩阵键盘程序的实现,求指点。

矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
矩阵键盘电路
矩阵键盘实现16个按键操作原理及应该方案
矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。矩阵键盘的优点是节约单片机IO口,例如普通键盘8个IO口只能用作8个按键,而矩阵键盘能作16个按键。
本文以51单片机为载体介绍一种4*4矩阵键盘实现16个按键操作的原理、电路和软件设计要点。
1、 矩阵键盘的一般电路
如图 1矩阵键盘电路所示,4*4矩阵键盘有4行4列按键,单片机4个I/O口接矩阵键盘的行线,另外4个I/O口接矩阵键盘的列线,通过对行线列线的操作完成按键的识别和操作。
2、 矩阵键盘的原理
矩阵键盘按键识别的流程一般是这样的:(1)置第1行为低电平(0),其余行为高电平,读取列线数据,列线有低电平表示此行有按键按下。(2)置第2行为低电平(0),其余行为高电平,读取列线数据,列线有低电平表示此行有按键按下。......(N-1)根据行线列线的电平不同可以识别是否有按键按下,哪一个按键按下,获取按键号。(N) 根据按键号跳转至对应的按键处理程序。
3、 一个矩阵键盘程序的例子
图2为按键处理的主流程,思路是依次拉低按键的各个行,再读取列线的数据,假如列线有低电平,则认为此行有按键按下,标记此行有按键按下并存入行值。
读取列线数据的思路则是这样,依次读取第1-4列,假如读取此列时为低电平,则标记并存入列值。
下面是部分代码:
//(1)按键识别程序void key() //按键扫描{unsigned char key_value_ //临时按键值,默认(二进制)key_value=0
//键值key_value_temp=0 //键值临时变量//矩阵键盘程序流程//依次拉低第1234行,读入列线数据Pin_r_1=0; Pin_r_2=1;Pin_r_3=1;Pin_r_4=1; //拉低第1行。//Pin_r_1第1行行线,Pin_r_2第2行行线,其余类似key_value_temp=read_column();//读列数据if (key_value_temp != 0xff)
//表示第一行有按键按下{key_value=key_value_temp & 0x1f;//获取按键号,例如0001
1101表示第1行第2列的按键按下}Pin_r_1=1; Pin_r_2=0;Pin_r_3=1;Pin_r_4=1; //拉低第2行key_value_temp=read_column();//读列数据if (key_value_temp != 0xff)
//表示第2行有按键按下{key_value=key_value_temp &0x2f;}Pin_r_1=1; Pin_r_2=1;Pin_r_3=0;Pin_r_4=1; //拉低第3行key_value_temp=read_column();//读列数据if (key_value_temp != 0xff)
//表示第3行有按键按下{key_value=key_value_temp &0x3f;}Pin_r_1=1; Pin_r_2=1;Pin_r_3=1;Pin_r_4=0; //拉低第4行key_value_temp=read_column();//读列数据if (key_value_temp != 0xff)
//表示第4行有按键按下{key_value=key_value_temp &0x4f;}}//(2)读取列线数据unsigned char read_column() //读矩阵键盘的列{unsigned char key_key_column=0if(Pin_c_1==0 ) key_column=key_column & 0//1110
表示第1列按键按下。 key_column的低4位表示按键号,高4位常为1111if(Pin_c_2==0 ) key_column=key_column & 0//1101
表示第2列按键按下。if(Pin_c_3==0 ) key_column=key_column & 0//1011
表示第3列按键按下。if(Pin_c_4==0 ) key_column=key_column & 0xf7;//0111
表示第4列按键按下。return key_}以上程序对应的键值表如下:
原文标题:一种单片机矩阵键盘设计,实在是太实用了~~~~
文章出处:【微信号:Mouser-Community,微信公众号:贸泽电子设计圈】欢迎添加关注!文章转载请注明出处。
关注电子发烧友微信
有趣有料的资讯及技术干货
下载发烧友APP
打造属于您的人脉电子圈
关注发烧友课堂
锁定最新课程活动及技术直播
发布评论请先
本文内容为7.7 数码管与矩阵键盘联合使用、7.8 ZLG72128——数码管与键盘管理、7.9 温....
对于元器件在万能板上的布局,大多数人习惯“顺藤摸瓜”,就是以芯片等关键器件为中心,其他元器件见缝插针....
本文介绍了一种基于RS232行列式矩阵键盘接口的设计方案,本方案是用VHDL语言来实现的基于RS23....
在嵌入式系统开发中,经常通过键盘来实现人机交互。本文介绍了一种直接利用ARM的I/O口扩展矩阵键盘的....
ACV62KBD-2矩阵键盘产品是用于系统控制和系统编程的专用设备,是按照人机原理进行设计的系统控制....
VNS网络控制矩阵键盘是与VNS系列网络数字矩阵配套使用的全功能控制键盘,可通过以太网网络控制直接操....
C51单片机矩阵键盘电子扫描去抖程序 这段有1个C51的项目,用的是新华龙的C51 F020单片机。....
电子发烧友网为大家提供了点阵型LCD和矩阵键盘电路,本站还有矩阵键盘的其他相关知识,希望对您有所帮助....
电子发烧友网为大家提供了矩阵键盘电路,本站还有其他相关资源,希望对您有所帮助!
矩阵式结构的键盘识别要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列....
将键值显示在七节显示器上的单片机源码。把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,....
本文提出了一种针对LCD控制器和矩阵键盘的IP核的设计方法。该方法利用SOPC Builder中元件....
用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3....
赛普拉斯(Cypress)宣布推出新款CY8CMBR2016 元件让研发业者轻松建置44的电容式矩阵....
数码管显示矩阵键盘扫描值
/*矩阵键盘扫描出键值,在数码管上显示出来
P0口接数码管....
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司
电信与信息服务业务经营许可证:粤B2-21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
查看: 9253|回复: 61
51单片机4X4矩阵键盘检测。。。为啥不行啊。。求大神
&&已结帖(10)
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
本帖最后由 hunxiyi 于
12:13 编辑
4X4矩阵键盘,四行依次与P3口的0、1、2、3口相连。。
四列依次与4、5、6、7口相连
编写下列程序。。。感觉没有什么问题。。但是烧进板子里,只有0、4、8、c可以显示,其它12个键都没效果、、
想了N天都没办法。。。请大神出马、、、
#include&reg52.h&
#define uchar unsigned char
#define uint unsigned int
sbit weix =&&P2^7;
sbit duanx = P2^6;
uchar code table[] = {0x3f,0x06,0x5b,0x4f,
& && && && && && && && && && && && && & 0x66,0x6d,0x7d,0x07,
& && && && && && && && && && && && && & 0x7f,0x6f,0x77,0x7c,
& && && && && && && && && && && && && & 0x39,0x5e,0x79,0x71
& && && && && && && && && && && && && & };
void init();
void keyscan();
void display();
void delay(uint x);
uchar i,key,k = 88;
void main()
& && &&&init();& && && && && && && && &//初始化
& && &&&while(1)& && && && && &
& && && && && & keyscan();& && && && && && && && &//矩阵键盘扫描
& && && && && & display();& && && && && && && && &//显示
void init()& && && && && && && && && &//初始化
& && &&&weix = 1;
& && &&&P0=0
& && &&&weix = 0;
& && &&&P0 = 0x00;
& && &&&duanx = 1;
& && &&&P0 = 0x00;
& && &&&duanx = 0;
void keyscan()& && && && && && && && & //矩阵键盘扫描
& && &&&uchar i,
& && &&&P3 = 0x0f;
& && &&&if(P3 != 0x0f)& && && && && &&&
& && && && && & delay(10);& && && && && && && && && && &&&//按键是否按下检测延时
& && && && && & if(P3 != 0x0f)& && && && && && &
& && && && && & {
& && && && && && && && &P3 = 0& && && && && && && && &
& && && && && && && && &for(i = 0;i & 4;i++)
& && && && && && && && &{
& && && && && && && && && && &&&key = P3&&& 0x0f;& && && &//屏蔽高四位,只对比检测到的第四位
& && && && && && && && && && &&&switch(key)
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & case 0x0e:k = i + 0;& && && && && && && && && && && && &
& && && && && && && && && && && && && & case 0x0d:k = i + 4;
& && && && && && && && && && && && && & case 0x0b:k = i + 8;
& && && && && && && && && && && && && & case 0x07:k = i + 12;break& && && && && && && && & & && && && && && &
default:k = 88;& &
//经15楼朋友提示,加上这句话,程序就没问题了& && && && && && && && && && &&&}
& && && && && && && && && && &&&P3&&= (P3 &&1) + 1;& && && && && &&&//P3口数据左移一位 再加1
& && && && && && && && && && &&&if(k != 88)& && && && && &&&//在此次for循环中 switch中如果匹配到
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
& && && && && && && && &}
& && && && && && && && &P3&&= 0x0f;& && && && && && && && &&&//松手检测
& && && && && && && && &while(P3 != 0x0f)& && && & //未松手则一直在此等待
& && && && && && && && && && &&&;& && && && && && && && && && && & //松手则退出
& && && && && & }
void display()& && && && && && && && && && && &&&//显示
& && &&&duanx = 1;
& && &&&P0 = table[k];
& && &&&duanx = 0;
void delay(uint x)
& && &&&while(x--)
& && && && && & for(j=110;j&0;j--);
满意回复+4
if(k != 88)
//在此次for循环中 switch中如果匹配到
//k被重新赋值,则退出f ...
void scan_key(void)
P3 = 0x0f;
P3 = 0xf0;
if(k == 0xff){
key_delay = 0 ...
问题似乎不在于只能检测到那四个键吧?
本帖子中包含更多资源
才可以下载或查看,没有帐号?
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
期盼大神。。。我实在是无能为力了。。感觉思路很清晰啊
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
我用这个键盘扫描程序替换就可以。。。这是为什么啊。。。这两个道理是一模一样的啊
void matrix_keyscan()
& & & & P3 = 0x0f;
& & & & if(P3 != 0x0f)
& & & & & & & & delay(10);& & & & & & & & & & & & & & & & //键盘是否按下 检测延时
& & & & & & & & if(P3 != 0x0f)
& & & & & & & & {& & & & & & & & & & & &
& & & & & & & & & & & & P3=0xf0;& & & & & & & & //检测高4位,因低4位被拉低
& & & & & & & & & & & &&&switch(P3)& & & & //此时按键被按下,高位必有1位也被拉低
& & & & & & & & & & & &&&{
& & & & & & & & & & & & & & & &&&case 0xe0: key1=0;
& & & & & & & & & & & & & & & &&&case 0xd0: key1=1;
& & & & & & & & & & & & & & & &&&case 0xb0: key1=2;
& & & & & & & & & & & & & & & &&&case 0x70: key1=3;
& & & & & & & & & & & &&&}
& & & & & & & & & & & &&&P3=0x0f;& & & & & & & & //再检测低4位
& & & & & & & & & & & &&&switch(P3)& & & & //为何加0—12可画图理解
& & & & & & & & & & & &&&{
& & & & & & & & & & & & & & & &&&case 0x0E: key=key1+0;
& & & & & & & & & & & & & & & &&&case 0x0D: key=key1+4;
& & & & & & & & & & & & & & & &&&case 0x0B: key=key1+8;
& & & & & & & & & & & & & & & &&&case 0x07: key=key1+12;
& & & & & & & & & & & &&&}
& & & & & & & & & & & & P3 = 0x0f;
& & & & & & & & & & & & while(P3 != 0x0f)& & & & // 松手检测
& & & & & & & & & & & & & & & & ;
& & & & & & & & }
主题帖子积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
void scan_key(void)
& & & & U8 x,k;
& & & & P3 = 0x0f;
& & & & x = P3;
& & & & P3 = 0xf0;
& & & & k = P3;
& & & & k = x +
& & & & if(k == 0xff){
& & & & & & & & key_delay = 0;
& & & & & & & &
& & & & if((key_delay & 100) && (++key_delay == 3)){
& & & & & & & & key_number =& & & & & & & & // 此处设置断点,用于记录按键号
间隔5~100MS调用即可,在 “key_number =”处设置断点,按下按键记录按键号,按键号等于k值。
主题帖子积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
主题帖子积分
专家等级:结帖率:100%打赏:10.00受赏:304.00
主题帖子积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
& && && && && && && && &}
& && && && && && && && &temp = 0x0f;& && && && && && && && &&&//松手检测
//这里的temp被赋值,下面的while表达式括号内的条件就一直为False,temp不会自动同步P3的
& && && && && && && && &while(temp != 0x0f)& && && & //未松手则一直在此等待
& && && && && && && && && && &&&;& && && && && && && && && && && & //松手则退出复制代码
问题似乎不在于只能检测到那四个键吧?
生活将我们磨圆,是为了让我们滚得更远。。。
我来到这个世上就没打算活着回去!
主题帖子积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
主题帖子积分
专家等级:结帖率:100%打赏:10.00受赏:304.00
主题帖子积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
两种代码的差异就在于你在前一种代码中设置了一个变量temp,您好好分析一下你的代码流程
生活将我们磨圆,是为了让我们滚得更远。。。
我来到这个世上就没打算活着回去!
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
yirongfu 发表于
两种代码的差异就在于你在前一种代码中设置了一个变量temp,您好好分析一下你的代码流程 ...
早上问老师,他接到个电话有事,急急忙忙的就看了一下说把P3用个变量代替试试。。。所以我才加了temp
之前是没有temp直接用变量p3的。。。仍然是不能正常工作,只能检测到0、4、8、12。。。
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
ayb_ice 发表于
这程序也太简洁了吧。。。。。。好高级。。。可惜没看懂。。。。:Q
主题帖子积分
中级工程师, 积分 4529, 距离下一级还需 471 积分
中级工程师, 积分 4529, 距离下一级还需 471 积分
主题帖子积分
专家等级:结帖率:88%
主题帖子积分
中级工程师, 积分 4529, 距离下一级还需 471 积分
中级工程师, 积分 4529, 距离下一级还需 471 积分
键扫描要求变输出脚电平读输入脚电平再来判断,可是你在变temp这时输出脚电平会变吗?
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
xuyaqi 发表于
键扫描要求变输出脚电平读输入脚电平再来判断,可是你在变temp这时输出脚电平会变吗? ...
我错了。。这个temp是后来加的。。。之前是直接用P3的。。。仍然是只能检测4个键。。
上面的代码我已经改过来了。。。麻烦你再劳神下
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
把P3改成按位操作可能才行
主题帖子积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
主题帖子积分
专家等级:结帖率:100%打赏:10.00受赏:304.00
主题帖子积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
初级工程师, 积分 2788, 距离下一级还需 212 积分
可能你的思路真的是清晰的,可是你对51单片机的操作看来还比较混沌
1. 像 P3&&= (P3 &&1) + 1; 这样的操作是在直接操作IO口的输入输出寄存器,而你的P3口一半是输入一半是输出,假设某个输入口被外部按键动作拉到地,你又同时给该口输出高电平,这个电气上比较危险。所以,建议输入口就是输入,输出口就是输出,不要变来变去,51跟其他单片机不一样,你往Port写数据,就直接变成输出并反映到引脚电平,不需要另外设置为输入或输出方向。回头来说,你这句的本意是前面赋的扫描初值的移位,但运行到这一步,左移符号前的P3实际是去读取口的当前状态,而不是原来的那个定值了(P3 = 0xef以及你所设想的移位后的值)。你的老师让你加个中间变量,估计他也是初步发现了这里的问题,所以,建议你在这里再自己细细分析一下,用单步调试跟踪一下应该能很快找到问题,也能让你更好地掌握。
2. 1楼和3楼的代码要实现的按键布局我理解是不一样的,好像硬件原理也不尽相同。楼主你要实现的是矩阵扫描16键,3楼是简单按键扫描,或者说是IO口扫描,仅8键。所以,不要被3楼的代码所牵引。如果实在没理解透按键扫描的原理,建议你就直接找些4×4的C代码贴过来改造一下,网上很多的。
3. 提问应该描述尽量详细些,比如哪几个口作为输入哪几个口作为输出(行和列都可以作为输入或输出),你的设计思路,同时最好把接口的电路贴上来,详细的描述可以节省大家的时间,也能尽快帮你找到问题。
以上意见仅供参考,希望对你有用。
很耐心的讲解 赞一个
生活将我们磨圆,是为了让我们滚得更远。。。
我来到这个世上就没打算活着回去!
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
把P3改成按位操作可能才行
麻烦讲清楚点啊。。。。。我是菜鸟。。。。:(
主题帖子积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
hunxiyi 发表于
这程序也太简洁了吧。。。。。。好高级。。。可惜没看懂。。。。
typedef unsigned char U8;
主题帖子积分
资深工程师, 积分 10984, 距离下一级还需 9016 积分
资深工程师, 积分 10984, 距离下一级还需 9016 积分
主题帖子积分
专家等级:结帖率:100%打赏:0.00受赏:0.10
主题帖子积分
资深工程师, 积分 10984, 距离下一级还需 9016 积分
资深工程师, 积分 10984, 距离下一级还需 9016 积分
if(k != 88)& && && && && &&&//在此次for循环中 switch中如果匹配到
& && && && && && && && && && && && && && && && && && &&&//k被重新赋值,则退出for循环
问题在这儿,至于为什么,其实你用笔在纸上按程序执行顺序,写下各个变量的值,就清楚了,不知道是没掌握这个方法还是懒,如果养成用纸笔模拟程序运行的习惯,很多问题都会发现,不需要仿真器,也不需要问别人,熟练了速度还不慢
深说一点,你的按键扫描程序中的循环每次只执行了一次就结束了,至于为什么,还是自己发现吧
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
扫描键盘时,分别置位P3.0,P3.!,P3.2,P3.3,然后再检测P3.4,P3.5,P3.6,P3.7
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
本帖最后由 hunxiyi 于
10:49 编辑
yirongfu 发表于
可能你的思路真的是清晰的,可是你对51单片机的操作看来还比较混沌
1. 像 P3&&= (P3&&...
非常感谢你花这么多时间来为我解答,真的很感谢。。。
我确实是刚刚开始学。。感觉这个程序思路是很清晰的,但对于操作是一点头绪都没有
你说的单步调试跟踪,我还不会,现在去百度上学学。。。去
这个程序是我在网上找到的。。。最容易理解的矩阵键盘程序是书上写的,但太长了。。于是上网搜搜简单的。。。&&发现了这个文件里最后一个程序感觉不错。。。于是按照我的这个线路加以改动
3楼那个也是我在网上看见的,稍微改一下确实可以运行。。。0——15都可以正常检测,你说的仅8键不太懂什么意思。。。
最后,这个帖子是第一次在这论坛发帖。。。不足之处你已指出,已经做出了一些修改。。以后绝对不会再犯!谢谢。。
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
扫描键盘时,分别置位P3.0,P3.!,P3.2,P3.3,然后再检测P3.4,P3.5,P3.6,P3.7
那你的意思就是3楼那代码。。。对吧?
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 48, 距离下一级还需 2 积分
实习生, 积分 48, 距离下一级还需 2 积分
hunxiyi 发表于
那你的意思就是3楼那代码。。。对吧?
直接用汇编写,直观又容易理解
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
中级技术员, 积分 133, 距离下一级还需 167 积分
中级技术员, 积分 133, 距离下一级还需 167 积分
pc1969 发表于
直接用汇编写,直观又容易理解
汇编不会;。。。。。比C难多了、、
技术新星奖章
人才类勋章
时间类勋章
荣誉元老奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
欢快之小溪
发帖类勋章
技术导师奖章
人才类勋章
精华达人奖章
等级类勋章
时间类勋章
湍急之河流
发帖类勋章
突出贡献奖章
等级类勋章
热门推荐 /23被浏览270分享邀请回答本人单片机入门小白,在参考郭天祥10天学会单片机的例程视频关于矩阵键盘这一章时,自己编了一段程序,但是一直不明白为什么达不到按键控制数码管的目的。复制过郭老师的程序,效果非常良好,接线不存在问题。我编写程序的理解是,按键后对temp的赋值是确定值,即高四位和第四位均有一位为0,剩下6位为1,这样逐个判断不就可以识别出按键值了吗?我怀疑我在IO的理解上出现了问题,望大神指点,感激不尽!!
#include&reg52.h&
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
//ABC=111() ABC=011() ABC=101() ABC=001() ABC=110()
//ABC=010() ABC=001() ABC=000()
#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,0};
//按键显示数值
uchar temp,key,
void delay(uchar z)
uchar x,y;
for(x=z; x&0; x--)
for(y=110; y&0; y--);
void keyboard()
temp=temp&0xf0;
if(temp!=0xf0)
delay(10);
temp=temp&0xf0;
if(temp!=0xf0)
switch(temp)
case 0xee:key=0;
case 0xde:key=1;
case 0xbe:key=2;
case 0x7e:key=3;
case 0xed:key=4;
case 0xdd:key=5;
case 0xbd:key=6;
case 0x7d:key=7;
case 0xeb:key=8;
case 0xdb:key=9;
case 0xbb:key=10;
case 0x7b:key=11;
case 0xe7:key=12;
case 0xd7:key=13;
case 0xb7:key=14;
case 0x77:key=15;
while(temp!=0xf0)
temp=temp&0xf0;
P0=table[key];
void main()
keyboard();
0添加评论分享收藏感谢收起

我要回帖

更多关于 单片机4x4矩阵键盘 的文章

 

随机推荐