35.成功解決編寫關于“江協科技”編寫技巧第二期標志位積累的問題

江科大學長又發布了第二期的編寫技巧!
大家可以看看:https://space.bilibili.com/383400717
最后面給了一個未完成的任務:
在這里插入圖片描述
這里我已經把這個問題給解決了!
總代碼放在資源里面,key.c放在文章最后面!同時感興趣的同學可以看看我的Linux驅動講解!

1、保存上一次的標志位:

在這里插入圖片描述

2、清零目標標志位

計劃在同一個按鍵事件后的標志位發生變化時,判斷上一個標志位和目前標志位不一樣時進行清理:
在這里插入圖片描述
為了簡單理解,我們就以同一個按鍵,兩位2進制標志位來講。
假設上一個的標志位是10;如果按照之前的代碼,切換模式的時候,那目前標志位就是11,因為假設并沒有進行檢查操作就想清零。解決標志位積累的問題!
所以進行:

if(Last_Key_Flag[i]!=Key_Flag[i])
{Key_Flag[i]&=~Last_Key_Flag[i];
}
Last_Key_Flag[i]=Key_Flag[i];

3、同一個按鍵空閑的時候也清零標志位:

在這里插入圖片描述
這樣就行了!不過這里有一個問題,就是按鍵松開和按壓時間交替太快了,程序會認為是清零標志位,而不是雙擊,太慢了,就會認為是單擊。但是如果不這樣設置,就會保留最后一次的標志位,目前我沒有想到好的方法!就留給后來者了!

4、Key.c代碼:

 #include "stm32f10x.h"                  // Device header#include "Key.h"#define KEY_PRESSED   1
