51单片机 c语言 矩阵键盘5号

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


















//***************************************************************
矩阵键盘5号:
前言:
1.此程序非常简洁它不是进行键扫描,而是直接读Pn口,修改很方便,
不受键位置的影响,比如:要改变键号位置只需改变keytable表顺序既可,
且很容易改成双键或多键同时按下键值.

2.还有一种放法是先读行值,再读列值然后行值*4+列值,此种放法也简洁但
可修改性不大好,而且要用乘法运算,代码相对大.

3.可很容易变通应用在多键键盘,比如8*8键盘或更多,代码多不了多少,
只是增大keytable表就可以
***********************************************************/
//---------------------------------
#include
const unsigned char keytable[]={0xdb,0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,
0xbb,0x7b,0xe7,0xd7,0xb7,0x77,0,0};

/******************************************************
如果无键按下返回0;如同时有两个或以键按下返回0(此情况不大可能出显)
延时程序就自己加上.
******************************************************/
unsigned char kdyscan(void)
{
unsigned char temp1,temp2; //行扫描值和列扫描值
unsigned char j=0; //键值
P1=0xf0; //P1.0-P1.3发全0,准备读列状态
if((P1&0xf0)==0xf0)
return(0); //如果P1.4-P1.7不全为1,可能的键按下
delay(1000); //延时10毫秒去抖动
if((P1&0x0f0)==0xf0)
return(0); //重读高4位,若还是不全为1定有键按理
temp1=P1&0xf0; //读P2高4位状态
P1=0x0f; //P1.4-P1.7发为0,准备读低4位状态
delay(3); //等待P1口电平稳定
temp2=P1&0x0f; //P1.0-P1.3发为0,读P2低4位状态
while(keytable[j]!=(temp1+temp2)) //高低4位合并,且与键值表比较
{
j++; //如果相等退出,不等则与下位比较
if(j>16)return(0); //如果比较完16位不相等,返回0
}
P1=0xf0; //恢复P2口 1
delay(3); //等待P1口电平稳定
while((P1&0xf0)!=0xf0) //等待键释放
{
// WDT_CONTR=0x3c; //喂狗,此句和所选用的芯片有关,
//如不用WDT可以不加此句
delay(1000); //延时10毫秒去抖动
}
return(j+0x30); //返回键值加0x30,防止键值为0时返回0,同时键值刚好是ASCII值"0"
} //如不需要ASCII值,可以随便加个数返回时再减去.
//因为返回0表示无键按下
//---------------------------
//主程序
//----------------------------
void main (void)
{
unsigned KEYS=0;;
P1=0xf0;
while(1)
{

//WDT_CONTR=0x3c;//喂狗,此句和所选用的芯片有关,如不用WDT可以不加此句
KEYS=kdyscan();
if(KEYS!=0)
{
//在此加键服务程序
KEYS=0;
}
}
}

相关文档
最新文档