【STM8S】STM8S之自定義短、長、連擊按鍵

本文最后修改時間:2018年10月22日 01:57

一、本節簡介

本文介紹STM8S系列如何實現按鍵的短按、長按、連擊。

二、實驗平臺

編譯軟件:IAR for STM8 1.42.2

硬件平臺:stm8s003f3p6開發板

仿真器:ST-LINK

庫函數版本:V2.0.0

三、版權聲明

1)作者:甜甜的大香瓜

2)聲明:喝水不忘挖井人,轉載請注明出處。

3)糾錯/業務合作:897503845@qq.com

4)香瓜嵌入式之STM8/STM32群:164311667

5)本文出處:原創連載資料《簡單粗暴學STM8和STM32》

6)完整開源資料下載地址(電腦端打開):opengua.taobao.com

四、實驗前提

1、在進行本文步驟前,請先閱讀以下章節:

1)《簡單粗暴學STM8STM32》的第一章和第三章章節?

2、在進行本文步驟前,請先實現以下章節:

1)《簡單粗暴學STM8STM32》的《STM8S之內外部16M晶振》。

五、基礎知識

暫無

六、硬件原理

????

由上圖可知當K1松開時PD3為高電平,K1按下后PD3為低電平。

七、實驗步驟

1、工程中添加自己寫的按鍵驅動

1)寫一個按鍵驅動GUA_Key.c(存放在工程的USER文件夾中)

//**********************************************************************

//name:???????? GUA_Key.c

//introduce:??? 按鍵驅動

//author:?????? 甜甜的大香瓜?????

//email:???? ???897503845@qq.com??

//QQ group:???? 香瓜單片機之STM8/STM32(164311667)

//shop:???????? opengua.taobao.com

//changetime:?? 2018.10.16

//**********************************************************************

#include "stm8s.h"

#include "GUA_Key.h"

/*********************宏定義************************/

//按鍵觸發宏?

#define GUA_KEY_TRIGGER??????????? RESET??????????????????????????????? //低電平觸發?

?

//目測的時鐘基準

//#define GUA_KEY_STANDARD_1MS??????????? 100

//按鍵消抖宏?

#define GUA_KEY_DISAPPEARS_SHAKES_SHORT_COUNT?????????? 1000???????? //短按鍵消抖數

#define GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT??????????? 150000?????? //長按2.5消抖數

/*********************內部變量************************/?

static GUA_U32 sGUA_Key_DisappearsShakes_TriggerCount = 0;????????????? //消抖時的觸發狀態計數值?

?

//**********************************************************************

//name:???????? GUA_Key_Scan

//introduce:??? 按鍵檢測觸發狀態

//parameter:??? none

//return:?????? GUA_KEY_STATUS_IDLE or GUA_KEY_STATUS_TRIGGER_SHORT or GUA_KEY_STATUS_TRIGGER_LONG or GUA_KEY_STATUS_NO_LOOSEN

//author:?????? 甜甜的大香瓜

//email:??????? 897503845@qq.com

//QQ group:???? 香瓜單片機之STM8/STM32(164311667)

//shop:???????? opengua.taobao.com

//changetime:?? 2018.10.16

//**********************************************************************

GUA_U8 GUA_Key_Scan(void)?????

