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

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


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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STC8G1K08是一款具有按键功能的单片机芯片。在使用该芯片进行按键程序设计时,主要需要完成两个步骤:硬件配置和软件编程。 首先,进行硬件配置。首先需要将按键连接到芯片的GPIO引脚上。可以选择使用外部上拉阻或下拉阻来实现按键的稳定工作。接下来,需要在代码中配置相应的GPIO引脚为输入模式,以便读取按键状态。 其次,进行软件编程。首先,需要设置按键的检测方式,可以选择轮询检测或中断检测。轮询检测是在主程序中周期性地读取按键状态,而中断检测是在按键状态发生变化时触发中断函数。 对于轮询检测,可以使用一个循环,在每次循环中读取按键状态,并进行相应的处理。例如,当按键按下时,可以执行某个操作,比如改变LED的状态等。 对于中断检测,首先需要在代码中配置相应的中断向量和中断优先级。当按键状态发生变化时,中断函数会被触发,可以在中断函数中进行相应的处理,比如改变LED的状态。 在按键程序设计中,还需要考虑到按键的消抖问题。可以使用软件消抖或硬件消抖的方式来解决。软件消抖是在读取按键状态之前进行一段延时,以排除按键抖动的影响。硬件消抖是通过添加RC路或者使用专用的按键芯片来实现按键的消抖。 总结起来,针对STC8G1K08芯片的按键程序设计,需要进行硬件配置,包括按键的连接和GPIO引脚的配置;同时需要进行软件编程,包括选择合适的检测方式(轮询或中断)、处理按键状态变化以及解决按键抖动等问题。通过以上步骤,可以实现按键功能的正常运行。 ### 回答2: STC8G1K08是一款由STC微控制器公司生产的微控制器芯片。编写一个按键程序,一般包括以下几个步骤: 1. 引入头文件:在程序开头引入相关的头文件,以便可以使用对应的寄存器和函数。 2. 初始化按键:通过设置相关的引脚为输入模式和上拉/下拉阻,来实现对按键的初始化。 3. 主循环中检测按键状态:在主循环中通过读取按键引脚的状态,来判断按键是否被按下。 4. 处理按键事件:如果按键按下,则执行相应的操作。可以是改变某个状态、发送信号、触发中断等。 5. 延时:在按键按下后,可以添加一段适当的延时,以避免按键的抖动现象。 6. 返回主循环:处理完按键事件后,返回主循环,等待下一次检测按键状态。 需要注意的是,具体的按键程序的编写还需根据具体的硬件路和功能需求进行适配和扩展。以上仅为一个基本的框架,实际应用中还需根据具体情况进行调整和优化。 ### 回答3: STC8G1K08是华天微子推出的一款单片机芯片,一般用于嵌入式系统中。编写按键程序时,主要涉及到按键检测、按键响应等方面。 首先,我们需要确定按键的硬件连接。STC8G1K08芯片通常会有多个I/O口可用于连接按键,需要根据实际情况选择合适的I/O口。同时,应在按键的位置上加入合适的上下拉阻,以确保按键按下和松开时的信号稳定。 其次,我们需要编写按键检测的代码。可以通过轮询的方式来检测按键的状态。可以设置一个定时器,在定时器中断中读取按键状态。如果检测到按键按下,就可以进行相应的处理。 当检测到按键按下后,可以进行一些按键响应的操作。比如可以在按键按下时点亮LED灯,发送一个信号给其他模块进行控制等。需要根据实际需求来确定按键的响应方式。 在编写按键程序时,还需要考虑防抖处理。由于按键机械结构的原因按键按下和松开的瞬间可能会有抖动现象。为了避免这种抖动对按键程序的影响,可以在软件中增加一个延时,使得在检测到按键状态变化后等待一段时间再进行处理。 最后,需要注意按键程序的实时性。当按键按下时,可以通过立即处理按键的事件来提高响应速度。在处理按键事件时,可以设置一个标志位,表示按键已经被按下,在主程序中根据这个标志位来执行相应的按键操作。 综上所述,编写STC8G1K08的按键程序需要考虑硬件连接、按键检测、按键响应、防抖处理等方面的内容。在实际应用中,可以根据具体需求来进行相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值