//程序中没有做按键去抖,也没有考虑多个键一起按下的状况。
//最低两位数码管显现相应的按键(如按下S10,在显现10;按下S25,则显现25)
//无按键按下的时分显现FF
//按键跟按键的扫描成果满意如下联系:
//按键扫描成果(result)按键扫描成果
//K100XE7K180XB7
//K110XEBK190XBB
//K120XEDK200XBD
//K130XEEK210XBE
//K140XD7K220X77
//K150XDBK230X7B
//K160XDDK240X7D
//K170XDEK250X7E
#include//包括 单片机 内部资源预界说
__CONFIG(0x1832);
//芯片装备字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振动
intresult;
voiddelay();//delay函数声明
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–;);//延时
}