{?????

? GUA_U32 nGUA_TimeOut = 0;???

??

? //觸發

? if(GPIO_ReadInputPin(GUA_KEY_PORT, GUA_KEY_PIN) == GUA_KEY_TRIGGER)??

? {?

??? //如果上一次按鍵是長按鍵結束的,需要檢測到松開方可開始下一次計數

??? if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)

??? {

????? return GUA_KEY_STATUS_NO_LOOSEN;

??? }

??? //計數

??? sGUA_Key_DisappearsShakes_TriggerCount++;???

???

??? //判斷計數是否足夠?

??? while(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_SHORT_COUNT)?

??? {?

????? //檢測到松開、超時的時候,則處理?

????? if((GPIO_ReadInputPin(GUA_KEY_PORT, GUA_KEY_PIN) != GUA_KEY_TRIGGER) || (sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT))?

????? {?

??????? //長按2.5S時?

??????? if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)?

??????? {???????????

????????? //返回

????????? return GUA_KEY_STATUS_TRIGGER_LONG;??????????????????????????

??????? }????????????????

??????? //短按鍵時?

??????? else?

??????? {??????

????????? //超時計數值清零

????????? nGUA_TimeOut = 0;

???????????

????????? //檢測是否有連按

????????? while((GPIO_ReadInputPin(GUA_KEY_PORT, GUA_KEY_PIN) != GUA_KEY_TRIGGER))

????????? {???? ???????

??????????? //沒有被按下,超時,則表示只有1次按鍵

??????????? if(nGUA_TimeOut++ > 100000)

??????????? {

????????????? //計數值清零

????????????? sGUA_Key_DisappearsShakes_TriggerCount = 0;

?????????????

????????????? return GUA_KEY_STATUS_TRIGGER_SHORT;

??????????? }? ???????????????????

????????? }

?????????

????????? //判斷計數是否足夠?

????????? while(GPIO_ReadInputPin(GUA_KEY_PORT, GUA_KEY_PIN) == GUA_KEY_TRIGGER)

????????? {

??????????? //開始計數

??????????? sGUA_Key_DisappearsShakes_TriggerCount++;

??????????? //檢測到松開、超時的時候,則處理?

??????????? if((GPIO_ReadInputPin(GUA_KEY_PORT, GUA_KEY_PIN) != GUA_KEY_TRIGGER) || (sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT))?

??????????? {?????????????

????????????? //長按2.5S時?

? ????????????if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)?

????????????? {???????????

??????????????? //清除計數器

??????????????? sGUA_Key_DisappearsShakes_TriggerCount = 0;

???????????????

??????????????? //返回

???????? ???????return GUA_KEY_STATUS_TRIGGER_LONG;??????????????????????????

????????????? }????????????????

????????????? //短按鍵時?

????????????? else?

????????????? {???

??????????????? //清除計數器

??????????????? sGUA_Key_DisappearsShakes_TriggerCount = 0;

???? ???????????

??????????????? //返回

??????????????? return GUA_KEY_STATUS_TRIGGER_DOUBLE_SHORT;?????????????????

????????????? }?

??????????? }?????????????????????????

????????? }

?????????

????????? //清除計數器

????????? sGUA_Key_DisappearsShakes_TriggerCount = 0;

???????????????

????????? //返回

????????? return GUA_KEY_STATUS_TRIGGER_DOUBLE_SHORT;?????????

??????? }?

????? }?

?????

????? //繼續計數用來判斷長短按鍵?

????? sGUA_Key_DisappearsShakes_TriggerCount++;?????? ???

??? }????

? }?

? //未觸發?

? else?

? {?

??? sGUA_Key_DisappearsShakes_TriggerCount = 0;??

? }?

???

? return GUA_KEY_STATUS_IDLE;???

}??

//**********************************************************************

//name:???????? GUA_Key_Init

//introduce:??? 按鍵初始化

//parameter:??? none

//return:?????? none

//author:?????? 甜甜的大香瓜

//email:??????? 897503845@qq.com

//QQ group:???? 香瓜單片機之STM8/STM32(164311667)

//shop:???????? opengua.taobao.com

//changetime:?? 2018.10.16

//**********************************************************************

void GUA_Key_Init(void)

{

? //按鍵IO初始化

? GPIO_Init(GUA_KEY_PORT, GUA_KEY_PIN, GUA_KEY_MODE);??????

}

2)寫一個驅動頭文件GUA_Key.h(存放在工程的USER文件夾中)

//**********************************************************************

//name:???????? GUA_Key.h

//introduce:??? 按鍵驅動的頭文件

//author:?????? 甜甜的大香瓜?????

//email:??????? 897503845@qq.com??

//QQ group:???? 香瓜單片機之STM8/STM32(164311667)

//shop:???????? opengua.taobao.com

//changetime:?? 2018.10.16

//**********************************************************************

#ifndef _GUA_KEY_H_

#define _GUA_KEY_H_

/*********************宏定義************************/

//類型宏

#ifndef GUA_C

typedef char GUA_C;

#endif

#ifndef GUA_U8

typedef unsigned char GUA_U8;

#endif

#ifndef GUA_8

typedef signed char GUA_8;

#endif

#ifndef GUA_U16

typedef unsigned short GUA_U16;

#endif

#ifndef GUA_16

typedef signed short GUA_16;

#endif

#ifndef GUA_U32

typedef unsigned long GUA_U32;

#endif

#ifndef GUA_32

typedef signed long GUA_32;

#endif

#ifndef GUA_U64

typedef unsigned long long GUA_U64;

#endif

#ifndef GUA_64

typedef signed long long GUA_64;

#endif?

//按鍵引腳宏

#define GUA_KEY_PORT??????????????????? GPIOD

#define GUA_KEY_PIN???????????????????? GPIO_PIN_3

#define GUA_KEY_MODE??????????????????? GPIO_MODE_IN_PU_NO_IT

