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

今天准备试写一套蓝桥杯嵌入式比赛的赛题,中间遇到按键控制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];
		}
	}
}


不管怎么说吧,忙活了一晚上,终于把这个小问题解决了,长出一口气。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值