我是在PROTUES仿真上做的
你可以根据程序 自己连接电路图 完全好使
#include <AT89X51.H>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar code tabl[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };
uchar table[]={10,10,10,10,10,10,10,10};
uchar temp,tempp,num,n,i,j;
void key();
void delay(uint z)
{ uint x,y;
for(x=z;x>0;x--)
for(y=120;y>0;y--); }
void display()
{
for(i=0;i<8;i++)
{
P2=tabl[i];
P0=tab[table[i]];
delay(1);}
}
void main()
{
while(1)
{
display();
key();}
}
void key()
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{ delay(10);
while(temp!=0xf0)
{ temp=P1;
temp=temp&0xf0;
switch(temp)
{ case 0xe0: num=0;break;
case 0xd0: num=1;break;
case 0xb0: num=2;break;
case 0x70: num=3;break;
}
while(temp!=0xf0) //松手检测
{ temp=P1;
temp=temp&0xf0;
display(); //调用显示
}
} }
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{ delay(10);
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
switch(temp)
{ case 0xe0: num=4;break;
case 0xd0: num=5;break;
case 0xb0: num=6;break;
case 0x70: num=7;break;
}
while(temp!=0xf0)
{ temp=P1;
temp=temp&0xf0;
display(); } }
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{ delay(10);
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
switch(temp)
{ case 0xe0: num=8;break;
case 0xd0: num=9;break;
case 0xb0: num=10;break;
case 0x70: num=11;break;
}
while(temp!=0xf0)
{ temp=P1;
temp=temp&0xf0;
display();
} }}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!=0xf0)
{ delay(10);
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
switch(temp)
{ case 0xe0: num=12;break;
case 0xd0: num=13;break;
case 0xb0: num=14;break;
case 0x70: num=15;break;
}
while(temp!=0xf0)
{ temp=P1;
temp=temp&0xf0;
display();} }
}
table[num]=num; }
温馨提示:内容为网友见解,仅供参考
...我现在已经能实现矩阵键盘的检测,我想在这基础上加以改进!
include <AT89X51.H> include<intrins.h> define uint unsigned int define uchar unsigned char uchar code tab[]={0xc0,0xf9,0xA4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};uchar code tabl[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01 };uchar table[]={10,10,10,10...
关于51单片机矩阵键盘的问题。
(1)P3口是准双向IO口(注意与双向IO口的区别),它 的硬件结构决定着,读取之前先写1,再读取,读取的结果才可能是正确的,你可以区域查查书。(2)4X4 矩阵键盘的8根线直接连在IO上,而独立按键有一根线固定是接地的,这就意味着必须采取扫面或者线反转的方法。比如其中一根行线赋0,相当于...
51单片机矩阵键盘检测方面的问题
第一个问题,应该是考虑如果先开锁存器,在那一时刻,P0的值还是上一次给P0赋的值,下在一条语句才将这次的值给P0,这样会造成数码管的余辉,静态显示的时候,因为太快看不到,动态显示时,就会比较明显了。第二个问题他的程序应该检测的是高四位,是否被拉低,因为temp和0xf0与,低四位不管是什...
51单片机 矩阵键盘 检测的命令
temp的值会受到按键的影响,例如变成:7e或别的值等。
51单片机的矩阵键盘检测问题
扫描按键有没有释放,如果释放再加个消抖延时,再扫描有没有释放,如果按键释放则确认已经松手了。我是这么做的,可以用
51单片机矩阵键盘扫描程序,怎样判断当前按键式第几行的?
p3=fe就是扫描第一行,然后&上f0就是屏蔽低位高位不等于f0则有建按下,后面你那个12345678……就是第几个建,如你的例子,=ed的时候是发生在p3=fd的程序,fd是第二行手机打字欢迎追问
单片机矩阵键盘检测的疑问
temp=temp&0xf0;\/\/这三句跟上面重复,功能是软件消抖 while(temp!=0xf0) \/\/延时一段时间后判断还有按键按下,说明是真有按键按下,进入按键扫描与键值的判断,否则可能是意外抖动引起的,就不进行按键扫描。{ temp=P3;switch(temp)...我想注释完应该能读懂,关键是要理解矩阵键盘的扫描原理。
关于51单片机的问题,独立键盘和矩阵键盘怎么同时使用?懂的来帮帮忙啊...
你可以不要定义在同一个引脚上连起来一个引脚的四个按键,你试试控制8个单片机不同引脚上的按键编程一下试一试。程序上,你的独立按键程序和矩阵键盘程序要分开,独立键盘的程序高低四位判断是相反的,这个一定要注意。你可以让独立按键在那里扫描,矩阵键盘用标志位扫描一下,一旦标志位置位才扫描矩阵...
51单片机如何把矩阵键盘控制数码管和独立键盘控制蜂鸣器共同实现
对于矩阵键盘常用的扫描方法为线反转查询法。具体的思路是:首先使行作为输入,使用单片机内部电阻上拉为高电平,列输出低电平,读行的状态。如果行有一个IO口是低,说明有键按下,进行下一步,否则退出扫描。如果有键按下,置列为输入,行输出低电平,读列的状态。最后根据 行列的状态查表就可以知道...
请教51单片机矩阵键盘扫描数码管显示的问题
51单片机矩阵键盘扫描与数码管显示是最典型的电路,画仿真图更简单,用四位一体的数码管显示按键,可模拟计算器输入数字,按键后,每个按键的数依此向左移位显示。如下图所示的仿真图。