可不可以把按键编码那里的代码用查表的方式来解决呢?
我是这么做的:
//按键值表
const uchar key_value[] PROGMEM ={
0x0f,0xff,0xff,0xff,0x01,0xff,0x04,0x07,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x00,0xff,0xff,0xff,0x02,0xff,0x05,0x08,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x0e,0xff,0xff,0xff,0x03,0xff,0x06,0x09,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0x0d,0xff,0xff,0xff,0x0c,0xff,0x0b,0x0a
};
//按键检测,返回值为0xff表示无效按键
uchar key (void)
{
uchar key_x,key_y;
keyline_PORT=0x0f; //置为高4位输出0,低4位上拉输入
keyline_DDR=0xf0;
nop;nop;
key_x=keyline_PIN;
if ((key_x&0x0f)!=0x0f)
{
delay_ms (10); //延时10MS
key_x=keyline_PIN;
if ((key_x&0x0f)!=0x0f)
key_x&=0x0f; //保存低4位有效值
else
return 0xff;
keyline_PORT=0xf0; //置为高4位上拉输入,低4位输出0
keyline_DDR=0x0f;
nop;nop;
key_y=keyline_PIN;
if ((key_y&0xf0)!=0xf0)
{
key_y&=0xf0; //保存高4位有效值
//key_x|=key_y;
return (pgm_read_byte (key_value+(key_x|key_y)-0x77));
}
else
return 0xff;
}
else
return 0xff;
} |