简介:设定一个定时器中断,每隔10MS 扫描一次按键。,读取值。。如果多个按键,又有多余的定时器,可以试试这个方法,效率高了。搞STM32 刚好。 cool.
#define key_input PIND.7 // 按键输入口
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
char read_key(void)
{
static char key_state = 0;
char key_press, key_return = 0;
key_press = key_input; // 读按键I/O电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (!key_press) key_state = key_state_1; // 键被按下,状态转换到键确认态
break;
case key_state_1: // 按键确认态
if (!key_press)
{
key_return = 1; // 按键仍按下,按键确认输出为“1”
key_state = key_state_2; // 状态转换到键释放态
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态
break;
}
return key_return;
}
另外一个原则就是设计的中断服务函数执行时间应该尽量的短。这样假如系统中使用多个中断的话,就是不采用中断嵌套的方式,也能够保证系统能够及时响应各个中断的请求。
所以我喜欢在定时中断中只使用一个标志变量,这样中断服务函数执行时间是最快的,就不会阻塞其它中断的及时响应,而在主程序中判断标志变量,然后再去扫描按键。尽管此时扫描的间隔已经不是严格意义上的10ms,或多或少都有一些延误,而且延误也是不确定的,但都不会影响按键扫描的正确性(一个按键的过程至少在300ms以上)。
设定一个定时器中断,每隔10MS 扫描一次按键。,读取值。。如果多个按键,又有多余的定时器,可以试试这个方法,效率高了。搞STM32 刚好。 cool.
关键字:单片机 按键扫描 状态机
引用地址:
单片机按键扫描程序状态机方法
推荐阅读最新更新时间:2024-11-12 02:24
MCU多元再进化 强化运算及各种介面延伸字号
微控制器(MCU)近年在智慧系统、物联网需求提高,成为电子产业中,再次翻红的产品,怎么说翻红。过去的MCU功能较简单,已大量应用在传统电子产品如冰箱、电视等家电到自动化产品等,如今在网路影响及数位资讯云端化,传统应用方向不再单一,还多了分享,因此MCU随之进化,强化运算及各种介面的延伸,打造出符合市场需求的产品,让MCU需求不断提高。 意法半导体大中华暨南亚区产品行销经理杨正廉说,MCU市场受M2M(MachinetoMachine)加持,近年出货表现确实不俗,但对整体MCU市场,则是一场厂商生存战的开始,主因推出低阶MCU的业者,将面临技术提升及价格竞争,反观谁拥有技术及整体多元的产品支援才符合市场期待。以意法半导体为
[单片机]
AVR单片机相关
AVR单片机的型号标识解析 1. 型号紧跟的字母,表示电压工作范围。带 V :1.8-5.5V;若缺省,不带 V :2.7-5.5V。 例:ATmega48-20AU,不带 V 表示工作电压为2.7-5.5V。 2. 后缀的数字部分,表示支持的最高系统时钟。 例:ATmega48-20AU, 20 表示可支持最高为20MHZ的系统时钟。 3. 后缀第一(第二)个字母,表示封装。 P :DIP封装, A :TQFP封装, M :MLF封装。 例:ATmega48-20AU, A 表示TQFP封装。 4. 后缀最后一个字母,表示应用级别。 C :商业级, I :工业级(有铅)、 U 工业级(无铅)。 例:
[单片机]
基于单片机的12位PWM DAC的设计
.前言 在用单片机制作的变送器类和控制器类的仪表中,需要输出1—5V或4—20mA的直流信号的时候,通常采用专用的D/A芯片,一般是每路一片。当输出信号的精度较高时,D/A芯片的位数也将随之增加。在工业仪表中,通常增加到12位。12位D/A的价格目前比单片机的价格要高得多,占用的接口线数量也多。尤其是在需隔离的场合时,所需的光电耦合器数量与接口线相当,造成元器件数量大批增加,使体积和造价随之升高。如果在单片机控制的仪表里用PWM方式完成D/A输出,将会使成本降低到12位D/A芯片的十分之一左右。我们在S系列流量仪表中采用了这种方式,使用效果非常理想。下面介绍一下PWM方式D/A的构成原理。 .电路原理 一般12位D/A转换器
[单片机]
MSP430 F5529 单片机 时钟 闹钟 倒计时 OLED
为了便于开发,我做了一块扩展板子: https://blog.csdn.net/x1131230123/article/details/108772807 扩展板有一些常用器件,这样开发MSP430 F5529程序的时候,就不用杜邦线连接了。当然也可以选择杜邦线连接器件,效果都一样。 功能要求: 1.在oled屏上面显示出年月日,小时,分钟,秒,可以通过按键来调整时间 2.一个闹钟功能,通过按键设置闹钟的时间,到点了需要蜂鸣器响和LED闪烁 3.一个倒计时,跟闹钟差不多,也是通过按键设置时间,到时间了LED闪烁 硬件上需求: 1 蜂鸣器一个,有源蜂鸣器和无源蜂鸣器都可以。闹钟到了或者倒计时到了都需要响。 连接: 蜂鸣器
[单片机]
基于AVR单片机的mega16内部EEPROM操作C语言程序设计
#include iom16v.h #include macros.h #include math.h #define uchar unsigned char #define uint unsigned int uchar const seg_data ={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; //0~9和熄灭符的段码表 uchar const bit_tab ={0xbf,0x7f}; //第7、8只数码管位选表 uchar disp_buf ={0,0}; //定义2个显示缓冲单元 uchar val; #define beep_0 (PORTD=
[单片机]
STC8单片机OLED通过SPI硬件中断方式驱动(下)
到这里基本就写完了,我们来看看修改例程中的代码,先看看中景园给的 void OLED_WR_Byte(uint8_t dat, uint8_t cmd) { register uint8_t i = 0; OLED_DC = cmd; for(;i 8;i++) { OLED_SCL_Clr(); if(dat&0x80) { OLED_SDA_Set(); } else { OLED_SDA_Clr(); } OLED_SCL_Set(); dat =1; } OLED_CS_Set(); OLED_DC_Set
[单片机]
STM32单片机GPIO寄存器
每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)分别控制每个端口的高八位和低八位,如果IO口是0-7号的话,则写CRL寄存器,如果IO口是8-15号的话,则写CRH寄存器,两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR)一个是只读作输入数据寄存器,一个是只写作输出寄存器,一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。常用的IO端口寄存器只有四个:CRH,CRL,IDR,ODR。 数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。每个I/
[单片机]
PIC单片机片内EEPROM运用方法
/*============================================================================= 访问PIC16F877A片内EEPROM,运行程序: Begin Test - LED0亮, EEPROM Test OK- LED7亮, Write&Read OK - LED0/2/4/6亮。 =============================================================================*/ //////////////////////////////////////////////
[单片机]