单片机上电总是立即执行按键程序

2019-04-13 15:16发布

今天准备试写一套蓝桥杯嵌入式比赛的赛题,中间遇到按键控制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]; } } } 不管怎么说吧,忙活了一晚上,终于把这个小问题解决了,长出一口气。。。