|
//参考C51改写,并调试通过
//端口定义
//4X4键盘输入
#define D_IO_SET DDRD
#define OUT_XY PORTD
#define IN_XY PIND
//键盘输入程序
uchar key_4x4(void)
{ uchar i,SC_X=0,RD_Y=0;
OUT_XY=0xF0; //
D_IO_SET=0x0F; //
_delay_ms(10);
asm("nop");
asm("nop");
if((IN_XY&0xf0)!=0xf0)
{ _delay_ms(10);
asm("nop");
asm("nop");
if((IN_XY&0xf0)!=0xf0)
{ SC_X=0xfe; //行扫描初值
while((SC_X&0x10)!=0)
{ OUT_XY=SC_X; //输出扫描值
asm("nop");
asm("nop");
if((IN_XY&0xf0)!=0xf0)
{ asm("nop");
asm("nop");
RD_Y=(IN_XY&0xf0)|0x0f;//读列值
//---------------------等待按键弹起
asm("nop");
asm("nop");
for(i=0;i<50;i++) //0.XS后自动确认按下,退出
{ asm("nop");
asm("nop");
if(((IN_XY&0xf0)|0x0f)!=RD_Y)break;
asm("nop");
asm("nop");
_delay_ms(5);
asm("nop");
}
//------------------------------
return((~SC_X)+(~RD_Y));//返回键值Y+X
}
else
SC_X=(SC_X<<1)|0x01; //扫描下1行,共4行
}
}
}
return 0;
} |
|