藍橋杯電子賽_零基礎利用按鍵實現不同數字的顯現

目錄

一、前提

按鍵的原理圖

二、代碼配置

bsp_key.c文件

疑問

main.c文件

?main.c文件的詳細講解

功能實現

注意事項


一、前提

按鍵這一板塊主要是以記憶為主,我直接給大家講解代碼去實現我要配置的功能。本次我要做的項目是板子上的按鍵有S4~S19,我希望任意一個按鍵可以顯示對應的兩位數,按下兩個不同的按鍵可以一前一后各顯示出兩位數字,也就是生成四位數字,再按下另外一個按鍵實現清零的功能。

按鍵的原理圖

這是板子上按鍵的原理圖,如果要切換獨立按鍵和矩陣鍵盤,那么我們需要將板子上J5部分的小插口的東西插到對應的位置上去,本項目是在KBD上,12是KBD矩陣鍵盤,23是BTN獨立按鍵,如下圖:

那么如何掃描呢?答:先鎖定行,再鎖定列,舉個例子:假如說,我現在想要掃描S4這個按鍵,我們先要鎖定從左往右數第一列連接對應的引腳是P44,S4對應的行是P33

二、代碼配置

我們這里只用到Timer、init、seg、key,led,本文章沒寫的代碼可以去我這個藍橋杯第一個系列觀看,里面有很詳細的代碼簡介

bsp_key.c文件

