今天准备试写一套蓝桥杯嵌入式比赛的赛题,中间遇到按键控制LED点亮,要求按下按键,对应的LED点亮,然而我遇到了一个问题就是,每次上电,当我还没有按下按键的时候,就会有一个LED点亮,并且还是第一个或者第二个亮,我找了好久,就是找不出问题出在哪,最后仔细的研究了一下程序,我发现可能是因为上电的瞬间,单片机IO口的电平不稳定,可能会出现高低电平的跳变,于是就会导致按键检测的程序误以为有按键按下,但是我又感觉,不应该出现这种情况的呀,上电之后,单片机还要去执行各种初始化程序,光这初始化程序就会耗费一定的时间,这个时候单片机IO口电平应该变稳定了吧,可能是上一句刚执行完LCD的语句,它可能会导致某些奇怪的变化吧,于是我就在程序进入按键检测函数或者说进入主函数之前,加上了1ms的延时,问题竟然解决了!!!
以下是我的主函数:
int main(void)
{
SysTick_Config(SystemCoreClock/1000);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
KeyInit();
LED_Init();
LCD_DisplayStringLine(Line2 ," Now Floor ");
LCD_DisplayStringLine(Line4 ," 1 ");
Delay_Ms(1);//这就是我加的1ms延时,利用系统滴答定时器产生的
while(1)
{
KeyDriver();
}
}
按键检测程序如下:
#include "config.h"
u8 keysta[4]={1,1,1,1};
u8 keycodemap[4]={1,2,3,4};
void KeyInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void KeyAction(u8 keycode)
{
if(keycode==1)
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_SetBits(GPIOC,LEDAll);
GPIO_ResetBits(GPIOC,LED1);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
else if(keycode==2)
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_SetBits(GPIOC,LEDAll);
GPIO_ResetBits(GPIOC,LED2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
else if(keycode == 3)
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_SetBits(GPIOC,LEDAll);
GPIO_ResetBits(GPIOC,LED3);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
else if(keycode == 4)
{
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_SetBits(GPIOC,LEDAll);
GPIO_ResetBits(GPIOC,LED4);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
void KeyScan(void)
{
u8 i;
static u8 keybuff[4]={0xff,0xff,0xff,0xff};
keybuff[0]=(keybuff[0]<<1)|key1;
keybuff[1]=(keybuff[1]<<1)|key2;
keybuff[2]=(keybuff[2]<<1)|key3;
keybuff[3]=(keybuff[3]<<1)|key4;
for(i=0;i<4;i++)
{
if(keybuff[i]==0xff)
{
keysta[i]=1;
}
else if(keybuff[i]==0x00)
{
keysta[i]=0;
}
else
{}
}
}
void KeyDriver(void)
{
u8 i;
static u8 backup[4]={1,1,1,1};
for(i=0;i<4;i++)
{
if(keysta[i]!=backup[i])
{
if(backup[i]!=0)
{
KeyAction(keycodemap[i]);
}
backup[i]=keysta[i];
}
}
}
不管怎么说吧,忙活了一晚上,终于把这个小问题解决了,长出一口气。。。