单片机矩阵键盘的编程共15页.docx
《单片机矩阵键盘的编程共15页.docx》由会员分享,可在线阅读,更多相关《单片机矩阵键盘的编程共15页.docx(12页珍藏版)》请在冰豆网上搜索。
单片机矩阵键盘的编程共15页
I/O端口输出1的端口与输出0的端口对接的时候会检验出原来的端口是0
第一个,这个是错误程序
#include
voiddelay1ms(unsignedinti)//延时函数
unsignedcharj;
while(i--)
for(j=0;j<115;j++)//1ms基准延时程序
voidmain()
while
(1)
P1=0xf0;//建立初始状态,每一行赋值0,每一列赋予1
unsignedchars[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管灯
unsignedintl;//分别代表作列与行
unsignedintr;
if(P1!
=0xf0)//检验有没有按键被按下
delay1ms(15);//避免前沿抖动,延时大约15ms
switch(P1)//检验有没有键盘被按下
{//如果按下了就检验是哪一列被按下了
case0x70:
//p1^7被按下
l=4;
case0xB0:
//p1^6被按下
l=3;
case0xD0:
//p1^5被按下
l=2;
case0xE0:
//p1^4被按下
l=1;
default:
break;
P1=0xf;、//每一列赋予1,每一行赋予0
switch(P1)//检验哪一行的按键被按下
case0xE:
//p1^0被按下
r=1;
case0xD:
//p1^2被按下
r=2;
case0xB:
//p1^3被按下
r=3;
case0x7:
r=4;//p1^4被按下
default:
break;
//已经知道哪一个按键被按下
r=r*l;//得到的数在数值上等于要显示的数目
P1=s8[r]//数码管亮
delay1ms(15);//避免后延抖动
错误的地方在于
P1=0xf;、//每一列赋予1,每一行赋予0
switch(P1)//检验哪一行的按键被按下
这是因为如果没有再次判断当P1!
=0XF的时候,就可能出现没有符合case之中的情况而直接运行default这种情况。
这个是错的
改正版也是错的
改正版
#include
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodes8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
voiddelay1ms(uinti)
ucharj;
while(i--)
for(j=0;j<115;j++)//1ms基准延时程序
voidmain()
while
(1)
uintl;//分别代表作列与行
uintr;
P1=0xf0;//建立初始状态,每一行赋值0,每一列赋予1
if(P1!
=0xf0)//检验有没有按键被按下
delay1ms(15);//避免前沿抖动,延时大约15ms
switch(P1)//检验有没有键盘被按下
{//如果按下了就检验是哪一列被按下了
case(0x70):
//p1^7被按下
l=4;
break;
case(0xB0):
//p1^6被按下
l=3;
break;
case(0xD0):
//p1^5被按下
l=2;
break;
case(0xE0):
//p1^4被按下
l=1;
break;
default:
break;
P1=0xf;
switch(P1)//检验哪一行的按键被按下
case(0xE):
//p1^0被按下
r=1;
break;
case(0xD):
//p1^2被按下
r=2;
break;
case(0xB):
//p1^3被按下
r=3;
break;
case(0x7):
r=4;
break;//p1^4被按下
default:
break;
//已经知道哪一个按键被按下
r=r*l;//得到的数在数值上等于要显示的数目
P1=s8[r];//数码管亮
delay1ms(15);//避免后延抖动
再次改正板
这个还是错的
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP27=P2^7;
unsignedcharcodes8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
voiddelay1ms(uinti)
ucharj;
while(i--)
for(j=0;j<115;j++)//1ms基准延时程序
voiddisplay(uinti)
P27=0;//选通最有端的数码管显示
P0=s8[i];//显示i参数传来的字型码
voidmain()
while
(1)
uintl;//分别代表作列与行
uintr;
P1=0xf0;//建立初始状态,每一行赋值0,每一列赋予1
if(P1!
=0xf0)//检验有没有按键被按下
delay1ms(15);//避免前沿抖动,延时大约15ms
switch(P1)//检验有没有键盘被按下
{//如果按下了就检验是哪一列被按下了
case(0x70):
//p1^7被按下
l=4;
break;
case(0xB0):
//p1^6被按下
l=3;
break;
case(0xD0):
//p1^5被按下
l=2;
break;
case(0xE0):
//p1^4被按下
l=1;
break;
default:
break;
P1=0xf;
if(P1!
=0xf)/*改正的的地方,由于在键入的时候,单片机未必会接收到已经改变了的P1口的数值,所以当如没有再次检验的时候就会出现错误*/
switch(P1)//检验哪一行的按键被按下
case(0xE):
//p1^0被按下
r=1;
r=r*l;
display(r);
break;
case(0xD):
//p1^2被按下
r=2;
r=r*l;
display(r);
break;
case(0xB):
//p1^3被按下
r=3;
r=r*l;
display(r);
break;
case(0x7):
r=4;
r=r*l;
display(r);
break;//p1^4被按下
default:
break;
}//已经知道哪一个按键被按下
delay1ms(15);//避免后延抖动
错误之处在于当我按了第2行第二列的时候就会出现显示4,而不是6,这是因为我只记录了4=2*2,于是就输出数组s8的第5个数字。
再次改正
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitP27=P2^7;
unsignedcharcodes8[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
voiddelay1ms(uinti)
ucharj;
while(i--)
for(j=0;j<115;j++)//1ms基准延时程序
voidmain()
uintr,l;
while
(1)
P1=0xf0;//建立初始状态,每一行赋值0,每一列赋予1
P27=0;//选通最有端的数码管显示
if(P1!
=0xf0)//检验有没有按键被按下
delay1ms(15);//避免前沿抖动,延时大约15ms
switch(P1)//检验有没有键盘被按下
{//如果按下了就检验是哪一列被按下了
case(0x70):
//p1^7被按下
l=4;
break;
case(0xB0):
//p1^6被按下
l=3;
break;
case(0xD0):
//p1^5被按下
l=2;
break;
case(0xE0):
//p1^4被按下
l=1;
break;
default:
break;
P1=0xf;
if(P1!
=0xf)
switch(P1)//检验哪一行的按键被按下
case(0xE):
//p1^0被按下
r=1;
switch(l)
case1:
P0=s8[0];//显示i参数传来的字型码
break;
case2:
P0=s8[1];
break;
case3:
P0=s8[2];
break;
case4:
P0=s8[3];
break;
default:
break;
break;
case(0xD):
//p1^2被按下
r=2;
switch(l)
case1:
P0=s8[4];//显示i参数传来的字型码
break;
case2:
P0=s8[5];
break;
case3:
P0=s8[6];
break;
case4:
P0=s8[7];
break;
default:
break;
break;
case(0xB):
//p1^3被按下
r=3;
switch(l)
case1:
P0=s8[8];//显示i参数传来的字型码
break;
case2:
P0=s8[9];
break;
case3:
P0=s8[10];
break;
case4:
P0=s8[11];
default:
break;
break;
case(0x7):
r=4;
switch(l)
case1:
P0=s8[12];//显示i参数传来的字型码
break;
case2:
P0=s8[13];
break;
case3:
P0=s8[14];
break;
case4:
P0=s8[15];
default:
break;
break;//p1^4被按下
default:
break;
}//已经知道哪一个按键被按下
delay1ms(15);//避免后延抖动
}这个版本没错误了
希望以上资料对你有所帮助,附励志名言3条:
1、有志者自有千计万计,无志者只感千难万难。
2、实现自己既定的目标,必须能耐得住寂寞单干。
3、世界会向那些有目标和远见的人让路。