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 
小果子 阅读(253) 
评论(0)  编辑 收藏 引用  所属分类: 
单片机