//按鍵的觸發狀態?

#define GUA_KEY_STATUS_IDLE???????????????????? 0?????? //按鍵沒觸發?

#define GUA_KEY_STATUS_TRIGGER_SHORT??????????? 1?????? //短按鍵觸發

#define GUA_KEY_STATUS_TRIGGER_DOUBLE_SHORT???? 2?????? //雙擊觸發

#define GUA_KEY_STATUS_TRIGGER_LONG???????????? 3?????? //長按鍵2.5S觸發

#define GUA_KEY_STATUS_NO_LOOSEN??????????????? 4?????? //按鍵沒松開

/*********************外部函數聲明************************/

GUA_U8 GUA_Key_Scan(void);?

void GUA_Key_Init(void);

#endif

3)工程中添加GUA_Key.c

4)添加驅動的路徑

$PROJ_DIR$\..\USER?

注意USER文件夾是與“Project”、“FWlib”文件夾同級的自定義文件,用于存放香瓜寫的代碼。

2、添加庫的驅動

1)添加庫的驅動文件

2)添加庫的驅動頭文件(stm8s_conf.h中)

#include "stm8s_gpio.h"

3、應用層中調用

1)添加頭文件(main.c中)

#include "GUA_Key.h"

2)初始化(main.c的main函數中)

? //按鍵初始化

? GUA_Key_Init();

3)添加按鍵判斷的邏輯代碼(main.c的main函數中)

? ??????GUA_U8 nGUA_Ret;

??????? //檢測按鍵當前狀態

??????? nGUA_Ret = GUA_Key_Scan();

??????? //短按鍵觸發時

??????? if(nGUA_Ret == GUA_KEY_STATUS_TRIGGER_SHORT)

??????? {???

??????? }

??????? //連擊觸發時

??????? else if(nGUA_Ret == GUA_KEY_STATUS_TRIGGER_DOUBLE_SHORT)

??????? {?

??????? }

??????? //長按鍵觸發時

??????? else if(nGUA_Ret == GUA_KEY_STATUS_TRIGGER_LONG)

??????? {

??????? }

八、注意事項

暫無

九、實驗結果

暫無

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66127.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66127.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66127.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫(MySQL)練習

數據庫(MySQL)練習 一、練習1.15練習練習 二、注意事項2.1 第四天 一、練習 1.15練習 win11安裝配置MySQL超詳細教程: https://baijiahao.baidu.com/s?id1786910666566008458&wfrspider&forpc 準備工作: mysql -uroot -p #以管理…

【深度學習地學應用|滑坡制圖、變化檢測、多目標域適應、感知學習、深度學習】跨域大尺度遙感影像滑坡制圖方法:基于原型引導的領域感知漸進表示學習(一)

【深度學習地學應用|滑坡制圖、變化檢測、多目標域適應、感知學習、深度學習】跨域大尺度遙感影像滑坡制圖方法:基于原型引導的領域感知漸進表示學習(一) 【深度學習地學應用|滑坡制圖、變化檢測、多目標域適應、感知學習、深度學習】跨域大…

RPC實現原理,怎么跟調用本地一樣

回答1 要讓?絡通信細節對使?者透明,我們需要對通信細節進?封裝,我們先看下?個 RPC 調?的流程涉及到哪些通 信細節: 1. 服務消費?( client )調?以本地調??式調?服務; 2. client stub 接收到調…

《C++11》并發庫:簡介與應用

在C11之前,C并沒有提供原生的并發支持。開發者通常需要依賴于操作系統的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方庫(如Boost.Thread)來創建和管理線程。這些方式存在以下幾個問題: …

【記錄52】el-table-column 添加fixed屬性 滾動條無法滑動

問題: el-table-column 添加fixed屬性 滾動條無法滑動 使用element UI組件,用到el-table的el-table-column的fixed屬性時,當滾動條長度小于固定列時,滾動條無法通過鼠標去點擊滑動操作 原因 fixed是用來固定列的屬性,其…

rtthread學習筆記系列-- 22 dataqueue

文章目錄 22 dataqueue https://github.com/wdfk-prog/RT-Thread-Study 22 dataqueue 消息隊列:消息隊列能夠接收來自線程或中斷服務例程中不固定長度的消息,并把消息緩存在自己的內存空間中。其他線程也能夠從消息隊列中讀取相應的消息,而當…

了解Node.js

Node.js是一個基于V8引擎的JavaScript運行時環境,它允許JavaScript代碼在服務器端運行,從而實現后端開發。Node.js的出現,使得前端開發人員可以利用他們已經掌握的JavaScript技能,擴展技能樹并成為全棧開發人員。本文將深入淺出地…

