4乘4矩阵法.docx
《4乘4矩阵法.docx》由会员分享,可在线阅读,更多相关《4乘4矩阵法.docx(7页珍藏版)》请在冰豆网上搜索。
4乘4矩阵法
贴三个4*4矩阵键盘的程序(行扫描,查表,线反转法)
都是经过实际验证的,可以直接使用,就是最后一个我在用的时候,读不出键值来,不知为什么,也懒得在看了,第一个,第二个绝对没问题的,个人感觉第二个更好用点,在转载的那个人看到的好像是要线反转法时,必须是双向口,51单片机什么口是双向口啊,求高人指点!
ucharkeyscan()
{
uchari=0,j=0,key;
P3=0xf0;//高位拉高,低位拉低
if(((~P3)&0xf0)!
=0)
{
delay(10);
if(((~P3)&0xf0)!
=0)
{
P3=0xfe;
while(((~P3)&0x0f)!
=0)//此语句保证只扫描四行
{
if(((~P3)&0xf0)!
=0)
{
switch((~P3)&0xf0)
{
case0x10:
j=0;break;
case0x20:
j=1;break;
case0x40:
j=2;break;
case0x80:
j=3;break;
}
return(4*i+j);
}
else
{
P3=P3<<1;
i++;
}
}
}
}
return(key);
}
/**************************************************************
*功能:
P3外接4×4按键,按照查表法读出键值
*返回:
按键值0~15/如无键按下,返回16
***************************************************************/
/*ucharkeyscan(void)
{
ucharcodeK_Tab[4][4]={
0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};
uchartemp1=0xfe,temp2,i,j;
for(i=0;i<4;i++)
{//扫描低四位
P3=temp1;//输出一行0
temp2=P3;//马上就读入
if((temp2&0xf0)!
=0xf0){//如果有键按下
for(j=0;j<4;j++)//就扫描高四位
if(temp2==K_Tab[i][j])//查表
returni*4+j;//查到了就返回按键的数值
}
elsetemp1=_crol_(temp1,1);
}
return16;//没有查到,返回按键松开的代码
}*///呵呵,实质性的语句不过9行,就是这么简练!
/**************************************************************
*名称:
KeyRvs()
*功能:
P1外接4×4按键,按照反转法读出键值
*输出:
按键值0~15/如无键按下,返回16
***************************************************************/
ucharkeyscan(void)
{
uchartemH,temL,key;
P3=0xf0;temH=P3;//低四位先输出0;读入,高四位含有按键信息
P3=0x0f;temL=P3;//然后反转输出0;读入,低四位含有按键信息
//-----------------------------------------------------
//两次读入的时间间隔,必须尽量的小,以尽量避免按键状态发生变化
//有些人给出的程序,就没有注重这些,有些程序甚至还有间隔几个毫秒的!
//要知道,按键是会抖动的,夜长梦多,真不知道读出些什么!
//呵呵,做而论道给出的这个程序,读键的准确性最高。
//-----------------------------------------------------
switch(temH){
case0xe0:
key=0;break;
case0xd0:
key=1;break;
case0xb0:
key=2;break;
case0x70:
key=3;break;
default:
return16;//按下的不是上述按键,就当是没有按键
}
//delay(10);
switch(temL){
case0x0e:
returnkey;
case0x0d:
returnkey+4;
case0x0b:
returnkey+8;
case0x07:
returnkey+12;
default:
return16;//按下的不是上述按键,就当是没有按键
}
}//本程序虽然稍多几行,但是没有循环,还可以提前返回,所以执行的速度最快
//
///4×4
矩阵键盘
按键为
1-16
,按键显示
0-9
、
a-f
;
//////////////////
#include
#defineucharunsignedchar
ucharkey=0;
ucharcode
table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,0xc0};
voidshow(ucharkey)
{
P0=table[key];//
显示数值
}
voidScan_key()//
扫描键盘
{
ucharm;
P1=0xff;//
数码管全亮
P2=0x0f;//P2
口赋初值低位
1
高位
0
m=P2;
switch(m)
{
case0x0e:
{
P2=0xf0;
m=P2;
switch(m)
{
case0xe0:
{key=0;show(key);break;}
case0xd0:
{key=1;show(key);break;}
case0xb0:
{key=2;show(key);break;}
case0x70:
{key=3;show(key);break;}
default:
break;
}
break;
}
case0x0d:
{
P2=0xf0;
m=P2;
switch(m)
{
case0xe0:
{key=4;show(key);break;}
case0xd0:
{key=5;show(key);break;}
case0xb0:
{key=6;show(key);break;}
case0x70:
{key=7;show(key);break;}
default:
break;
}
break;
}
case0x0b:
{
P2=0xf0;
m=P2;
switch(m)
{
case0xe0:
{key=8;show(key);break;}
case0xd0:
{key=9;show(key);break;}
case0xb0:
{key=10;show(key);break;}
case0x70:
{key=11;show(key);break;}
default:
break;
}
break;
}
case0x07:
{
P2=0xf0;
m=P2;
switch(m)
{
case0xe0:
{key=12;show(key);break;}
case0xd0:
{key=13;show(key);break;}
case0xb0:
{key=14;show(key);break;}
case0x70:
{key=15;show(key);break;}
default:
break;
}
break;
}
default:
break;
}
}
voidmain()
{
while
(1)
{
Scan_Key();
}
}