藍橋杯單片機之通過實現同一個按鍵的短按與長按功能

實現按鍵的短按與長按的不同功能

問題分析

對于按鍵短按,通常是松開后實現其功能,而不會出現按下就進行后續的操作;而對于按鍵長按,則不太一樣,按鍵長按可能分為兩種情況,一是長按n秒后實現后續功能,比如按鍵按下1s后開燈,第二種情況是長按超過n秒以上實現功能,例如按鍵按下超過1s則不斷增加某一個參數的數值;
對于按鍵檢測,通常有兩種方式,一種是使用循環進行檢測,另一種是使用中斷進行檢測,對于短按按鍵,兩種方式都可以較好地實現,但是對于長按按鍵,則只能在中斷里進行檢測,下面上述幾種情況進行具體分析。

按鍵的檢測

引腳定義如下,對應按鍵為S7.

sbit col1=P4^4;
sbit row1=P3^0;

循環檢測

循環檢測就給一個行和一個列分別賦值相反的值即可,然后檢測是否被拉低,并進行消抖,代碼如下,通常來講,在比賽中都是按鍵松開后實現功能,因此這里不必糾結到底應該在什么時候實現功能,代碼如下。通過判斷函數是否返回1來判斷S7是否被按下。

bit S7()
{col1=0;row1=1;if(row1==0){Delay15ms();while(row1==0);return 1;}return 0;
}

中斷檢測

中斷檢測較為方便,通常我們將定時器設為1ms的定時,然后在中斷里檢測按鍵是否被按下,如果被按下,則開始計數,如果在15次計數后依舊處于按下的狀態,則說明此次按鍵是有效的,在這里,有兩種實現方式,第一種是按鍵按下超過15ms就進行下一步操作,不等待松開,這種方式通常來講會存在bug,因為會導致程序不斷重復執行后續的代碼,因此一般不用這種方式。另一種是等待按鍵松開后再進行下一步操作,代碼如下,這里定時器的配置省略;

void Timer0()interrupt 1
{static unsigned int cnt=0,flag=0;col1=0;row1=1;if(row1==0){cnt++;}else{if(cnt>15){/*****進行后續操作*****/}}
}

對于按鍵的長按,與短按檢測相差不大,只不過是比較的數值會增加而已,對于同一個按鍵的短按與長按,分開進行判斷即可,這里假設檢測長按時間為1s,代碼分別如下;

