单片机上电总是立即执行按键程序
今天准备试写一套蓝桥杯嵌入式比赛的赛题,中间遇到按键控制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];}}
}
不管怎么说吧,忙活了一晚上,终于把这个小问题解决了,长出一口气。。。
单片机上电总是立即执行按键程序相关推荐
- 单片机c语言的按键程序,51单片机按键扫描C程序
原标题:51单片机按键扫描C程序 大二上学期做过80 的按键程序,当时项目要求实现按键控制 屏显示并且接收GPRS传来的数据.当时为了节省成本,就去大西电子市场买来8*8的LED块,然后自己一点一点的 ...
- 单片机c语言的按键程序,新按键程序
1.支持连按的书写 对上一讲的知识我们再补充一下支持连按的代码以此加深理解. 实验现象就是按着按键不放,那么"key=1;"出现的频率就会比不支持连按代码的时候多,所以就会有左右不 ...
- 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管
设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序). #inc ...
- 单片机上电复位电路图大全
复位原理: 开机的时候为什么为复位在电路图中,电容的的大小是10uf,电阻的大小是10k.所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要 ...
- 单片机中段程序_单片机外部中断详解及程序
单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态.比如一个电子时钟,它会按时.分.秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来 ...
- 基于51单片机手势控制智能台灯(程序+原理图+PCB)
功能介绍: 1.采用手势传感器PAJ7620U2来检测当前的手势动作: 2.可以通过手势动作来控制灯的开关: 3.可以通过手势动作来控制LED灯的亮度: 4.LCD1602显示亮度等级: 5.可以通过 ...
- 51单片机usb烧录电路_51单片机怎么用usb烧写程序 - 全文
单片机怎样用usb烧写程序 首先,需要安装keil软件和STC_ISP程序下载软件. 先对你想要实现对单片机的功能用keil编程,然后用STC_ISP下载软件下载到单片机上,最后打开给单片机提供电源就 ...
- 单片机上电后没有运转,需要从这些方面考虑
单片机上电后没有运转,需要从这些方面考虑 1.单片机供电是否正常? 先使用电表测供电引脚电压是否正常.再检查是否有焊接上的问题. 2.单片机复位是否释放? 需要检查单片机复位引脚的状态,若处于复位状态 ...
- c语言T1中断程序编写步骤,用51单片机中断编写的4x4键盘程序
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章 用51单片机中断编写的4x4键盘程序 作者:未知 来源:山涧一溪流 点击数:- 更新时间:2014年06 ...
最新文章
- Python小知识点(5)--面向对象部分
- ORACLE---数据库巡检
- 神策与CDA,一次不平凡的约会
- Qt中qDebug()技巧初探
- 使用 VS 附加到进程 调试发布的网站
- 动手学CV-目标检测入门教程6:训练与测试
- 孤独终老和勉强结婚,你会选什么?
- 图灵奖得主Bengio:深度学习让AI得以推理和想象,不会被取代
- 吴恩达获英特尔投资!这次,英特尔拿出7.85亿砸向AI创业公司
- [转]Android--多线程之Handler
- 小甲鱼python飞机大战素材_用Python做飞机大战(含素材)
- 【STM32】WS2812B灯珠的PWM+DMA控制(库函数)
- 如何去除数据库中重复的数据
- Oracle 定时任务详解(dbms_scheduler)
- DeepFaceLab坑之ffmpeg
- 【微信小程序】微信小程序接口数据加密、解密算法
- L298N电机驱动器
- ROS——基于python3实现opencv图像处理任务
- 小提琴机器人拉法_小提琴的弓怎么拉 有什么技巧
- mysql 5.6 登录 警告_mysql登录警告问题的解决方法
热门文章
- 企业架构研究总结(24)——TOGAF架构开发方法(ADM)之机会及解决方案阶段
- cmd、start命令中有空格的解决方法
- java.lang.UnsupportedClassVersionError: JVMCFRE003解决方法--jdk 1.6 中switch的参数无法使用String类型
- 基于文本和语音的双模态情感分析
- 一个“普通人”的秋招算法岗上岸心得
- java程序效率_优化JAVA程序的执行效率和性能
- mysql 查看表格scott_在mysql中创建 oracle scott 用户的四个表及插入初始化数据
- 一道把递归、链表、引用、双指针都结合的题——回文链表
- CCF2016-4-2 俄罗斯方块
- TensorFlow2.0:数据的填充与复制