导航:首页 > 操作系统 > 单片机键盘44

单片机键盘44

发布时间:2022-09-21 15:07:02

单片机独立键盘和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

阅读全文

与单片机键盘44相关的资料

热点内容
rf3148编程器 浏览:505
浙江标准网络服务器机柜云主机 浏览:587
设置网络的服务器地址 浏览:600
java图形界面设计 浏览:751
纯前端项目怎么部署到服务器 浏览:538
瓜子脸程序员 浏览:505
如何保证服务器优质 浏览:94
小微信aPP怎么一下找不到了 浏览:299
算法纂要学术价值 浏览:975
程序员你好是什么意思 浏览:801
倩女幽魂老服务器如何玩 浏览:561
电子钟单片机课程设计实验报告 浏览:999
看加密频道 浏览:381
程序员算不算流水线工人 浏览:632
三星电视我的app怎么卸载 浏览:44
简述vi编译器的基本操作 浏览:507
让程序员选小号 浏览:91
加强数字货币国际信息编译能力 浏览:584
购买的app会员怎么退安卓手机 浏览:891
程序员的种类及名称 浏览:295