4乘4矩阵法Word格式.docx
《4乘4矩阵法Word格式.docx》由会员分享,可在线阅读,更多相关《4乘4矩阵法Word格式.docx(7页珍藏版)》请在冰点文库上搜索。
0xf0)
case0x10:
j=0;
break;
case0x20:
j=1;
case0x40:
j=2;
case0x80:
j=3;
}
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<
j++)//就扫描高四位
if(temp2==K_Tab[i][j])//查表
returni*4+j;
//查到了就返回按键的数值
elsetemp1=_crol_(temp1,1);
return16;
//没有查到,返回按键松开的代码
}*///呵呵,实质性的语句不过9行,就是这么简练!
*名称:
KeyRvs()
P1外接4×
4按键,按照反转法读出键值
*输出:
ucharkeyscan(void)
uchartemH,temL,key;
P3=0xf0;
temH=P3;
//低四位先输出0;
读入,高四位含有按键信息
P3=0x0f;
temL=P3;
//然后反转输出0;
读入,低四位含有按键信息
//-----------------------------------------------------
//两次读入的时间间隔,必须尽量的小,以尽量避免按键状态发生变化
//有些人给出的程序,就没有注重这些,有些程序甚至还有间隔几个毫秒的!
//要知道,按键是会抖动的,夜长梦多,真不知道读出些什么!
//呵呵,做而论道给出的这个程序,读键的准确性最高。
switch(temH){
case0xe0:
key=0;
break;
case0xd0:
key=1;
case0xb0:
key=2;
case0x70:
key=3;
default:
return16;
//按下的不是上述按键,就当是没有按键
//delay(10);
switch(temL){
case0x0e:
returnkey;
case0x0d:
returnkey+4;
case0x0b:
returnkey+8;
case0x07:
returnkey+12;
}//本程序虽然稍多几行,但是没有循环,还可以提前返回,所以执行的速度最快
//
///4×
4
矩阵键盘
按键为
1-16
,按键显示
0-9
、
a-f
;
//////////////////
#include<
reg52.h>
#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)
P2=0xf0;
{key=0;
show(key);
{key=1;
{key=2;
{key=3;
{key=4;
{key=5;
{key=6;
{key=7;
{key=8;
{key=9;
{key=10;
{key=11;
{key=12;
{key=13;
{key=14;
{key=15;
default:
voidmain()
while
(1)
Scan_Key();