本帖最后由 anazel 于 2016-8-2 19:41 编辑
很普通的矩阵按键扫描程序
/**************************************************************************/
//按键处理函数
//返回按键值
//mode:0 不支持连续按 1,支持连续按
//返回值0:没有然后按键按下
/**************************************************************************/
u16 keyscan(u8 mode) //实现矩阵键盘。返回值为各按键的键值,此键值由用户自己定义。
{
u16 KeyVal; //keyVal为最后返回的键值。
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff8 | 0x0007)); //先让PC0,PC1,PC2全部输出高。
if((GPIOC->IDR & 0x0070)==0x0000) //如果PC4,PC5,PC6全为0,则没有键按下。此时,返回值为0.
{
return 0;
}
else
{
delay_ms(2); //延时2ms去抖动。
if((GPIOC->IDR & 0x0070)==0x0000)//如果延时2ms后,PC4到PC6又全为0,则,刚才引脚的电位变化是抖动产生的.
//key_up = 1;
return 0;
}
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff8 | 0x0001));//让PC2,PC1,PC0输出二进制的001.
switch(GPIOC->IDR & 0x0070)//对PC4,PC5,PC6的值进行判断,以输出不同的键值。
{
case 0x0010: KeyVal = 1; break;
case 0x0020: KeyVal = 2; break;
case 0x0040: KeyVal = 3; break;
}
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff8 | 0x0002)); //让PC2,PC1,PC0输出二进制的010.
switch(GPIOC->IDR & 0x0070)//对PC4,PC5,PC6的值进行判断,以输出不同的键值。
{
case 0x0010: KeyVal=4; break;
case 0x0020: KeyVal=5; break;
case 0x0040: KeyVal=6; break;
}
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff8 | 0x0004)); //让PC2,PC1,PC0输出二进制的100.
switch(GPIOC->IDR & 0x0070)//对PC4,PC5,PC6的值进行判断,以输出不同的键值。
{
case 0x0010: KeyVal=7; break;
case 0x0020: KeyVal=8; break;
case 0x0040: KeyVal=9; break;
}
GPIO_Write(GPIOC,(GPIOC->ODR & 0xfff8 | 0x0007)); //先让PC0,PC1,PC2全部输出高。
if (!mode)
{
while(GPIOC->IDR & 0x0070); //如果有键被按下就一直等待
}
if (KeyVal == 1) SetTime_Flag = 1;
else if (KeyVal == 3) SetFunction_Flag = 1;
return KeyVal;
}
里面有个2ms的消抖延时。 |