uchar key_val; //存放键值
uchar key_Map[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
//Check_Key(),检查按键,确认键值
void Check_Key(void)
{
uchar row ,col,tmp1,tmp2;
tmp1 = 0x80;
for(row = 0;row < 4;row++) //行扫描
{
P1OUT = 0xf0; //P1.4~P1.7输出全1
P1OUT -= tmp1; //P1.4~p1.7输出四位中有一个为0
tmp1 >>=1;
if ((P1IN & 0x0f) < 0x0f) //是否P1IN的P1.0~P1.3中有一位为0
{
tmp2 = 0x01; // tmp2用于检测出那一位为0
for(col = 0;col < 4;col++) // 列检测
{
if((P1IN & tmp2) == 0x00) // 是否是该列,等于0为是
{
key_val = key_Map[row * 4 + col]; // 获取键值
return; // 退出循环
}
tmp2 <<= 1; // tmp2右移1位
}
}
}
}
这只是一个子程序,我不知道你主程序要执行什么操作,所以只能给你这些,希望对你有帮助。
uchar keycode[16]={
0xee,0xde,0xbe,0x7e,
0xed,0xdd,0xbd,0x7d,
0xeb,0xdb,0xbb,0x7b,
0xe7,0xd7,0xb7,0x77,
};//矩阵键盘按键码
unsigned char key_done()
{
unsigned char row,col,i,k=16;
flag=0;
P4DIR=0xf0;
P4OUT=0x0f;
if((P4IN&0x0f)!= 0x0f)
{
delay1ms(5);
if((P4IN&0x0f)!= 0x0f)
{
col=P4IN&0x0f;
P4DIR=0x0f;
P4OUT=0xf0;
row=P4IN&0xf0;
for(i=0; i<16; i++)
{
if((row|col)==keycode)
{
k=i;
flag=1;
break;
}
}
}
P4DIR=0xf0;
P4OUT=0x0f;
while((P4IN&0x0f)!=0x0f);
}
return k;
}
需要在IO口加上拉电阻。
回复 7楼 gujiao 的帖子
请问这个程序能够实现么?我想在液晶上显示键值,但是没反应 求指导 谢谢!