4乘4矩阵法.docx

上传人:b****2 文档编号:3394109 上传时间:2023-05-05 格式:DOCX 页数:7 大小:15.83KB
下载 相关 举报
4乘4矩阵法.docx_第1页
第1页 / 共7页
4乘4矩阵法.docx_第2页
第2页 / 共7页
4乘4矩阵法.docx_第3页
第3页 / 共7页
4乘4矩阵法.docx_第4页
第4页 / 共7页
4乘4矩阵法.docx_第5页
第5页 / 共7页
4乘4矩阵法.docx_第6页
第6页 / 共7页
4乘4矩阵法.docx_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

4乘4矩阵法.docx

《4乘4矩阵法.docx》由会员分享,可在线阅读,更多相关《4乘4矩阵法.docx(7页珍藏版)》请在冰点文库上搜索。

4乘4矩阵法.docx

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();

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2