#include "bsp_key.h"//函數名:按鍵碼值讀取函數
//入口參數:無
//返回值:按鍵的碼值
//函數功能:返回按鍵碼
unsigned char Key_Read(void)
{unsigned int Key_NEW;unsigned char Key_Value;//返回值P44 = 0;P42 = 1;P35 = 1;P34 = 1;//第一列掃描Key_NEW = P3 & 0X0F; //P3 = 0000 1000---P37~P30,高位無效,只看P33~P30P44 = 1;P42 =0;P35 = 1;P34 = 1;//第二列掃描Key_NEW = (Key_NEW << 4) | (P3 & 0X0F); //將原來的數值挪到次4位,本次數值放到最低4位,占用了8位P44 = 1;P42 =1;P35 = 0;P34 = 1;//第三列掃描Key_NEW = (Key_NEW << 4) | (P3 & 0X0F); //將原來的數值挪到次次4位,本次數值放到最低4位,占用了12位P44 = 1;P42 =1;P35 = 1;P34 = 0;//第三列掃描Key_NEW = (Key_NEW << 4) | (P3 & 0X0F); //將原來的數值挪到次次次4位,本次數值放到最低4位,占用了16位switch(~Key_NEW)//Key_Value的數值對應按鍵的編號{case 0X8000:Key_Value = 4;break;case 0X4000:Key_Value = 5;break;case 0X2000:Key_Value = 6;break;case 0X1000:Key_Value = 7;break;case 0X0800:Key_Value = 8;break;case 0X0400:Key_Value = 9;break;case 0X0200:Key_Value = 10;break;case 0X0100:Key_Value = 11;break;case 0X0080:Key_Value = 12;break;case 0X0040:Key_Value = 13;break;case 0X0020:Key_Value = 14;break;case 0X0010:Key_Value = 15;break;case 0X0008:Key_Value = 16;break;case 0X0004:Key_Value = 17;break;case 0X0002:Key_Value = 18;break;case 0X0001:Key_Value = 19;break;default :Key_Value = 0;}return Key_Value;}

疑問

在中switch中,為什么進行Key_New的取反?

答:一般來說,按鍵配置的時候,我們配置的是上拉輸入,在沒按按鍵的時候,對應的是高電平,按下去,是低電平,那么我們通過取反,就是按下去成為高電平1,利用哪個地方是1,進行選擇對應的case

main.c文件

#include "bsp_init.h"
#include "bsp_seg.h"
#include "Timer0.h"
#include "bsp_key.h"
#include "bsp_key.h"
#include "STDIO.H"/* 函數聲明 */
void	Key_Proc(void);//按鍵處理
void	Seg_Proc(void);//顯示處理/* 全局變量 */unsigned char seg_buf[8];//放置字符串轉換后的段碼到數組
unsigned char seg_string[10];//放置字符串
unsigned char pos = 0;//中斷顯示專用unsigned char Key_Value;//讀取按鍵的數值存儲變量
unsigned char Key_Down,Key_Old;unsigned char num_buffer[2] = {0, 0}; // 存儲2個按鍵編號
unsigned char num_count = 0; // 當前存儲的數字個數unsigned char Seg_Show_Num;//準備顯示出來的數值
void main()
{Cls_Peripheral();Timer0Init();		//1毫秒@12.000MHzEA = 1;while(1){Key_Proc();//按鍵處理Seg_Proc();//顯示處理}}/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 
{Seg_Disp( seg_buf, pos );if(++pos ==8) pos = 0;
}
/* Key_Proc */
void	Key_Proc(void)//按鍵處理,底層數據變更
{Key_Value = Key_Read();//讀取按鍵按下的編號Key_Down = Key_Value & (Key_Old ^ Key_Value);//^異或(0000^0101)= 0101 0101 & 0101 = //0101 如果按鍵發生了下降沿的變化,輸出結果和本次按鍵數值相同//^異或(0101^0101)= 0000 0101 & 0000 = //0000 如果按鍵發生了下降沿的變化,輸出結果和本次按鍵數值相同Key_Old = Key_Value;if(Key_Down)//如果捕捉到下降沿跳變{if (num_count < 2) // 如果存儲的按鍵個數小于2{num_buffer[num_count++] = Key_Down; // 存儲按鍵編號}else // 如果已經存儲了兩個按鍵編號{// 清零操作num_count = 0; // 清空按鍵個數     }}	
}/* Seg_Proc */
void	Seg_Proc(void)//顯示處理,顯示信息生成
{if (num_count == 1) // 如果只存儲了一個按鍵編號{// 顯示第一個按鍵編號的兩位數字sprintf(seg_string, "    %02d", (unsigned int)num_buffer[0]);}else if (num_count == 2) // 如果存儲了兩個按鍵編號{// 顯示兩個按鍵編號的四位數字sprintf(seg_string, "    %02d%02d", (unsigned int)num_buffer[0], (unsigned int)num_buffer[1]);}else // 如果沒有存儲任何按鍵編號{// 顯示全0sprintf(seg_string, "    0000");}Seg_Tran( seg_string,seg_buf);}

?main.c文件的詳細講解

假如說,我現在按下去了S4,那么檢測到了S4處有下降沿,并且將這個數值給一個變量Key_Val,然后這個變量就給到了Seg_Show_Num,此刻還是一個二進制數,無法顯示到數碼管上,然后將這個Seg_Show_Num通過sprintf轉化成字符串,字符串在Seg_Disp函數下,將段碼轉化成能看懂的數字,最后利用定時器中斷每1ms進行刷新數碼管上的東西

  1. 顯示邏輯調整:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 在Seg_Proc函數中:

    • 如果num_count為0,顯示全0。

    • 如果num_count == 2,顯示兩個按鍵編號的四位數字(如0405)。

    • 如果num_count == 1,只顯示第一個按鍵編號的兩位數字(如04)。

  2. 按鍵邏輯調整

    Key_Proc函數中:
    • 如果num_count == 2,按下任意按鍵清零。

    • 如果num_count < 2,存儲按鍵編號。

  3. 數碼管顯示位數調整

    數碼管的動態掃描范圍為8位,顯示內容通過sprintf格式化為8位數碼管的顯示格式。
功能實現
  • 按下第一個按鍵

    • 顯示該按鍵對應的兩位數字(如04)。

  • 按下第二個按鍵

    • 顯示兩個按鍵對應的四位數字(如0405)。

  • 按下任意第三個按鍵

    • 清零顯示內容,顯示0000

注意事項

確保按鍵編號S4S19與實際硬件的按鍵編號一致。

如果按鍵編號不是從419的連續數字,需要根據實際硬件調整按鍵編號的判斷邏輯。

顯示內容前面有4個空格,確保顯示內容在8位數碼管的中間位置。如果需要調整顯示位置,可以修改sprintf中的空格數量。

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

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

相關文章

Python常用高階函數全面解析:通俗易懂的指南

Python常用高階函數全面解析&#xff1a;通俗易懂的指南 一、什么是高階函數&#xff1f; 高階函數(Higher-order Function)是指能夠接受其他函數作為參數&#xff0c;或者將函數作為返回值的函數。在Python中&#xff0c;函數是一等公民&#xff0c;可以像普通變量一樣傳遞和…

Flume之選擇器:復制和多路復用(比喻化理解

Flume 的選擇器決定了Source 如何將數據分發到多個 Channel。這就像 “快遞員如何分配包裹到不同的運輸通道”&#xff0c;有兩種策略&#xff1a;復制和多路復用。 一、復制&#xff08;Replicating Selector&#xff09;&#xff1a;每個 Channel 都送一份 核心邏輯 將同一…

yolov5 安卓運行

參考博客&#xff1a; 通過Android Studio 將yolov5部署到手機端(新手最新適用版)_怎么將yolo部署手機-CSDN博客 總體跟隨參考博客走是沒問題&#xff0c;有些細節需要注意&#xff1a; 1 jdk 版本選擇&#xff0c;jdk需要17&#xff0c;新版的Android Studio 選擇jdk版本方式…

day021-定時任務

文章目錄 1. cron1.1 檢查是否安裝1.2 檢查是否開機自啟動1.3 配置文件與相關命令1.4 配置文件格式 2. 案例2.1 同步時間2.2 定時備份/etc和/var/log目錄2.3 定時巡檢腳本 3. 練習三劍客過濾3.1 去重統計ip數量3.2 去重統計第7列 用戶訪問的url的數量3.3 去重統計第9列 狀態碼與…

關于(stream)流

Stream 是 Java 8 引入的一個強大的功能&#xff0c;用于處理集合&#xff08;Collection&#xff09;或數組中的數據。它提供了一種聲明式的編程方式&#xff0c;可以極大地簡化對數據的操作&#xff0c;例如過濾、排序、映射和聚合等。 1. 什么是 Stream 流&#xff1f; 定義…

結課作業自選01. 內核空間 MPU6050 體感鼠標驅動程序(二)(完整實現流程)

目錄 一. 題目要求-內核空間 MPU6050 體感鼠標驅動程序 二. 偽代碼及程序運行流程 三. 主要函數詳解&#xff08;根據代碼流程進行詳解&#xff09; 3.1 module_i2c_driver宏&#xff08;對應“1”&#xff09; 3.2 mpu_of_match設備樹匹配表&#xff08;對應“2”&#x…

5G 核心網切換機制全解析:XN、N2 與移動性注冊對比

摘要 本文深入探討了 5G 核心網中的三種關鍵切換方式:基于 XN 接口的切換、基于 N2 接口的切換以及移動性注冊更新機制。通過對比分析它們的原理、應用場景和技術差異,幫助讀者全面理解 5G 網絡中用戶移動性管理的核心技術。 1. 引言 隨著 5G 技術的廣泛應用,用戶對網絡連…

用深度學習提升DOM解析——自動提取頁面關鍵區塊

一、時間軸&#xff1a;一次“抓不到重點”的二手車數據爬蟲事故 2025/03/18 09:00 產品經理希望抓取懂車帝平臺上“北京地區二手車報價”作為競品監測數據源。我們初步使用傳統XPath方案&#xff0c;試圖提取車型、年限、里程、價格等數據。2025/03/18 10:00 初版腳本運行失敗…

React與Vue的內置指令對比

React 與 Vue 不同&#xff0c;它沒有內置的模板指令系統。React 采用了 JavaScript 優先 的聲明式方式&#xff0c;使用 JSX 語法將 HTML 和 JavaScript 結合在一起。因此&#xff0c;React 中沒有類似 Vue 的 v-if、v-for、v-bind 等內置指令。 React 中的替代方案 條件渲染…

Spring聲明式事務源碼全鏈路剖析與設計模式深度解讀

Spring聲明式事務源碼全鏈路剖析與設計模式深度解讀 作者&#xff1a;AI 日期&#xff1a;2025-05-22 一、前言 Spring事務是企業級開發的基石&#xff0c;但“為什么有時事務失效&#xff1f;”、“不同傳播行為背后發生了什么&#xff1f;”、“Spring事務源碼到底如何實現&…

云原生安全基礎:深入探討容器化環境中的權限隔離與加固策略

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 在云原生環境中&#xff0c;容器化技術&#xff08;如 Docker 和 Kubernetes&#xff09;的廣泛應用帶來了靈活性與效率&#xff0c;但也引入了新的安全挑…

如何在 ONLYOFFICE 演示文稿中調整段落首行縮進

在制作演示文稿時&#xff0c;保持內容的一致性與可讀性至關重要&#xff0c;而段落首行縮進作為格式設置的關鍵環節&#xff0c;直接影響著整體呈現效果。在本文中&#xff0c;我們將介紹如何通過創建 ONLYOFFICE 宏&#xff0c;快速設置演示文稿中所有段落的首行縮進。 關于 …

[Asp.Net]GridView、Repeater 導出Excel長數字顯示成科學計數

類似身份證純數字的格式時 &#xff0c;excel默認是數字格式 變成了科學計數法 &#xff0c; GridView:RowDataBound 添加e.Row.Cells[2].Attributes.Add(“style”, “vnd.ms-excel.numberformat:;”); protected void GridView1_RowDataBound(object sender, GridViewRowE…

Ntfs!NtfsReadBootSector函數分析之nt!CcGetVacbMiss中得到一個nt!_VACB結構

第一部分&#xff1a; 1: kd> g Breakpoint 3 hit nt!CcGetVacbMiss: 80a1a19e 6a30 push 30h 1: kd> kc # 00 nt!CcGetVacbMiss 01 nt!CcGetVirtualAddress 02 nt!CcMapData 03 Ntfs!NtfsMapStream 04 Ntfs!NtfsReadBootSector Ntfs…

Linux10正式版發布,擁抱AI了!

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中國DBA聯盟(ACDU)成員&#xff0c;10余年DBA工作經驗 Oracle、PostgreSQL ACE CSDN博客專家及B站知名UP主&#xff0c;全網粉絲10萬 擅長主流Oracle、MySQL、PG、高斯…

關于 SSE(Server-Sent Events)過程的簡要解剖

Js前端&#xff1a;發送普通請求 fetch(...) .then(()>{}) .catch(()>{})Java后端&#xff1a;接收請求后調用請求處理函數&#xff0c;函數返回一個emiiter對象 public SseEmitter handleRequest(...) {// 創建一個 SseEmitter 對象&#xff0c;用于發送 SSE 事件SseE…

PyTorch 中unsqueeze(-1)用法

unsqueeze(-1) 是 PyTorch 中的一個張量操作&#xff0c;用于?在指定維度上增加一個長度為1的維度?&#xff08;即擴展維度&#xff09;。具體解析如下&#xff1a; 功能說明 ?作用位置? -1 表示在張量的?最后一個維度?后添加新維度。 &#xff08;等價于 dimlen(tensor.…

RTC技術

什么是RTC RTC&#xff08;Real time communication&#xff09;實時通信&#xff0c;是實時音視頻的一個簡稱&#xff0c;我們常說的RTC技術一般指的是WebRTC技術&#xff0c;已經被 W3C 和 IETF 發布為正式標準。由于幾乎所有主流瀏覽器都支持 WebRTC 標準 API &#xff0c;…

vue+cesium示例:3Dtiles三維模型高度調整(附源碼下載)

接到一位知識星友的邀請&#xff0c;實現他需要3Dtiles三維模型的簡單高度調整需求&#xff0c;適合學習Cesium與前端框架結合開發3D可視化項目。 demo源碼運行環境以及配置 運行環境&#xff1a;依賴Node安裝環境&#xff0c;demo本地Node版本:推薦v18。 運行工具&#xff1a;…

詳解3DGS

4 可微分的3D高斯 splatting 核心目標與表示選擇 我們的目標是從無法線的稀疏SfM點出發&#xff0c;優化出一種能夠實現高質量新視角合成的場景表示。為此&#xff0c;我們選擇3D高斯作為基本圖元&#xff0c;它兼具可微分的體表示特性和非結構化的顯式表示優勢&#xff0c;既…