今天准备试写一套蓝桥杯嵌入式比赛的赛题,中间遇到按键控制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. 单片机c语言的按键程序,51单片机按键扫描C程序

    原标题:51单片机按键扫描C程序 大二上学期做过80 的按键程序,当时项目要求实现按键控制 屏显示并且接收GPRS传来的数据.当时为了节省成本,就去大西电子市场买来8*8的LED块,然后自己一点一点的 ...

  2. 单片机c语言的按键程序,新按键程序

    1.支持连按的书写 对上一讲的知识我们再补充一下支持连按的代码以此加深理解. 实验现象就是按着按键不放,那么"key=1;"出现的频率就会比不支持连按代码的时候多,所以就会有左右不 ...

  3. 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管

    设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序). #inc ...

  4. 单片机上电复位电路图大全

    复位原理: 开机的时候为什么为复位在电路图中,电容的的大小是10uf,电阻的大小是10k.所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要 ...

  5. 单片机中段程序_单片机外部中断详解及程序

    单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态.比如一个电子时钟,它会按时.分.秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来 ...

  6. 基于51单片机手势控制智能台灯(程序+原理图+PCB)

    功能介绍: 1.采用手势传感器PAJ7620U2来检测当前的手势动作: 2.可以通过手势动作来控制灯的开关: 3.可以通过手势动作来控制LED灯的亮度: 4.LCD1602显示亮度等级: 5.可以通过 ...

  7. 51单片机usb烧录电路_51单片机怎么用usb烧写程序 - 全文

    单片机怎样用usb烧写程序 首先,需要安装keil软件和STC_ISP程序下载软件. 先对你想要实现对单片机的功能用keil编程,然后用STC_ISP下载软件下载到单片机上,最后打开给单片机提供电源就 ...

  8. 单片机上电后没有运转,需要从这些方面考虑

    单片机上电后没有运转,需要从这些方面考虑 1.单片机供电是否正常? 先使用电表测供电引脚电压是否正常.再检查是否有焊接上的问题. 2.单片机复位是否释放? 需要检查单片机复位引脚的状态,若处于复位状态 ...

  9. c语言T1中断程序编写步骤,用51单片机中断编写的4x4键盘程序

    当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章 用51单片机中断编写的4x4键盘程序 作者:未知   来源:山涧一溪流   点击数:-  更新时间:2014年06 ...

最新文章

  1. Python小知识点(5)--面向对象部分
  2. ORACLE---数据库巡检
  3. 神策与CDA,一次不平凡的约会
  4. Qt中qDebug()技巧初探
  5. 使用 VS 附加到进程 调试发布的网站
  6. 动手学CV-目标检测入门教程6:训练与测试
  7. 孤独终老和勉强结婚,你会选什么?
  8. 图灵奖得主Bengio:深度学习让AI得以推理和想象,不会被取代
  9. 吴恩达获英特尔投资!这次,英特尔拿出7.85亿砸向AI创业公司
  10. [转]Android--多线程之Handler
  11. 小甲鱼python飞机大战素材_用Python做飞机大战(含素材)
  12. 【STM32】WS2812B灯珠的PWM+DMA控制(库函数)
  13. 如何去除数据库中重复的数据
  14. Oracle 定时任务详解(dbms_scheduler)
  15. DeepFaceLab坑之ffmpeg
  16. 【微信小程序】微信小程序接口数据加密、解密算法
  17. L298N电机驱动器
  18. ROS——基于python3实现opencv图像处理任务
  19. 小提琴机器人拉法_小提琴的弓怎么拉 有什么技巧
  20. mysql 5.6 登录 警告_mysql登录警告问题的解决方法

热门文章

  1. 企业架构研究总结(24)——TOGAF架构开发方法(ADM)之机会及解决方案阶段
  2. cmd、start命令中有空格的解决方法
  3. java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型
  4. 基于文本和语音的双模态情感分析
  5. 一个“普通人”的秋招算法岗上岸心得
  6. java程序效率_优化JAVA程序的执行效率和性能
  7. mysql 查看表格scott_在mysql中创建 oracle scott 用户的四个表及插入初始化数据
  8. 一道把递归、链表、引用、双指针都结合的题——回文链表
  9. CCF2016-4-2 俄罗斯方块
  10. TensorFlow2.0:数据的填充与复制