当前位置:网站首页>STM32 key state machine 2 - state simplification and long press function addition
STM32 key state machine 2 - state simplification and long press function addition
2022-07-07 05:49:00 【Hua Weiyun】
The state diagram of the previous article is as follows :
Because only press and release are detected , And it has the function of key shaking elimination , Therefore, the above 4 Status , Press jitter and release jitter are two independent States , And these two jittery States , It can also run continuously in multiple cycles , The cycle period of this state machine is set to 10ms, When a certain level is continuously detected in the jitter state 5 Next time , That is, it is considered that the chattering elimination is completed , Go to the next steady state .
For the same function , State diagrams are not static , For key debounce , The two jitter states can also be represented by sharing a jitter state .
1 De chattering state simplification
1.1 State diagram
Press jitter and release jitter share a jitter state to represent , At the same time, the cycle period of the state machine needs to be set to 50ms, such , The jitter state only needs to pass once , Whether it is really key jitter can be determined by the level . The simplified state diagram is as follows :
In order to be able to , Distinguish whether the previous state is released or pressed , Then we can judge whether this time it is the jitter or the real action of the key , You need to add a status to record the previous status
KEY_STATUS g_keyStatus = KS_RELEASE; // The end of the current cycle ( State machine ) state KEY_STATUS g_nowKeyStatus = KS_RELEASE; // current state ( After each cycle with g_keyStatus bring into correspondence with )KEY_STATUS g_lastKeyStatus = KS_RELEASE; // Last state ( Used to record the previous state to distinguish the source of the state )
Be careful : Here g_lastKeyStatus Used to record the previous status , There is also this variable in the last article , But the effect is different , The function of this variable in the previous article is the same as that here g_nowKeyStatus The same effect .
1.2 Code
Compare with the simplified state diagram , Write the corresponding state machine logic code :
void key_status_check(){ switch(g_keyStatus) { // Key release ( The initial state ) case KS_RELEASE: { // Low level detected , First, eliminate the chattering if (KEY0 == 0) { g_keyStatus = KS_SHAKE; } } break; // shake case KS_SHAKE: { if (KEY0 == 1) { g_keyStatus = KS_RELEASE; if (KS_PRESS == g_lastKeyStatus) { printf("=====> key release\r\n"); } } else { g_keyStatus = KS_PRESS; if (KS_RELEASE == g_lastKeyStatus) { printf("=====> key press\r\n"); } } } break; // Press steadily and briefly case KS_PRESS: { // High level detected , First, eliminate the chattering if (KEY0 == 1) { g_keyStatus = KS_SHAKE; } } break; default:break; } if (g_keyStatus != g_nowKeyStatus) { g_lastKeyStatus = g_nowKeyStatus; g_nowKeyStatus = g_keyStatus; printf("new key status:%d(%s)\r\n", g_keyStatus, key_status_name[g_keyStatus]); }}
Be careful g_lastKeyStatus Role of variables .
1.3 test
2 Add long press function
On the basis of detecting press and release , Add long press function , You need to add a long press state in the state diagram . then , Modify the code according to the state diagram .
Again , According to whether it is necessary to distinguish the two jitter States and the difference of the cycle cycle cycle of the state machine , There are two kinds of state diagrams .
2.1 Not simplified state diagram
Let's first look at the cycle 10ms, Distinguish between press jitter and release jitter. Add the state diagram after long press function :
After clarifying the logic of the state diagram , According to the state diagram , Modify the corresponding code , No more code here , The complete code can be checked in my code warehouse
2.2 Simplified state diagram
Next, let's take a look at the state machine diagram of the specific long press function to simplify the dithering state :
The comparison shows that , Simplified state diagram , The status can be one less , But the shaking state , There will be more inputs and outputs , Because at present, every state has passed through this state .
If the requirements for jitter detection are not high , You can also keep only the logic of press jitter , Loosen the shaking branch and remove , Jump directly to the released state , State logic can be simplified again .
2.3 Code
According to the state diagram , Write the corresponding state machine logic code , as follows :
void key_status_check(){ switch(g_keyStatus) { // Key release ( The initial state ) case KS_RELEASE: { // Low level detected , First, eliminate the chattering if (KEY0 == 0) { g_keyStatus = KS_SHAKE; } } break; // shake case KS_SHAKE: { if (KEY0 == 1) { g_keyStatus = KS_RELEASE; if (KS_SHORT_PRESS == g_lastKeyStatus || KS_LONG_PRESS == g_lastKeyStatus) { printf("=====> key release\r\n"); } } else { if (KS_RELEASE == g_lastKeyStatus) { g_PressTimeCnt = 0; g_keyStatus = KS_SHORT_PRESS; printf("=====> key short press\r\n"); } else if (KS_SHORT_PRESS == g_lastKeyStatus) { g_keyStatus = KS_SHORT_PRESS; } else { } } } break; // Press steadily and briefly case KS_SHORT_PRESS: { // High level detected , First, eliminate the chattering if (KEY0 == 1) { g_keyStatus = KS_SHAKE; } g_PressTimeCnt++; if (g_PressTimeCnt == 20) //1000ms { g_keyStatus = KS_LONG_PRESS; printf("=====> key long press\r\n"); } } break; // Steady long press case KS_LONG_PRESS: { // High level detected , First, eliminate the chattering if (KEY0 == 1) { g_keyStatus = KS_SHAKE; } g_PressTimeCnt++; if (g_PressTimeCnt % 20 == 0) // every other 1000ms Print once { printf("=====> key long press:%d\r\n", g_PressTimeCnt/20); } } break; default:break; } if (g_keyStatus != g_nowKeyStatus) { g_lastKeyStatus = g_nowKeyStatus; g_nowKeyStatus = g_keyStatus; printf("new key status:%d(%s)\r\n", g_keyStatus, key_status_name[g_keyStatus]); }}
Be careful , In the jitter state , When the detection is high ( Release the button ), Whether the previous state is short press or long press , The next state is the released state .
2.4 test
3 summary
This article continues to introduce the use of state machines , On the basis of the first part , By simplifying the button to shake the logic , And add the function of pressing and holding keys , Further introduce the modification of state diagram and the implementation of state machine code , And passed the actual test , Demonstrate the running effect of the state machine .
边栏推荐
- [reading of the paper] a multi branch hybrid transformer network for channel terminal cell segmentation
- SAP ABAP BDC (batch data communication) -018
- Harmonyos practice - Introduction to development, analysis of atomized services
- 架构设计的五个核心要素
- Différenciation et introduction des services groupés, distribués et microservices
- 常用消息队列有哪些?
- 分布式事务解决方案之2PC
- C#可空类型
- Flinksql 读写pgsql
- Web architecture design process
猜你喜欢
Paper reading [open book video captioning with retrieve copy generate network]
[论文阅读] A Multi-branch Hybrid Transformer Network for Corneal Endothelial Cell Segmentation
往图片添加椒盐噪声或高斯噪声
[论文阅读] Semi-supervised Left Atrium Segmentation with Mutual Consistency Training
拼多多商品详情接口、拼多多商品基本信息、拼多多商品属性接口
上海字节面试问题及薪资福利
数据中心为什么需要一套基础设施可视化管理系统
R语言【逻辑控制】【数学运算】
毕业之后才知道的——知网查重原理以及降重举例
Unity keeps the camera behind and above the player
随机推荐
C#可空类型
Web Authentication API兼容版本信息
淘寶商品詳情頁API接口、淘寶商品列錶API接口,淘寶商品銷量API接口,淘寶APP詳情API接口,淘寶詳情API接口
京东商品详情页API接口、京东商品销量API接口、京东商品列表API接口、京东APP详情API接口、京东详情API接口,京东SKU信息接口
Dj-zbs2 leakage relay
软件测试面试技巧
基于NCF的多模块协同实例
Preliminary practice of niuke.com (9)
What is dependency injection (DI)
pytorch_ 01 automatic derivation mechanism
拼多多新店如何获取免费流量,需要从哪些环节去优化,才能有效提升店内免费流量
Tablayout modification of customized tab title does not take effect
async / await
Go 语言的 Context 详解
如何提高网站权重
JVM the truth you need to know
sql优化常用技巧及理解
Paper reading [MM21 pre training for video understanding challenge:video captioning with pre training techniqu]
CVE-2021-3156 漏洞复现笔记
Getting started with DES encryption