長按后松開執行
void Timer0()interrupt 1
{static unsigned int cnt=0,flag=0;col1=0;row1=1;if(row1==0){cnt++;}else{// 長按松開檢測 注意 長按檢測要放在短按檢測前if(cnt>1000){/*進行后續操作*/}// 短按檢測else if(cnt>15){/****進行后續操作****/}// 注意 此時按鍵處于斷開狀態 // 因此檢測完按鍵后要將cnt清零cnt=0;}
}
長按后即刻執行
void Timer0()interrupt 1
{static unsigned int cnt=0,flag=0;col1=0;row1=1;if(row1==0){cnt++;// 長按檢測if(cnt>1000){// 如果題目要求的是按鍵按下超過1s就執行動作 不需要按鍵松開// 例如按下超過1s則數字持續增加 此時就直接在此處進行增加的操作即可/*******進行后續的操作*******/}}else{// 短按檢測if(cnt>15){/****進行后續操作****/}// 注意 此時按鍵處于斷開狀態 // 因此檢測完按鍵后要將cnt清零cnt=0;}
}

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

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

相關文章

數據導入技術(文檔加載)

1. 簡單文本的讀取 用LangChain讀入txt文檔 # 讀取單個txt文件 import os from langchain_community.document_loaders import TextLoader # 獲取當前腳本文件所在的目錄 script_dir os.path.dirname(__file__) print(f"獲取當前腳本文件所在的目錄:{script…

靶場(二十)---靶場體會小白心得 ---jacko

老樣子開局先看端口,先看http端口 PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 10.0 |_http-title: H2 Database Engine (redirect) | http-methods: |_ Potentially risky methods: TRACE |_http-server-header:…

讓AI看見世界:MCP協議與服務器的工作原理

讓AI看見世界:MCP協議與服務器的工作原理 MCP(Model Context Protocol)是一種創新的通信協議,旨在讓大型語言模型能夠安全、高效地與外部資源進行交互。在AI技術快速發展的今天,MCP正成為連接AI與現實世界的重要橋梁。…

|從零開始的Pyside2界面編程| 用Pyside2打造一個AI助手界面

🐑 |從零開始的Pyside2界面編程| 用Pyside2打造一個AI助手界面 🐑 文章目錄 🐑 |從零開始的Pyside2界面編程| 用Pyside2打造一個AI助手界面 🐑?前言??調取Deepseek大模型??準備工作??調用API? ?將模型嵌入到ui界面中??…

如何利用Elastic Stack(ELK)進行安全日志分析

在以下文章中,我將解釋如何使用Elastic Stack(ELK)進行安全日志分析,以提高安全性和監控網絡活動。ELK是一個功能強大的開源日志管理和分析平臺,由Elasticsearch、Logstash和Kibana組成,適用于各種用例&…

網絡安全-等級保護(等保)3-0 等級保護測評要求現行技術標準

################################################################################ 第三章:測評要求、測評機構要求,最終目的是通過測評,所以我們將等保要求和測評相關要求一一對應形成表格。 GB/T 28448-2019 《信息安全技術 網絡安全等…

網絡通訊知識——通訊分層介紹,gRPC,RabbitMQ分層

網絡通訊分層 網絡通訊分層是為了將復雜的網絡通信問題分解為多個獨立、可管理的層次,每個層次專注于特定功能。目前主流的分層模型包括OSI七層模型和TCP/IP四層(或五層)模型,以下是詳細解析: 一、OSI七層模型&#…

gopool 源碼分析

gopool gopool是字節跳動開源節流的gopkg包中協程池的一個實現。 關鍵結構 協程池: type pool struct {// The name of the poolname string// capacity of the pool, the maximum number of goroutines that are actually working// 協程池的最大容量cap int32…

【工作記錄】接口功能測試總結

如何對1個接口進行接口測試 一、單接口功能測試 1、接口文檔信息 理解接口文檔的內容: 請求URL: https://[ip]:[port]/xxxserviceValidation 請求方法: POST 請求參數: serviceCode(必填), servicePsw(必填) 響應參數: status, token 2、編寫測試用例 2.1 正…

Linux中su與sudo命令的區別:權限管理的關鍵差異解析

💝💝💝歡迎蒞臨我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:「storms…

樂觀鎖與悲觀鎖的實現和應用

樂觀鎖與悲觀鎖:原理、實現與應用詳解 在并發編程和數據庫操作中,樂觀鎖和悲觀鎖是兩種重要的并發控制策略,它們在原理、實現方式和應用場景上存在顯著差異。下面我們將通過圖文結合的方式,深入探討這兩種鎖機制。 一、基本概念 1…

ios蘋果系統,js 滑動屏幕、錨定無效

現象:window.addEventListener監聽touch無效,劃不動屏幕,但是代碼邏輯都有執行到。 scrollIntoView也無效。 原因:這是因為 iOS 的觸摸事件處理機制和 touch-action: none 的設置有關。ios有太多得交互動作,從而會影響…

Redis主從復制原理二 之 主從復制工作流程

概述 本文緊接「Redis主從復制的原理一 之 概述」,詳細介紹了Redis的主從服務過程及原理。 主從復制工作流程 主從復制過程大體可以分為3個階段: 建立連接階段(即準備階段)數據同步階段命令傳播階段 階段一:建立連接階…

Markdown基礎(1.2w字)

1. Markdown基礎 這次就沒目錄了,因為md格式太亂了寫示例,展示那些都太亂了,導致目錄很亂。 (我是XX,出現了很多錯誤,有錯誤和我說) 1.1 Markdown簡介 Markdown是一種輕量級的標記語言&#…

JAVA-springboot log日志

SpringBoot從入門到精通-第8章 日志的操作 一、Spring Boot默認的日志框架 SpringBoot支持很多種日志框架,通常情況下,這些日志框架都是由一個日志抽象層和一個日志實現層搭建而成的,日志抽象層是為記錄日志提供的一套標準且規范的框架&…

Vue 渲染 Markdown 文件完全指南

前言 大家好,我是一諾,今天分享的是vue中渲染markdown文件。這是一個常見的需求,比如用戶隱私協議頁、技術說明等文檔頁面~ 本文將詳細介紹如何在 Vue 中渲染 Markdown 文件,并美化代碼塊的顯示效果。 基礎概念 什么是 Markdo…

Science Robotics:UCLA 賀曦敏團隊綜述自主軟體機器人

在機器人中實現類似生命的自主性一直是研究的方向,但目前大多數軟體機器人仍依賴外部刺激操控來產生持續運動。為了實現能夠自我調節感知 、 決策和驅動的自主物理智能(autonomous physical intelligence,API),一種有前…

基于LangChain構建高效RAG問答系統:向量檢索與LLM集成實戰

基于LangChain構建高效RAG問答系統:向量檢索與LLM集成實戰 在本文中,我將詳細介紹如何使用LangChain框架構建一個完整的RAG(檢索增強生成)問答系統。通過向量檢索獲取相關上下文,并結合大語言模型,我們能夠…

【Java學習筆記】SringBuffer類(重點)

StringBuffer(重點) 1. 基本介紹 (1)StringBuffer是可變的字符序列,可以對字符串內容驚醒增刪 (2)很多方法喝String相同,但StringBuffer可變長度 (3)Strin…

計算機網絡領域所有CCF-A/B/C類期刊匯總!

本期小編統計了【計算機網絡】領域CCF推薦所有期刊的最新影響因子,分區、年發文量以及投稿經驗,供大家參考! CCF-A類 1 IEEE Journal on Selected Areas in Communications 【影響因子】13.8 【期刊分區】JCR1區,中科院1區TOP …