可以不用中断,发个程序你参考下
unsigned char read()
{
unsigned char temp,key_value,row,column;
PORTA &= 0xF0; //低四位输出低电平
delay_nus(5); // 延时5us
if((((PORTB<<3)&0xF0)|(PORTA&0x0F) & 0xF0)!= 0xF0) // 作初检查有否键按下,没有,就返回
{ // 如果行线不全为1,可能有键按下
delay_nus(500);// 延时去抖动
//设置列线初始值3~0=1110
for(column=0,PORTA&=0xFE,PORTA|=0xFE;column<4;column++)
{
for(row=0,temp=0b11101111;row<4;row++)// 设置行线初始值7~4=1110
{
while((((PORTB<<3)&0xF0)|(PORTA&0x0F) & 0xF0)==(temp & 0xF0))// 输入行线,查看这行有否键按下
{
key_value=(row<<2)+column;// 键编码=4*行输入值+列扫描值
// key_value=Key_table[key_value];// 键盘编码转换键值
delay_nus(500);// 延时去抖
if((((PORTB<<3)&0xF0)|(PORTA&0x0F) & 0xF0)== 0xF0) // 检查按键是否松开
{
return (key_value);
}
}
temp<<=1;// 行线左移1位
}
PORTA &=(~(2<<column));// 列线扫描值左移1位,扫描下一行
}
}
return (0x0ff);
|