目标:
1. 能实现非阻塞按键读取。
2. 能保存4次按键的值,如果按键太快了,超过4次按键,则后面的按键值会丢失。当然这个4次,可以自己定义。
3. 能够检测短按,长按状态,并保存键值。
贴代码了。
App_LongShortKey.c
App_LongShortKey.h
-
#ifndef _APP_LONGSHORT_KEY_H_
-
#define _APP_LONGSHORT_KEY_H_
-
-
#include "key.h"
-
-
-
#define KEY_NO_PRESS 0
-
#define KEY_SHORT_PRESS 1
-
#define KEY_LONG_PRESS 2
-
-
#define KEY0_CODE (char)0x01
-
-
-
#define KEY_SHORT_CODE (char)0x10
-
#define KEY_FIRST_LONG_CODE (char)0x80
-
#define KEY_AFTER_LONG_CODE (char)0xc0
-
-
#define KEYBUFFSIZE 4
-
-
void key_paraInit(void);
-
void keyScan(void);
-
char key_readBuff(void);
-
-
#endif
应用程序:
平台是STM32。
-
#include "led.h"
-
#include "delay.h"
-
#include "sys.h"
-
#include "usart.h"
-
#include "App_LongShortKey.h"
-
-
uint8_t flag = 0;
-
-
void SysTick_Init(void)
-
{
-
if(SysTick_Config( SystemCoreClock / 100)) // 10ms
-
{
-
while(1);
-
}
-
-
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
-
}
-
-
-
-
void SysTick_Handler(void)
-
{
-
flag = 1;
-
}
-
-
-
-
int main(void)
-
{
-
char key = 0;
-
LED_Init();
-
KEY_Init();
-
SysTick_Init();
-
uart_init(9600);
-
NVIC_Configuration();
-
-
__enable_irq();
-
-
key_paraInit();
-
-
while(1)
-
{
-
if(flag) // 10ms timer interrupt.
-
{
-
flag =0;
-
keyScan();
-
}
-
-
key = key_readBuff();
-
if(key != 0x00)
-
{
-
switch(key)
-
{
-
case (KEY0_CODE+KEY_SHORT_CODE):
-
printf("short key pressed \r\n");
-
break;
-
-
case (KEY0_CODE+KEY_FIRST_LONG_CODE):
-
printf("long first pressed \r\n");
-
break;
-
-
case (KEY0_CODE+KEY_AFTER_LONG_CODE):
-
printf("long after pressed \r\n");
-
break;
-
}
-
}
-
-
}
-
}
实现方法:
状态机的实现,参看App_LongShortKey.c中的注释。
阅读(1056) | 评论(0) | 转发(0) |