void KEY_Scan()
{
TRISB=0X0F;
PORTB = 0X7f; //B7输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f) //判断低4位是否为全1(全1代表没按键按下)?
{
delayms(20);
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f)
{
result = result | 0x70; //否,加上高4位0x70,做为按键扫描的结果
}
switch(result)
{
case 0x7e:key=12;break;
case 0x7d:key=13;break;
case 0x7b:key=14;break;
case 0x77:key=15;break;
}
}
PORTB = 0Xbf; //B7输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f) //判断低4位是否为全1(全1代表没按键按下)?
{
delayms(20);
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f)
{
result = result | 0xb0; //否,加上高4位0x70,做为按键扫描的结果
}
switch(result)
{
case 0xbe:key=8;break;
case 0xbd:key=9;break;
case 0xbb:key=10;break;
case 0xb7:key=11;break;
}
}
PORTB = 0Xdf; //B7输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f) //判断低4位是否为全1(全1代表没按键按下)?
{
delayms(20);
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f)
{
result = result | 0xd0; //否,加上高4位0x70,做为按键扫描的结果
}
switch(result)
{
case 0xde:key=4;break;
case 0xdd:key=5;break;
case 0xdb:key=6;break;
case 0xd7:key=7;break;
}
}
PORTB = 0Xef; //B7输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f) //判断低4位是否为全1(全1代表没按键按下)?
{
delayms(20);
result = PORTB; //读回B口低4位结果
result = result & 0x0f; //清除高4位
if (result != 0x0f)
{
result = result | 0xe0; //否,加上高4位0x70,做为按键扫描的结果
}
switch(result)
{
case 0xee:break;
case 0xed:key=1;break;
case 0xeb:key=2;break;
case 0xe7:key=3;break;
}
}