#define KEY_UNPRESSED 0#define KEY_TIME_DOUBLE 200
#define KEY_TIME_LONG   2000
#define KEY_TIME_REPEAT 100u8 Key_Flag[KEY_COUNT];void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef   GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;             //?áè?°′?üGPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;             //?áè?°′?üGPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}u8 Key_Getstate(u8 n)
{if(n==KEY_1){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){return KEY_PRESSED ;}}else if(n==KEY_2){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0){return KEY_PRESSED ;}}else if(n==KEY_3){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13)==1){return KEY_PRESSED ;}}else if(n==KEY_4){if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1){return KEY_PRESSED ;}}return KEY_UNPRESSED;}u8 Key_Check(u8 n,u8 Flag)
{if(Key_Flag[n]&Flag){if(Flag!=KEY_HOLD){Key_Flag[n]&=~Flag;}return 1;}return 0;
}void Key_Tick(void)
{static u8  Count,i;static u8  CurrState[KEY_COUNT],PrevState[KEY_COUNT];static u8  S[KEY_COUNT];static u16 Time[KEY_COUNT];static u8  Last_Key_Flag[KEY_COUNT]; for(i=0;i<KEY_COUNT;i++){if(Time[i]>0){Time[i]--;}}Count++;if(Count>=20){Count=0;for(i=0;i<KEY_COUNT;i++){PrevState[i]=CurrState[i];CurrState[i]=Key_Getstate(i);if(CurrState[i]==KEY_PRESSED){//HOLD=1Key_Flag[i]|=KEY_HOLD;}else{//HOLD=0Key_Flag[i]&=~KEY_HOLD;}if(CurrState[i]==KEY_PRESSED&&PrevState[i]==KEY_UNPRESSED){//Down=1Key_Flag[i]|=KEY_DOWN;}if(CurrState[i]==KEY_UNPRESSED&&PrevState[i]==KEY_PRESSED){//UP=1Key_Flag[i]|=KEY_UP;}if(PrevState[i]==KEY_UNPRESSED&&CurrState[i]==KEY_UNPRESSED){Key_Flag[i]&=0x00;}if(S[i]==0){if(CurrState[i]==KEY_PRESSED){Time[i]=KEY_TIME_LONG;//2s3¤°′ê±???D?μS[i]=1;}}else if(S[i]==1){if(CurrState[i]==KEY_UNPRESSED){Time[i]=KEY_TIME_DOUBLE;S[i]=2;}else if(Time[i]==0){Time[i]=KEY_TIME_REPEAT;//LONG=1Key_Flag[i]|=KEY_LONG;S[i]=4;}}else if(S[i]==2){if(CurrState[i]==KEY_PRESSED){//DOUBLE=1Key_Flag[i]|=KEY_DOUBLE;S[i]=3;}else if(Time>0){//SINGLE=1Key_Flag[i]|=KEY_SINGLE;S[i]=0;}}	else if(S[i]==3){if(CurrState[i]==KEY_UNPRESSED){S[i]=0;}}		else if(S[i]==4){if(CurrState[i]==KEY_UNPRESSED){S[i]=0;}else if(Time[i]==0){Time[i]=KEY_TIME_REPEAT;//REPEAT=1Key_Flag[i]|=KEY_REPEAT;S[i]=4;}}	if(Last_Key_Flag[i]!=Key_Flag[i]){Key_Flag[i]&=~Last_Key_Flag[i];}Last_Key_Flag[i]=Key_Flag[i];}}
}
``

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

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

相關文章

STM32什么是寄存器

提示&#xff1a;文章 文章目錄 前言一、背景二、2.12.2 三、3.1 總結 前言 前期疑問&#xff1a; 1、什么是寄存器&#xff1f; 答&#xff1a;在4GB的地址空間中&#xff0c;512MB的block2上&#xff0c;每4個字節組成32位&#xff0c;這個32位為一個單元&#xff0c;控制&a…

【Pinia】Pinia和Vuex對比

Pinia 是 Vue 官方團隊成員專門開發的一個全新狀態管理庫&#xff0c;并且 Vue 的官方狀態管理庫已經更改為了 Pinia。 在 Vuex 官方倉庫中也介紹說可以把 Pinia 當成是不同名稱的 Vuex 5&#xff0c;這也意味不會再出 5 版本了。 優點 1. 更加輕量級&#xff0c;壓縮后提交只…

通過 Ansible 在 Windows 2022 上安裝 IIS Web 服務器

拓撲結構 這是一個用于通過 Ansible 部署 IIS Web 服務器的實驗室拓撲。 前提條件&#xff1a; 在被管理的節點上安裝WinRm 準備一張自簽名的證書 開放防火墻入站tcp 5985 5986端口 準備自簽名證書 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…

Oracle雙平面適用場景討論會議

4月28日&#xff0c;我在杭州組織召開了Oracle雙平面會議討論沙龍。在國產化數據庫浪潮的今天&#xff0c;Oracle數據庫作為國產數據庫的應急庫&#xff0c;在國產數據庫發生故障或者性能下降時&#xff0c;如何更好的使用Oracle。會議主題如下&#xff1a; 1、背景與痛點速覽&…

10.Linux進程信號

1. 理解信號 信號VS信號量 老婆&#xff1a;老婆餅-》沒有任何關系&#xff01;信號&#xff1a;鬧鐘&#xff0c;上課鈴聲&#xff0c;臉色...人-》進程&#xff1b;信號中斷人正在做的事&#xff0c;是一種事件的異步通知機制&#xff1b; 我們自習一會&#xff0c;等張三回…

求解插值多項式及其余項表達式

例 求滿足 P ( x j ) f ( x j ) P(x_j) f(x_j) P(xj?)f(xj?) ( j 0 , 1 , 2 j0,1,2 j0,1,2) 及 P ′ ( x 1 ) f ′ ( x 1 ) P(x_1) f(x_1) P′(x1?)f′(x1?) 的插值多項式及其余項表達式。 解&#xff1a; 由給定條件&#xff0c;可確定次數不超過3的插值多項式。…

C++刷題:日期模擬(1)

&#xff08;注&#xff1a;本文所展示代碼均為本人所寫&#xff0c;不一定為最優&#xff09; 我們首先用純邏輯和手動計算來拆解日期模擬題&#xff0c;再來代碼實現&#xff0c;看看這些問題的底層思路怎么玩明白&#xff5e; 一、基礎日期計算&#xff1a;直接算“過幾天是…

深入剖析Nginx:從入門到高并發架構實戰

深入剖析Nginx&#xff1a;從入門到高并發架構實戰 摘要&#xff1a;本文全面解析Nginx的核心功能、架構原理及實戰配置&#xff0c;涵蓋負載均衡、反向代理、動靜分離等高級應用場景&#xff0c;助你構建高性能Web服務架構。 一、Nginx是什么&#xff1f;為什么它如此重要&…

Qt客戶端技巧 -- 窗口美化 -- 圓角窗口

不解析&#xff0c;直接給代碼例子 利用窗口重繪事件處理函數paintEvent main.cpp #include <QtCore/qglobal.h> #if QT_VERSION > 0x050000 #include <QtWidgets/QApplication> #else #include <QtGui/QApplication> #endif#include "roundedwin…

Three.js學習筆記-三要素

Three.js 學習筆記-三要素 一、Three.js 簡介 (一)前世今生 Three.js 是一款運行在瀏覽器中的 3D 引擎,由 Ricardo Cabello(Mr.doob)在 2010 年 4 月于 GitHub 首次發布 。其起源可追溯到本世紀初,代碼最初用 ActionScript 編寫,2009 年移植到 JavaScript。隨著 Web…

動力電池點焊機:驅動電池焊接高效與可靠的核心力量|比斯特自動化

在新能源汽車與儲能設備需求激增的背景下&#xff0c;動力電池的制造工藝直接影響產品性能與安全性。作為電芯與極耳連接的核心設備&#xff0c;點焊機如何平衡效率、精度與可靠性&#xff0c;成為電池企業關注的重點。 動力電池點焊機的核心功能是確保電芯與極耳的穩固連接。…

OpenCV CUDA模塊圖像處理------創建一個模板匹配(Template Matching)對象函數createTemplateMatching()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 創建一個用于在 GPU 上執行模板匹配的 TemplateMatching 對象。 該函數返回一個指向 TemplateMatching 的智能指針&#xff08;Ptr&#xff09;…

natapp 內網穿透失敗

連不上網絡錯誤調試排查詳解 - NATAPP-內網穿透 基于ngrok的國內高速內網映射工具 如何將DNS服務器修改為114.114.114.114_百度知道 連不上/錯誤信息等問題解決匯總 - NATAPP-內網穿透 基于ngrok的國內高速內網映射工具 nslookup auth.natapp.cnping auth.natapp.cn

游戲(game)

題目描述 小明最近迷上了一款游戲&#xff0c;并且很想成為這款游戲的高手&#xff0c;這款游戲需要用 資源來買裝備。他剛開始的資源價值為0,于是他每天都會做日常任務來獲得價值為1的資源。 這款游戲中有每日商店&#xff0c;小明已經提前知道了接下來n天會出現的裝備&#x…

C# 類和繼承(抽象類)

抽象類 抽象類是指設計為被繼承的類。抽象類只能被用作其他類的基類。 不能創建抽象類的實例。抽象類使用abstract修飾符聲明。 抽象類可以包含抽象成員或普通的非抽象成員。抽象類的成員可以是抽象成員和普通帶 實現的成員的任意組合。抽象類自己可以派生自另一個抽象類。例…

關于臟讀,幻讀,可重復讀的學習

mysql 可以查詢當前事務隔離級別 默認是RR repeatable-read 如果要測臟讀 要配成未提交讀 RU 讀到了未提交的數據。 3.演示不可重復讀 要改成提交讀 RC 這個是指事務還未結束&#xff0c;其他事務修改了值。導致我兩次讀的不一樣。 4.RR–可以解決不可重復讀 小總結&…

華為云Astro中服務編排、自定義模型,頁面表格之間有什么關系?如何連接起來?如何操作?

目錄 一、核心關系解析 二、連接方式與操作步驟 (一)服務編排與自定義模型的連接 (二)自定義模型與頁面表格的連接 (三)服務編排與頁面表格的連接 三、操作示例:構建數據處理閉環 場景:用戶在頁面表格中修改設備信息,觸發服務編排校驗數據并更新數據庫。 四、…

Docker鏡像無法拉取問題解決辦法

最近再學習RabbitMQ&#xff0c;需要從Docker鏡像中拉取rabbitMQ&#xff0c;但是下拉失敗 總的來說就是無法和docker鏡像遠程倉庫建立連接 我又去嘗試ping docker.io發現根本沒有反應&#xff0c;還是無法連接找了許多辦法還是沒有辦法解決&#xff0c;最后才發現是鏡像問題&a…

向 AI Search 邁進,騰訊云 ES 自研 v-pack 向量增強插件揭秘

作者&#xff1a;來自騰訊云劉忠奇 2025 年 1 月&#xff0c;騰訊云 ES 團隊上線了 Elasticsearch 8.16.1 AI 搜索增強版&#xff0c;此發布版本重點提升了向量搜索、混合搜索的能力&#xff0c;為 RAG 類的 AI Search 場景保駕護航。除了緊跟 ES 官方在向量搜索上的大幅優化動…

electron-vite串口通信

一、構建項目后&#xff0c;安裝“串口通信庫” npm install serialport二、設置 npm install --save-dev electron-rebuild ./node_modules/.bin/electron-rebuild 注意&#xff1a;如果執行報錯以下問題 1、未配置python變量 2、沒有Microsoft Visual Studio BuildTools 3…