微信小程序在使用頁面棧保存頁面信息時,如何避免數據丟失?

微信小程序在使用頁面棧保存頁面信息時避免數據丟失的方法: 一、使用全局變量存儲關鍵數據: 定義一個全局變量,例如在 app.js 中,用于存儲頁面的重要信息。在頁面的 onHide 或 onUnload 生命周期中,將需要保存的數據…

文件上傳 分片上傳

分片上傳則是將一個大文件分割成多個小塊分別上傳,最后再由服務器合并成完整的文件。這種做法的好處是可以并行處理多個小文件,提高上傳效率;同時,如果某一部分上傳失敗,只需要重傳這一部分,不影響其他部分…

js解決 Number失精度問題

const updatePromises adinfo.rows.map(async item > {const cwf await uniCloud.httpclient.request("https://api.oceanengine.com/open_api/v3.0/project/list/", {method: GET,data: {advertiser_id: item.account_id},// 1. 指定text數據格式dataType: tex…

實力認證 | 海云安入選《信創安全產品及服務購買決策參考》

近日,國內知名安全調研機構GoUpSec發布了2024年中國網絡安全行業《信創安全產品及服務購買決策參考》,報告從產品特點、產品優勢、成功案例、安全策略等維度對各廠商信創安全產品及服務進行調研了解。 海云安憑借AI大模型技術在信創安全領域中的創新應用…

Picocli 命令行框架

官方文檔 https://picocli.info/ 官方提供的快速入門教程 https://picocli.info/quick-guide.html 使用 Picocli 創建命令行應用程序 Picocli 是一個用于構建 Java 命令行應用的強大框架,它簡化了參數解析和幫助消息生成的過程。 下面是如何使用 Picocli 構建簡單命…

windows系統“GameInputRedist.dll”文件丟失或錯誤導致游戲運行異常如何解決?windows系統DLL文件修復方法

GameInputRedist.dll是存放在windows系統中的一個重要dll文件,缺少它可能會造成部分游戲不能正常運行。當你的電腦彈出提示“無法找到GameInputRedist.dll”或“計算機缺少GameInputRedist.dll”等錯誤問題,請不用擔心,我們將深入解析DLL文件…

M4Pro安裝homebrew并基于homebrew安裝MySQL踩坑記錄

系統偏好設置允許安裝任何來源應用:sudo spctl --master-disable 清除提示已損壞軟件的安全隔離,重新安裝: xattr -cr 空格+App路徑 安裝homebrew: /opt/homebrew/Cellar 安裝包目錄 /opt/homebrew/etc 默認運行目…

tmux 中鼠標滾動異常:^[[A和^[[B是什么以及如何解決

tmux 中鼠標滾動異常問題及解決方案 在使用 tmux 時,有時我們會遇到一個現象:當嘗試使用鼠標滾輪滾動窗口內容時,終端中會出現一串類似 ^[[A^[[A 的字符。這讓人困惑,不知道鼠標滾動為什么不起作用,也不清楚這些字符究…

【Vue】mouted、created、computed區別

mouted、created、computed區別 前端vue重構 — computed、watch、組件通信等常用知識整理 created和mouted都是vue生命周期中的鉤子函數,通常用來做一些初始化的工作,比如發送http請求、對組件綁定自定義事件 created:實例創建完后立即調用…

前端如何設計一個回溯用戶操作的方案

同一個項目,為什么我本地無法復現,只有客戶的設備才復現? 如何獲取用戶的操作路徑呢? 兩種方案:埋點和rrweb 埋點就很簡單了,將所有可能操作的節點都進行預埋數據;但埋點簡單并不省心&#xff…

概率論考前一天

判斷是不是分布函數:單調不減,右連續,F負無窮為0, F正無窮為1 判斷是不是密度函數:非負性(函數任意地方都大于0),規范:積分為1

2Hive表類型

2Hive表類型 1 Hive 數據類型2 Hive 內部表3 Hive 外部表4 Hive 分區表5 Hive 分桶表6 Hive 視圖 1 Hive 數據類型 Hive的基本數據類型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE&a…

FPGA工程師成長四階段

朋友,你有入行三年、五年、十年的職業規劃嗎?你知道你所做的崗位未來該如何成長嗎? FPGA行業的發展近幾年是蓬勃發展,有越來越多的人才想要或已經踏進了FPGA行業的大門。很多同學在入行FPGA之前,都會抱著滿腹對職業發…