u8 check_Key(void)
{
u16 cord_h,cord_l;//行列值中间变量 高位为行 ,低位为列;
u8 Val = 0xFF;
//i=(GPIOG->ODR)&0xFFFF;
GPIOG->CRL=0x33888844;
GPIOG->CRH=0x44444433;
Delay_1us();
GPIOG->ODR = 0xFC3F; //行线输出全为0 //1111 1100 0011 1111
Delay_1us();
cord_h = GPIOG->IDR & 0x003C; //读入列线值 //0000 0000 0011 1100
if(cord_h != 0x003C) //先检测有无按键按下 //1111 1100 0011 1111
{
Delay_Nms(100); //去抖
if(cord_h != 0x003C) // 0000 0000 0000 0000 //1111 1100 0011 1111
{
cord_h = GPIOG->IDR&0x003C; //读入列线值//
GPIOG->CRL=0x88333344;
GPIOG->CRH=0x44444488;
Delay_1us();
GPIOG->ODR = cord_h|0xFFC3; //输出当前列线值1111 1111 1100 0011
Delay_Nms(2);// 此延时比不可少;
cord_l = GPIOG->IDR&0x03C0; //读入行线值 0000 0011 1100 0000
Delay_1us();
cord_h>>=2;
cord_l>>=2;
Val = (cord_h+cord_l)&0xff;
return Val; //键盘最后组合码值
}
}
return 0xFF; //返回该值
}
本人一行行写出来的.适用于寄存器写和库版本写都可以用,反转法循环扫描;由于本人接的是GPIOG PIN2 - PIN 9 所以字节都是左移了两位的 后面移回来了. 输出的时候要 推挽输出 输入的时候要上拉输入;如果直接从pin0-pin7 那就更容易了.
键盘直接接的IO口 没其他外拉了.
---------------------------------
你的设计如果有多个按键同时按下,会不会有输出短路的情况。
一周热门 更多>