static bit isKeyDown(){
KEY=0x0f;
if((KEY&0x0f)!=0x0f)
return 1;
else return 0;
}
//线反转法 返回键盘索引
unsigned char KeyScan_XF(){
unsigned char r=0,c=0;
if(isKeyDown()){
delayms(20); //去抖动
if(isKeyDown()){
KEY=0x0f;
switch(KEY){
case 0x0e:c=0;break; //第一列
case 0x0d:c=1;break; //第二列
case 0x0b:c=2;break; //第三列
case 0x07:c=3;break; //第四列
default: break;
}
KEY=0xf0;//电平反向
switch(KEY){
case 0xe0:r=0;break; //第一行
case 0xd0:r=1;break; //第二行
case 0xb0:r=2;break; //第三行
case 0x70:r=3;break; //第四行
default: break;
}
while(!isKeyDown());// 按键释放,处理长按
return r*4+c+1;
}
}
return 0;
}
//查询法 返回键盘索引
unsigned char getRorC(){
KEY&=0x0F;
KEY|=0x70; //0111
if((KEY&0x0f)!=0x0f){
return 3;
}
KEY&=0x0f;
KEY|=0xB0; //1011
if((KEY&0x0f)!=0x0f){
return 2;
}
KEY&=0x0f;
KEY|=0xD0; //1101
if((KEY&0x0f)!=0x0f){
return 1;
}
KEY&=0x0f;
KEY|=0xE0; //1110
if((KEY&0x0f)!=0x0f){
return 0;
}
return -1;//impossible
}
unsigned char KeyScan_CS(){
unsigned char r=0,c=0;
if(isKeyDown()){
delayms(20); //去抖动
if(isKeyDown()){
switch(KEY){
case 0x0e:c=0;break;//第一列
case 0x0d:c=1;break;//第二列
case 0x0b:c=2;break;//第三列
case 0x07:c=3;break;//第四列
default:break;
}
r=getRorC();
return r*4+c+1;
}
}
KEY=0x0f;
return 0;
}
posted on 2010-07-29 15:42
小果子 阅读(227)
评论(0) 编辑 收藏 引用 所属分类:
单片机