51单片机如何判断哪个矩阵按钮按下详细解释
按下矩阵按钮,数码管显示对应的数字0-9、a-f



工具/原料
软件uvision4
stc-isp
方法/步骤
下图是解释
给定P3口的值集合
unsigned char code givenP3Table[]={0xfe,0xfd,0xfb,0xf7};
给定P3口后按下某个按钮响应的值集合
unsigned char code implyP3Table[4][4]=
{{0xee,0xde,0xbe,0x7e},
{0xed,0xdd,0xbd,0x7d},
{0xeb,0xdb,0xbb,0x7b},
{0xe7,0xd7,0xb7,0x77}};

#include<reg51.h>
sbit dula=P2^6;
sbit wela=P2^7;
void delay(unsigned char i)
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/*****按下了就返回0-15中对应的某个数,没按就返回16***开始*****/
unsigned char code table[]={0x3f,0x06,0x5b,0x4f, //数码管0,1,2,3,
0x66,0x6d,0x7d,0x07, //数码管4,5,6,7,
0x7f,0x6f,0x77,0x7c, //数码管8,9,a,b,
0x39,0x5e,0x79,0x71,}; //数码管c,d,e,f,
给定P3口的值集合
unsigned char code givenP3Table[]={0xfe,0xfd,0xfb,0xf7};
给定P3口后按下某个按钮响应的值集合
unsigned char code implyP3Table[4][4]={{0xee,0xde,0xbe,0x7e},
{0xed,0xdd,0xbd,0x7d},
{0xeb,0xdb,0xbb,0x7b},
{0xe7,0xd7,0xb7,0x77}};
unsigned char code returnNumTable[4][4]={{0,1,2,3},
{4,5,6,7},
{8,9,10,11},
{12,13,14,15}};
unsigned char ScanMatrix()
{
unsigned char row,column;
unsigned char key;
unsigned char temp;
for(row=0;row<4;row++)
{
P3=givenP3Table[row];
temp=P3;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(10);
if(temp!=0xf0)
{
temp=P3;
for(column=0;column<4;column++)
if(temp==implyP3Table[row][column])
{
key=returnNumTable[row][column];
break;//有键按下就跳出for(column=0;column<4;column++)内循环
}
}
while(temp!=0xf0)
{
temp=P3;
temp=temp&0xf0;
}
break;//有键按下就跳出for(row=0;row<4;row++)外循环
}
else key=16;
}
return key;
}
/*****按下了就返回0-15中对应的某个数,没按就返回16***结束*****/
void display(unsigned char num)
{
P0=table[num];
dula=1;
dula=0;
P0=0xc0;
wela=1;
wela=0;
}
unsigned char ret,tmp;//主函数中不能定义局部变量
void main()
{
dula=0;//数码管什么都不显示
wela=0;
tmp=16;//tmp初始值不能为0-15中某个数,会影响后面的判断
while(1)
{
ret=ScanMatrix();
if(ret!=tmp&&ret!=16)
{
tmp=ret;
display(tmp);
}
}
}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
阅读量:173
阅读量:164
阅读量:137
阅读量:83
阅读量:29