关于4X4矩阵键盘扫描程序的问题,本人菜鸟。

我在网上找了一个程序,关于扫描的那部分看不懂,望高人能够指点。/*本程序的功能是用数码管上显示4X4矩阵键盘按下的键号,分别定义为0-f矩阵键盘原理图如上图其中P2是位选... 我在网上找了一个程序,关于扫描的那部分看不懂,望高人能够指点。

/* 本程序的功能是用数码管上显示4X4矩阵键盘按下的键号,
分别定义为0-f 矩阵键盘原理图如上图
其中P2是位选、P0是段选,低电平有效 */
#include <reg51.h> //51头文件

#define uchar unsigned char
#define uint unsigned int

uchar table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, //0,1,2,3,4,5,6
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xBF};//7,8,9,A,B,C,D,E,F,- 段码数组
uchar dis_buf; //显示缓存
uchar temp;
uchar key; //键号

/*---------延时函数-------------*/
void delay(unsigned int a)
{
uint i;
while(a--)
{
for(i=0;i<120;i++);
}
}
/*-----------键扫描子程序-----------------*/
void keyscan(void)
{
P1=0x0F; //低四位输入
delay(1); //稍稍延时
temp=P1; //读P1口
temp=temp&0x0F; //取低四位
temp=~(temp|0xF0);
if(temp==1) //检测按下的键所在的列号,在第一列
key=0;
else if(temp==2) //在第二列
key=1;
else if(temp==4) //在第三列
key=2;
else if(temp==8) //在第四列
key=3;
else
key=16; //否则显示-

P1=0xF0; //高四位输入
delay(1);
temp=P1; //读P1口
temp=temp&0xF0;
temp=~((temp>>4)|0xF0);
if(temp==1) //检测按下的键所在的行号,在第一行
key=key+0;
else if(temp==2) //在第二行
key=key+4;
else if(temp==4) //在第三行
key=key+8;
else if(temp==8) //在第四行
key=key+12;
else
key=16; //否则显示-
/* 根据行号和列号得到按下的键号 */
dis_buf=table[key]; //查表得键值
}

/*----------判断键是否按下-------------*/
void keydown(void)
{
P1=0xF0;
if(P1!=0xF0)
{
keyscan(); //调用keyscan()子函数
while(P1!=0xF0); //等待键释放
}
}
/*---------------主函数--------------------*/
main()
{
P0=0xFF; //置P0口
P2=0xFF; //置P2口
dis_buf=0xBF; //赋初值,没有键按下时,数码管显示-

while(1) //大循环
{
keydown(); //调用keydown()子函数
P0 = dis_buf; //键值赋给P0口,显示
delay(2);
P2 = 0x7F;
}
}

能否尽量详细地说一下:
P1=0x0F; //低四位输入
delay(1); //稍稍延时
temp=P1; //读P1口
temp=temp&0x0F; //取低四位
temp=~(temp|0xF0);
if(temp==1) //检测按下的键所在的列号,在第一列
key=0;
else if(temp==2) //在第二列
key=1;
else if(temp==4) //在第三列
key=2;
else if(temp==8) //在第四列
key=3;
else
key=16; //否则显示-

这一段的意义。谢谢!!
展开
 我来答
user32kernel32
2010-08-18 · TA获得超过186个赞
知道小有建树答主
回答量:193
采纳率:100%
帮助的人:110万
展开全部
能否尽量详细地说一下:
P1=0x0F; //低四位输入
delay(1); //稍稍延时
temp=P1; //读P1口
temp=temp&0x0F; //取低四位
temp=~(temp|0xF0);
if(temp==1) //检测按下的键所在的列号,在第一列
key=0;
else if(temp==2) //在第二列
key=1;
else if(temp==4) //在第三列
key=2;
else if(temp==8) //在第四列
key=3;
else
key=16; //否则显示-

这一段的意义

你只要我解释这段的意义吧。 这一段是确定按下的键所在的列号。我看几乎每行都有注释啊,而且注释的很好。
temp=temp&0x0F; //取低四位
temp=~(temp|0xF0);这行没注释,我就说一下,就是对temp低四位取反,
因为 P0是段选,低电平有效,这样能分离出按键信息。举个例子,如果是第一列有键按下,temp在执行此句前,低四位应该是1110(低电平有 效 )执行后低四位才变成0001,恰好能为下面的 if,else if 提供正确的逻辑。如果没键按下,temp=0x00,所以有else key=16。显示“-”。
我想应该解释清楚了,如有疑问,给我留言。
东莞大凡
2024-08-07 广告
OpenCV标定板是东莞市大凡光学科技有限公司在相机标定中常用的工具。它通常由黑白格点按一定规则排列在平面上组成,如棋盘格或圆形格等。在相机标定时,将标定板置于不同位置和姿态下拍摄图像,利用OpenCV库中的函数检测标定板上的角点或圆心,进... 点击进入详情页
本回答由东莞大凡提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式