注意:IO口都要上拉。
一、IO口设置为开漏输出:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
二、扫描程序:
uint8_t KeyScan(void)
{
int tmp;
static int KeyConter = 0;
int keyval;
keyval = 0xFF;
if (KeyConter < 1)
{//去抖
KeyConter++;
}
else
{
keyval = 0xFF;
GPIO_Write(GPIOA, 0x0F); //GPIOA低四位置1,既行选全置1
tmp = (GPIO_ReadInputData(GPIOA) | 0xF0);//读取此时的列选的值
keyval &= tmp;
GPIO_Write(GPIOA, 0xF0);//列
选全置1
tmp = (GPIO_ReadInputData(GPIOA) | 0x0F);//
读取此时的行选的值
keyval &= tmp; //两次的结果相与得到是一个唯一值,既一个按键按下只有一个keyval与之对应
switch (keyval)
{
case 0xee: return 1;
case 0xde: return 2;
case 0xbe: return 3;
case 0x7e: return 4;
case 0xed: return 5;
case 0xdd: return 6;
case 0xbd: return 7;
case 0x7d: return 8;
case 0xeb: return 9;
case 0xdb: return 10; //*
case 0xbb: return 11;
case 0x7b: return 12; //#
case 0x77: return 13; //下一位
default: return 0;
}
KeyConter=0;
}
}
这个我也不太懂,可能是因为用了GPIO_Write函数
一周热门 更多>