单片机矩阵键盘的编程共15页.docx

上传人:b****2 文档编号:24315610 上传时间:2023-05-26 格式:DOCX 页数:12 大小:16.36KB
下载 相关 举报
单片机矩阵键盘的编程共15页.docx_第1页
第1页 / 共12页
单片机矩阵键盘的编程共15页.docx_第2页
第2页 / 共12页
单片机矩阵键盘的编程共15页.docx_第3页
第3页 / 共12页
单片机矩阵键盘的编程共15页.docx_第4页
第4页 / 共12页
单片机矩阵键盘的编程共15页.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

单片机矩阵键盘的编程共15页.docx

《单片机矩阵键盘的编程共15页.docx》由会员分享,可在线阅读,更多相关《单片机矩阵键盘的编程共15页.docx(12页珍藏版)》请在冰豆网上搜索。

单片机矩阵键盘的编程共15页.docx

单片机矩阵键盘的编程共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、世界会向那些有目标和远见的人让路。

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

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1