Ⅰ 51单片机矩阵键盘(c语言) 求大神啊~
uchar
KeyScan(void)
{
static
uchar
k=0;
//由于函数在调用结束时k值已返回给函数,k作为局部变量即可
/////////
uchar
Trg,Trg1,Trg2,Cont1,Cont2;
uchar
ReadData1,ReadData2;
/////////
P3=0x0f;
ReadData1=P3^0x0f;
Trg1=ReadData1&(ReadData1^Cont1);
//触发键
Cont1=ReadData1;
//长按键
/////////
P3=0xf0;
ReadData2=P3^0xf0;
Trg2=ReadData2&(ReadData2^Cont2);
Cont2=ReadData2;
Trg=Trg1+Trg2;
////////
switch(Trg)
{
case
0x81:{k=1;break;}
case
0x41:{k=2;break;}
case
0x21:{k=3;break;}
case
0x11:{k=4;break;}
case
0x82:{k=5;break;}
case
0x42:{k=6;break;}
case
0x22:{k=7;break;}
case
0x12:{k=8;break;}
case
0x84:{k=9;break;}
case
0x44:{k=10;break;}
case
0x24:{k=11;break;}
case
0x14:{k=12;break;}
case
0x88:{k=13;break;}
case
0x48:{k=14;break;}
case
0x28:{k=15;break;}
case
0x18:{k=16;break;}
default:{k=0;break;}
}
return(k);
}
//在主函数里面直接调用keyboard()函数,直接返回键值;
然后在数码管显示。
好好的研究下这个键盘程序,
这种方式很程序很精炼、简单
绝对可以调出来。
Ⅱ 单片机汇编矩阵键盘实验(扫描法)
关于扫描按键的原理,可以看下面这篇文章。
本文以循序渐进的思路,引导大家思考如何用最少的IO驱动更多的按键,并依次给出5种方案原理图提供参考。在实际项目中我们经常会遇到有按键输入的需求,但有的时候为了节省资源成本,我们都会选择在不增加硬件的情况下使用最少的控制器IO驱动更多的按键,那么具体是怎么做的呢,下面我们就以用5个IO引脚为例,讲下怎么设计可以实现更多的按键?共有5种设计思路,下面依次介绍。
首先通常想到的可能是下面这样的设计:
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、K05在5个IO口都为读取的情况下,就可以识别,不需要扫描识别处理,相当于这5个按键优先级高与其他按键。
总结
综合上述,5个IO口最多可以识别25个按键,思路五程序上处理比较麻烦,若实际中只按思路四设计,也可识别20个按键,那么如果有N个IO口可识别多少按键呢?这里给出如下公式:
假设有N个IO口按照思路三可以识别N*(N-1)/2个;
按照思路四可识别N*(N-1)个;
按照思路5可以识别N*(N-1)+N个。
最后再说下,如果实际设计时,还是按思路四设计好,软件也没那么麻烦。如果是你的话你会选择哪种方法呢?你还有没有其他的设计方法呢?
Ⅲ 怎样知道单片机的矩阵键盘每个按键的地址
1、比如是一个4行×4列的矩阵键盘。
2、将4行和4列共8根线分别接到单片机的I/O口,比如接P1口,行接低4位(P1.0~P1.3),列接高4位(P1.4~P1.7)。
3、单片机先将行置第电平0,列置高电平1.
4、在键盘扫描程序中,判断是否有任意按键按下:if((P1&0xf0)!=0xf0),表示有按键按下,延时消抖后,再次判断,如果(P1&0xf0)!=0xf0,则表示有按键按下。
5、然后开始逐行扫描:
P1=0xfe; //第一行置为低电平“0”(P1.0输出低电平“0”)
if(P14==0) keyval=1; //如果检测到接P1.4引脚的列线为低电平“0”,可判断是S1键被按下
if(P15==0) keyval=2; //如果检测到接P1.5引脚的列线为低电平“0” ,可判断是S2键被按下
if(P16==0) keyval=3; //如果检测到接P1.6引脚的列线为低电平“0”,可判断是S3键被按下
if(P17==0) keyval=4; //如果检测到接P1.7引脚的列线为低电平“0”,可判断是S4键被按下
P1=0xfd; //第二行置为低电平“0”(P1.1输出低电平“0”)
if(P14==0) keyval=5; //如果检测到接P1.4引脚的列线为低电平“0”,可判断是S5键被按下
if(P15==0) keyval=6; //如果检测到接P1.5引脚的列线为低电平“0”,可判断是S6键被按下
if(P16==0) keyval=7; //如果检测到接P1.6引脚的列线为低电平“0”,可判断是S7键被按下
if(P17==0) keyval=8; //如果检测到接P1.7引脚的列线为低电平“0”,可判断是S8键被按下
P1=0xfb; //第三行置为低电平“0”(P1.2输出低电平“0”)
if(P14==0) keyval=9; //如果检测到接P1.4引脚的列线为低电平“0”,可判断是S9键被按下
if(P15==0) keyval=10; //如果检测到接P1.5引脚的列线为低电平“0”,可判断是S10键被按下
if(P16==0) keyval=11; //如果检测到接P1.6引脚的列线为低电平“0”,可判断是S11键被按下
if(P17==0) keyval=12; //如果检测到接P1.7引脚的列线为低电平“0”,可判断是S12键被按下
P1=0xf7; //第四行置为低电平“0”(P1.3输出低电平“0”)
if(P14==0) keyval=13; //如果检测到接P1.4引脚的列线为低电平“0”,可判断是S13键被按下
if(P15==0) keyval=14; //如果检测到接P1.5引脚的列线为低电平“0”,可判断是S14键被按下
if(P16==0) keyval=15; //如果检测到接P1.6引脚的列线为低电平“0”,可判断是S15键被按下
if(P17==0) keyval=16; //如果检测到接P1.7引脚的列线为低电平“0”,可判断是S16键被按下
依次类推,得到4×4=16个按键的键值。就知道哪个按键被按下。
Ⅳ 单片机 行列矩阵键盘
这是一种常见的4*4矩阵键盘扫描按键的方法。其原理是先把4条列线设置为低电平,然后扫描行线,如有按键被按下,必定有一条行线为低电平;再把为低电平的行线设置为低电平,然后扫描列线,如有按键被按下,必定有一条列线为低电平。
倒数第3句(不算括号)的 P3=x; 这里的x中的值是对应行线为低电平,其他7位为高电平。x是P3和0x0f按位或,也就是高四位(行)不变,低四位(列)全置1。但key_code重新读取P3后,由于前面的操作中把高四位(行)的某一条线置为低电平,按下的键导致与该行线接触的列线必定被拉低为低电平,所以这里key_code的低四位不是 1111,而是有一位是0,这样结合高四位的值就可以确定键码了。
51单片机中需要注意,虽然向单片机的引脚输出1,但接着读回的数据完全受引脚外部电平控制。原则上读取51单片机的I/O之前必须向向对应I/O写1,而读回的数据完全决定于引脚外接电平。
Ⅳ 单片机矩阵式键盘产生抖动的原理是什么..急...写论文要用到,谢谢!!
产生抖动的原理:当你按下按键时,不论你的速度有多快,这个过程都是:接触-断开-接触-断开。。。。。。可靠接触,前面10至20毫秒就是抖动状态,是不稳定状态,抬起手指时也是如此。
由此可见CPU要正确获取一次按键的信息,就要滤除前后的两段抖动时间,以免计数错误。单片槐顷机矩阵式键盘一般采用延时10ms来防抖。
我翻了下败拦教材,没找到原文,反正原理就是这样。既然是写论文,你自铅枯陆己组织下语言不就结了。
Ⅵ 单片机中的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
}
Ⅶ C 51单片机 矩阵按键
首先记住,你的是矩阵键盘,就是说一个按键A的一端接单片机的一个脚(假设P00),另一个也接一个脚(假设P07),
GPIO_KEY=0x0f; 当没有按下的话,GPIO_KEY还是等于0x0f的,假设按下A按键,由于按键两边一个接高电平,一个接低电平,按下后,高电平被低电平拉成低电平,也就是说按键A两侧都是0,此时不就可以判定了嘛