线翻翻转
每一行的按键接在同一个引脚上(P3.0—P3.3),每一列的按键接在同一个引脚上(P3.4~P3.7).
一 首先每一行置高电平,列置低电平(P3=0X0F)。
二 当有按键按下时,他所对应的行列的电平都将为低电平。即P3的值发生变 化,读取P3的值赋值给 H 可确定按键的行坐标。
三 将P3电平翻转(P3=0xF0),行为低电平,列为高电平。由于单片机运行速度很快所以此时按键还是按下状态,他的行列都为低低电平。
四 读取P3的值赋值给 L 可确定按键的列坐标.
C51配置
int keyscan() //N为第几个按键
{
P0=0x0f; //行高 列低
if(P0!=0x0f) //是否有按键按下
{
delay(10);//消抖
if(P0!=0x0f) //有按键按下
{
switch(PO)//读取PO的值,判断行
{
case 0X0E; H=1;break; //00001110 第一行有按键按下
case 0X0D; H=2;break;
case 0X0B; H=3;break;
case 0X07; H=4;break;
default;break;
}
P0=0xF0;//翻转行低,列高,判断列。 注;此时按键还是按下状态所以在给P0赋0xf0之后的瞬间按键的那一行列还为低电平。
switch(PO)//读取PO的值,判断行
{
case 0XE0; L=1;break; //1110 0000 第一列有按键按下
case 0XD0; L=2;break;
case 0XB0; L=3;break;
case 0X70; L=4;break;
default;break;
}
N=(H-1)*4+L;
}
}
return N;
}
STM32配置
引脚
void Key_Init1(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2| GPIO_Pin_3 );
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//下拉输入
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void Key_Init2(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上下拉输入
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_6 | GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7 );
}
按键设置
uint8_t Key_GetNum(void)
{
int v_h=0,v_l=0,v,v1,v2;
Key_Init1();//pb0~3 高pb4·7 低
v1=GPIO_ReadInputData(GPIOA);
v1=v1&0x00F0;
if(v1!=0x00F0)
{
Delay_ms(10);
v1=GPIO_ReadInputData(GPIOA);//消抖
v1=v1&0x00F0;
if(v1!=0x00F0)
{
v1=GPIO_ReadInputData(GPIOA);
v1=v1&0x00F0;
switch(v1)
{
case 0x00E0: v_l=1;break;
case 0x00D0: v_l=2;break;
case 0x00B0: v_l=3;break;
case 0x0070: v_l=4;break;
default:break;
}
Key_Init2();
v2=GPIO_ReadInputData(GPIOA);
v2=v2&0x000F;
switch(v2)
{
case 0x000E: v_h=1;break;
case 0x000D: v_h=2;break;
case 0x000B: v_h=3;break;
case 0x0007: v_h=4;break;
default:break;
}
v=(v_h-1)*3+v_l;
}
}
return v;
}