单片机按键扫描程序和显示程序及延时程序解析

控制/MCU

1883人已加入

描述

//程序中没有做按键去抖,也没有考虑多个键同时按下的情况。

//最低两位数码管显示相应的按键(如按下S10,在显示10;按下S25,则显示25)

//无按键按下的时候显示FF

//按键跟按键的扫描结果满足如下关系:

//按键扫描结果(result)按键扫描结果


 

//K100XE7K180XB7

//K110XEBK190XBB

//K120XEDK200XBD

//K130XEEK210XBE

//K140XD7K220X77

//K150XDBK230X7B

//K160XDDK240X7D

//K170XDEK250X7E

#include//包含 单片机 内部资源预定义

__CONFIG(0x1832);

//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

intresult;

voiddelay();//delay函数申明

voidinit();//I/O口初始化函数申明

voidsCAN();//按键扫描程序申明

voiddisplay(intx);//显示函数申明

//---------------------------------------------------

//主程序

voidmain()

{

while(1)//循环工作

{

init();//调用初始化子程序

scan();//调用按键扫描子程序

display(result);//调用结果显示子程序

}

}

//---------------------------------------------------

//初始化函数

voidinit()

{

ADCON1=0X07;//设置A口为普通I/O口

TRISA=0X0f;//设置A口高2位为输出,低4位为输入

TRISC=0XF0;//设置C口高4位为输入,低4位为输出

TRISD=0X00;//设置D口为输出

PORTA=0XFF;

PORTD=0XFF;//先清除所有显示

}

//---------------------------------------------------

//按键扫描程序

voidscan()

{

PORTC=0XF7;//C3输出低电平,其他三位输出高电平

asm(“nop”);//插入一定延时,确保电平稳定

result=PORTC;//读回C口高4位结果

result=result&0xf0;//清除低4位

if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下)?

{

result=result|0x07;//否,加上低4位0x07,做为按键扫描的结果

}

else//是,改变低4位输出,重新判断是否有按键按下

{

PORTC=0XFb;//C2输出低电平,其他三位输出高电平

asm(“nop”);//插入一定延时,确保电平稳定

result=PORTC;//读回C口高4位结果

result=result&0xf0;//清除低4位

if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下)

{

result=result|0x0b;//否,加上低4位0xb,做为按键扫描的结果

}

else//是,改变低4位输出,重新扫描

{

PORTC=0XFd;//C1输出低电平,其他三位输出高电平

asm(“nop”);//插入一定延时,确保电平稳定

result=PORTC;//读回C口高4位结果

result=result&0xf0;//清除低4位

if(result!=0xf0)//判断高4位是否为全1(全1代表没按键按下)

{

result=result|0x0d;//否,加上低4位0x0d,做为按键扫描的结果

}

else//是,改变低4位的输出,重新扫描

{

PORTC=0XFe;//C0输出低电平,其他三位输出高电平

asm(“nop”);//插入一定延时,确保电平稳定

result=PORTC;//读回C口高4位结果

result=result&0xf0;//清除低4位

if(result!=0xf0)//判断高四位是否为全1(全1代表没有按键按下)

{

result=result|0x0e;//否,加上低4位0x0e,做为按键扫描的结果

}

else//是,全部按键扫描结束,没有按键按下,置无按键按下标志位

{

result=0xff;//扫描结果为0xff,做为没有按键按下的标志

}

}

}

}

}

//----------------------------------------------------------

//显示程序

voiddisplay(intx)

{

switch(result)

{

case0xe7:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xc0;PORTA=0X1F;delay();break;//K10

case0xeb:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xf9;PORTA=0X1F;delay();break;//K11

case0xed:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xa4;PORTA=0X1F;delay();break;//K12

case0xee:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0xb0;PORTA=0X1F;delay();break;//K13

case0xd7:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0x99;PORTA=0X1F;delay();break;//K14

case0xdb:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0x92;PORTA=0X1F;delay();break;//K15

case0xdd:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X82;PORTA=0X1F;delay();break;//K16

case0xde:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0XF8;PORTA=0X1F;delay();break;//K17

case0xb7:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X80;PORTA=0X1F;delay();break;//K18

case0xbb:

PORTD=0xf9;PORTA=0X2F;delay();PORTD=0X90;PORTA=0X1F;delay();break;//K19

case0xbd:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xc0;PORTA=0X1F;delay();break;//K20

case0xbe:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xf9;PORTA=0X1F;delay();break;//K21

case0x77:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xa4;PORTA=0X1F;delay();break;//K22

case0x7b:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0xb0;PORTA=0X1F;delay();break;//K23

case0x7d:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0x99;PORTA=0X1F;delay();break;//K24

case0x7e:

PORTD=0xa4;PORTA=0X2F;delay();PORTD=0x92;PORTA=0X1F;delay();break;//K25

case0xff:

PORTD=0x8e;PORTA=0X2F;delay();PORTD=0x8e;PORTA=0X1F;delay();//无按键按下

}

}

//------------------------------------------------------------------

//延时程序

voiddelay()//延时程序

{

inti;//定义整形变量

for(i=0x100;i--;);//延时

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分