pic单片机4x4键盘扫描程序
扫描二维码
随时随地手机看文章
//程序中没有做按键去抖,也没有考虑多个键同时按下的情况。
//最低两位数码管显示相应的按键(如按下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--;);//延时
}