Ⅰ 单片机独立键盘和4*4矩阵键盘中松手检测的区别
可不可以这样认为:你以松手后执行指令,但松手后与未按键都是同一电平,相当于一直判定为你不按键在执行,那你的键盘当然失去了作用,要明白,键盘识别都是靠电平变化来实现的
Ⅱ 单片机4x4按键中断扫描法中的键盘编码的问题
嗯,想法很不错..
我试着帮你解释下第一个吧..
这应该是选用的线扫法(好像这么说的吧).
比如说,键盘口为,P1
在一开始输出,01111111B,再判断P1口值是否变化..
若没变化再换成,10111111B,再判断P1口值是否变化..
这样依次到,11101111B,
在有变化时就可以得到把描码了..就像是你那个表中所示.的数值就经过这四次都可以得出其中一种....
#include<reg51.h>
#define uchar unsigned char
#define KeyPad P0
code uchar key_tab[17]=
{0xed,0x7e,0x7d,0x7b,
0xbe,0xbd,0xbb,0xde,
0xdd,0xdb,0x77,0xb7,
0xee,0xd7,0xeb,0xe7,0XFF};
code uchar key_show[]=
{1,2,3,0x0a,
4,5,6,0x0b,
7,8,9,0x0e,
0x0c,0,0x0d,0x0f,0xff};
uchar Keyscan()
{
uchar i=0x01,j,k;
KeyPad=~i;
j=~i;
for (k=0;k<4;k++)
{
if(KeyPad==j)
{
i*=2;
KeyPad=~i;
j=~i;
}
else
k=KeyPad;//取出扫描码.
}
i=0;
if(k!=4)
{
while(key_tab[i++]!=0xff)
{
if(k==key_tab[i])
k=i;
else
k=16;
}
}
return key_show[k];
}
以上是整个扫描键盘子程序..
程序编译通过,不知道实际怎么样..
其中未用中断..
不过,方法是一样的...
明白思想才是最重要的..
祝你好运!
^_^
Ⅲ 为什么单片机接矩阵按键都是4*4的不能接4*5吗如果可以,该接哪些引脚
当然可以接成4*5的,只是相对刚好8bit的端口来说4*4正好且容易些。其实矩阵键盘都一个样,比如P1接4行,P2接5列,先将P2的5列全置1,读取P1的4行存储到一个字节,然后将P1的4行全置1,读取P2的5列到另一个字节,这两个字节组合起来就是对应的按键,原因是如果有键按下,那么4行中有一个是0,5列中有一个是0,组合起来就确定唯一按键了。其实还有一个方法,就是在4*4矩阵上再加一个4*1矩阵,按照相同的检测方法也是可以的。
Ⅳ 单片机4*4键盘输入4位LED显示,
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=P3^7;
ucharcodeDSY_CODE[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x00
};
ucharPre_KeyNO=16,KeyNO=16;
voidDelayMS(uintms)
{
uchart;
while(ms--)
{
for(t=0;t<120;t++);
}
}
voidKeys_Scan()
{
ucharTmp;
P1=0x0f;
DelayMS(1);
Tmp=P1^0x0f;
switch(Tmp)
{
case1:KeyNO=0;break;
case2:KeyNO=1;break;
case4:KeyNO=2;break;
case8:KeyNO=3;break;
default:KeyNO=16;
}
P1=0xf0;
DelayMS(1);
Tmp=P1>>4^0x0f;
switch(Tmp)
{
case1:KeyNO+=0;break;
case2:KeyNO+=4;break;
case4:KeyNO+=8;break;
case8:KeyNO+=12;
}
}
voidBeep()
{
uchari;
for(i=0;i<100;i++)
{
DelayMS(1);
BEEP=~BEEP;
}
BEEP=1;
}
voidmain()
{
P0=0x00;
while(1)
{
P1=0xf0;
if(P1!=0xf0)
Keys_Scan();
if(Pre_KeyNO!=KeyNO)
{
P0=~DSY_CODE[KeyNO];
Beep();
Pre_KeyNO=KeyNO;
}
DelayMS(100);
}
}
Ⅳ 使用单片机的P1口扩展4*4键盘矩阵,实现在键盘上每按一个数字键用静态显示或动态显
P1.0~P1.3为列线,P1.4~P1.7为行线;列线和行线的交叉点接按键。先在列线上依次输出1,然后再在行线上读取;可根据行线的输入和列线的输出来判定是哪个按键按下。具体的显示部分,应该很简单吧。
Ⅵ 关于单片机c语言4*4小键盘程序
借用一下你的程序~
char
keypad_scan()
{
char
key,i;
P2=0xf0;
//定义高四位输出,低四位输入
while(P2!=0xf0)
;
//等待按键按下
do
{
for(i=0;i<3;i++)
{
P2=ksp[i];
//扫描出是哪一行(列)
-->但错了,变成赋值运算了~
if(P2!=ksp[i])
//扫描出是哪一列(行)
-->但错了~
{
delay();//延时消抖后再判断该行有无键按下
key=P2;
//扫描出按键
-->本可以到这里了就可以直接得出按键值的~~~~
if(key!=ksp[i])
return
(key);
}
}
}while(1);
//是死循环,退不出来~~~
}
思路很好~~编得有点乱~~~
Ⅶ 单片机中的4×4矩阵键盘的键值怎么求
单片机书上应该有讲的哦,多查资料。
既然是4x4,即4行4列了,共需要8个I/O口,有8bit数据(如高四位为行4bit,低四位为列4bit)位:xxxx xxxx。还要结合你的程序来编码键值,如果有键按下了,查询所有按键的所连接的I/O口电平状态,每个按键需要两个I/O口,一端连接行(行4bit之一),一端连接列(列4bit之一);若此时按键的电平状态为0010 0001,即十六进制数据0x21,按下的按键所对应的键值编码即为0x21。当然为了使用方便,在确定了按下按键的编码后,可对其赋值,我要将它赋值为数字键8,方便后续编程使用。例:
//获取键值编码,由于确定哪个按键按下
uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff); //返回该值
}
while(1)
{
key=keyscan();//调用键盘扫描,
//keyVal=0~15表示按键对应的功能
switch(key)
{
case 0x7e:keyVal=0;break;//0 按下相应的键显示相对应的码值
case 0x7d:keyVal=1;break;//1
case 0x7b:keyVal=2;break;//2
case 0x77:keyVal=3;break;//3
case 0xbe:keyVal=4;break;//4
case 0xbd:keyVal=5;break;//5
case 0xbb:keyVal=6;break;//6
case 0xb7:keyVal=7;break;//7
case 0xde:keyVal=8;break;//8
case 0xdd:keyVal=9;break;//9
case 0xdb:keyVal=10;break;//a
case 0xd7:keyVal=11;break;//b
case 0xee:keyVal=12;break;//c
case 0xed:keyVal=13;break;//d
case 0xeb:keyVal=14;break;//e
case 0xe7:keyVal=15;break;//f
}
Ⅷ 单片机4*4矩阵键盘,求高手
程序有问题:1、没有按键按下时,你的键盘扫描程序并没有返回值;
2、主函数一直在对key值进行扫描,当你按下按键时,显示键值,这个没问题;但是,当你松开按键时,扫描没有按键按下,也就没有返回值,key值应该是一个随机的数! 我还没搞明白为什么会是4。
Ⅸ 谁能给我讲明白单片机的4x4矩阵键盘工作原理
给P1赋值0xf0,这时P1^4,P1^5,P1^6,P1^7为高电平,P1^0,P1^1,P1^2,P1^3为低电平。如果这时候有按键按下那么P1^4,P1^5,P1^6,P1^7就有一个会变成低电平。因此P1的值就不等于0xf0,这是就可以判断有按键按下。
4x4矩阵键盘的工作原理是在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,通过读入输入线的状态就可得知是否有键被按下。
(9)单片机键盘44扩展阅读:
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
Ⅹ 单片机 4*4矩阵键盘
这个电路图,只是你使用哪几个口在程序中对应上就可以了
程序
//行列扫描程序,可以自己定义端口和扫描方式,这里做简单介绍
#include<reg52.h>//包含头文件
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharconstdofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
ucharkeyscan(void);
voiddelay(uinti);
voidmain()
{
ucharkey;
P2=0x00;//1数码管亮按相应的按键,会显示按键上的字符
while(1)
{
key=keyscan();//调用键盘扫描,
switch(key)
{
case0x7e:P0=dofly[0];break;//0按下相应的键显示相对应的码值
case0x7d:P0=dofly[1];break;//1
case0x7b:P0=dofly[2];break;//2
case0x77:P0=dofly[3];break;//3
case0xbe:P0=dofly[4];break;//4
case0xbd:P0=dofly[5];break;//5
case0xbb:P0=dofly[6];break;//6
case0xb7:P0=dofly[7];break;//7
case0xde:P0=dofly[8];break;//8
case0xdd:P0=dofly[9];break;//9
case0xdb:P0=dofly[10];break;//a
case0xd7:P0=dofly[11];break;//b
case0xee:P0=dofly[12];break;//c
case0xed:P0=dofly[13];break;//d
case0xeb:P0=dofly[14];break;//e
case0xe7:P0=dofly[15];break;//f
}
}
}
ucharkeyscan(void)//键盘扫描函数,使用行列反转扫描法
{
ucharcord_h,cord_l;//行列值
P3=0x0f;//行线输出全为0
cord_h=P3&0x0f;//读入列线值
if(cord_h!=0x0f)//先检测有无按键按下
{
delay(100);//去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f;//读入列线值
P3=cord_h|0xf0;//输出当前列线值
cord_l=P3&0xf0;//读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}return(0xff);//返回该值
}
voiddelay(uinti)//延时函数
{
while(i--);
}
不明白的在联系我,也可以直接访问我的Blog:hi..com/lyzhangxiang