嵌入式進階——數碼管2

🎬 秋野醬:《個人主頁》
🔥 個人專欄:《Java專欄》《Python專欄》

??心若有所向往,何懼道阻且長

文章目錄

    • 驅動封裝
    • 封裝的一些疑問
    • 數字走馬燈實現
    • 擴展知識

驅動封裝

根據前面的內容可以將代碼進行封裝,封裝后作為一個獨立的整體出現:

#ifndef __NIXIE_H__
#define __NIXIE_H__#include "config.h"#define	NIXIE_DI	P44	// 數據輸入
#define	NIXIE_SCK	P42	// 移位寄存器
#define	NIXIE_RCK	P43	// 鎖存寄存器#define NIXIE_PIN_INIT() {    P4M0 &= ~0x1c; P4M1 &= ~0x1c; }void NIXIE_init();// 		u8 a_dat = 0x12;	// 0001 0010	字母位
//		u8 b_idx = 0x1F;	// 0001 1111	數字位
void NIXIE_show(u8 a_dat, u8 b_idx);// num對應數字在數組里的位置(索引)
// id 顯示在指定位置(0 -> 7)
void NIXIE_display(u8 num, u8 id);#endif

● 定義 NIXIE_init() 函數,負責對GPIO相關的初始化
● 定義 NIXIE_display()函數負責顯示

#include "NIXIE.h"
#include "Delay.h"#define GET_BIT_VAL(byte, pos)	(byte & (1 << pos))//#define NOP_TIME() NOP40()	// 用于看logic分析儀
#define NOP_TIME() NOP2()// 鎖存操作 - 多行宏定義
#define RCK_ACTION() 		\NIXIE_RCK = 0;		\NOP_TIME();			\NIXIE_RCK = 1;		\NOP_TIME();void NIXIE_init(){NIXIE_PIN_INIT();
}static void NIXIE_out(u8 dat){char i;// 8bit,先發出去的會作為高位for(i = 7; i >= 0; i--){            NIXIE_DI = GET_BIT_VAL(dat, i);// 寄存器的移位操作NIXIE_SCK = 0;NOP_TIME(); // 休眠一會兒NIXIE_SCK = 1;NOP_TIME(); // 休眠一會兒}
}// 每次可以顯示多個,但是內容都是一樣的a_dat
// 		u8 a_dat = 0x12;	// 0001 0010	字母位
//		u8 b_idx = 0x1F;	// 0001 1111	數字位
void NIXIE_show(u8 a_dat, u8 b_idx){// 顯示 7.// 0111 1000// 先發字母位 (控制顯示的內容)	// 0點亮// 8bit,先發出去的會作為高位NIXIE_out(a_dat);// 0,1,2,3....7// 再發數字位 (控制顯示哪幾個) // 只要不是0,就是高電平// 1111 1011// 7.7.空7. 7.7.7.7.  -------------------與二級制是反向// 8bit,先發出去的會作為高位NIXIE_out(b_idx);// 鎖存操作RCK_ACTION();}

以上為Nixie.h的實現,也是對之前代碼的封裝處理。

#include "Config.h"
#include "NIXIE.h"
#include "Delay.h"int main() {u8 a_dat = 0xF8;	// 0001 0010	字母位u8 b_idx = 0xFB;	// 0001 1111	數字位NIXIE_init();// NIXIE_show寫到循環外邊即可NIXIE_show(a_dat, b_idx);while(1) {}
}

封裝的一些疑問

封裝的特點
封裝是面向對象程序設計中的一個重要概念,它將數據和行為封裝在一起,形成一個獨立的單元。下面是封裝的特點:

  1. 數據隱藏:封裝可以隱藏數據,只對外界公開必要的接口,從而保證數據的安全性和可靠性。
  2. 接口統一:封裝可以將數據和行為組織在一起,形成一個類或對象,通過統一的接口對外提供服務,便于使用和管理。
  3. 信息隱藏:封裝可以隱藏實現細節,只對外界公開必要的信息,從而降低了程序的復雜度和耦合度,提高了程序的可維護性和可擴展性。
  4. 可重用性:封裝可以將數據和行為封裝成一個獨立的單元,便于復用和重復利用,提高了程序的開發效率和代碼的可重用性。
  5. 封裝和繼承相結合:封裝和繼承是面向對象程序設計中的兩個重要概念,它們相互配合,可以構建出更加復雜、靈活和可擴展的程序。
    總之,封裝是面向對象程序設計的核心思想之一,它可以提高程序的可靠性、安全性、可維護性和可擴展性,是程序設計中不可或缺的重要概念。
    當前設計問題
    接口設計:定義初始化(Nixie_init),和具體功能(Nixie_display),初始化和芯片開發板設計相關,功能的定義和業務相關。
    初始化問題:為什么不用庫函數?首先是可以使用庫函數的。觀察使用庫函數和不是庫函數的區別。一個初始化寫在頭文件,一個寫在c文件。c文件是實現,做到拋開平臺相關是最好的方案,也就是換了芯片平臺,實現不動,通過改變頭中的配置,就可以做到移植。(當然,理想狀態是這樣的,還得看實現復雜度。目標明確,盡量做到這個,為移植提供最少變化方案,這個是共識)
// 索引對應表格參見:
// https://www.yuque.com/icheima/stc8h/kmz2mllvxs1uvdfy#lLhhp
u8 code LED_TABLE[] = 
{// 0 	1	 2	-> 9	(索引012...9)0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,// 0. 1. 2. -> 9.	(索引10,11,12....19)0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,// . -						(索引20,21)0x7F, 0xBF,// AbCdEFHJLPqU		(索引22,23,24....33)0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xF1,0xC7,0x8C,0x98,0xC1
};// 每次只顯示一個
// 	\arg num 對應數字在數組里的位置(索引)
//  \arg id 顯示在指定位置(0 -> 7)
void NIXIE_display(u8 num, u8 id){u8 a_dat = LED_TABLE[num];	// 0001 0010	字母位u8 b_idx = 1 << id;					// 0010 0000	數字位 5NIXIE_show(a_dat, b_idx);
}

● index在沒有封裝前,一個bit表示一個燈。封裝后表示燈的下標。這樣設計符合人的思考習慣,函數就是讓人調得舒服
● dat在沒有封裝前,是自己來總結燈的開滅,封裝后表示自己定義的字符,通過下標訪問。這樣簡化操作。還是為了調用舒服。

數字走馬燈實現

#include "Config.h"
#include "NIXIE.h"
#include "Delay.h"int main() {u8 i;// u8 a_dat = 0xF8;	// 0001 0010	字母位// u8 b_idx = 0xFB;	// 0001 1111	數字位NIXIE_init();// NIXIE_show寫到循環外邊即可// NIXIE_show(a_dat, b_idx);while(1) {		// 1000 / (2 * 8) = 62.5幀/秒// 走馬燈for(i = 0; i < 8; i++) {NIXIE_display(i + 1, i);delay_ms(100);}}
}

擴展知識

原理圖中,大部分引腳我們已經知道了,但是還有些引腳功能不清楚。
● RESET: 10號引腳。
● OUTPUT_ENABLE: 13號引腳。
在這里插入圖片描述

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

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

相關文章

貪心題目總結

1. 最長遞增子序列 我們來看一下我們的貪心策略體現在哪里&#xff1f;&#xff1f;&#xff1f; 我們來總結一下&#xff1a; 我們在考慮最長遞增子序列的長度的時候&#xff0c;其實并不關心這個序列長什么樣子,我們只是關心最后一個元素是誰。這樣新來一個元素之后&#xf…

HTML5 Web組件技術應用

目錄 Custom ElementsShadow DOMHTML TemplatesHTML ImportsHTML5 Web Components技術是一組相關標準和API的集合,旨在增強Web開發中的組件化能力,允許開發者創建可重用、封裝良好的自定義UI組件,這些組件擁有獨立的視圖層(樣式)、邏輯(行為)和結構(模板)。Web Compon…

【Week-R1】RNN實現心臟病預測,基于tensorflow框架

文章目錄 一、什么是RNN&#xff1f;二、準備環境和數據2.1 導入數據 三、構建模型四、訓練和預測五、其他&#xff08;1&#xff09;sklearn模塊導入報錯&#xff1a;ModuleNotFoundError: No module named sklearn&#xff08;2&#xff09;優化器改為SGD&#xff0c;accurac…

類和對象2

三、C對象模型和this指針 3.1 成員變量和成員函數分開存儲 在C中&#xff0c;類內的成員變量和成員函數分開存儲&#xff0c;只有非靜態成員變量才屬于類的對象上 #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <string.h> using namespace …

Linux系統之GoAccess實時Web日志分析工具的基本使用

Linux系統之GoAccess實時Web日志分析工具的基本使用 一、GoAccess介紹1.1 GoAccess簡介1.2 GoAccess功能1.3 Web日志格式 二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹 三、檢查本地環境3.1 檢查本地操作系統版本3.2 檢查系統內核版本3.3 檢查系統鏡像源3.4 更新軟件列表…

JavaFX安裝與使用

前言 最近學習了javafx,開始時在配置環境和導包時遇到了一些麻煩,關于網上很多方法都嘗試過了,現在問題都解決了,和大家分享一下我是怎么實現javafx的配置,希望大家可以通過這個方法實現自己的環境配置! &#x1f648;個人主頁: 心.c &#x1f525;文章專題:javafx &#x1f49…

如何在linux命令行(終端)執行ipynb 文件。可以不依賴jupyter

1.安裝 runipy pip install runipy 2.終端運行 runipy <YourNotebookName>.ipynb 在終端命令行執行shell腳本&#xff0c;&#xff08;也可以在crontab 中執行&#xff09;&#xff1a; (base) [recommendapp-0-5-B-006 script]$ cat run1.sh #!/bin/bashcd /home/recom…

計算機網絡-Traffic-Filter流量過濾策略

一、概述 為提高網絡安全性&#xff0c;管理人員需要控制進入網絡的流量&#xff0c;將不信任的報文丟棄在網絡邊界。所謂的不信任報文是指對用戶來說存在安全隱患或者不愿意接收的報文。同時保證數據訪問安全性&#xff0c;企業網絡中經常會要求一些部門之間不能相互訪問。 背…

服務器數據恢復—同友存儲raid5陣列上層虛擬機數據恢復案例

服務器數據恢復環境&#xff1a; 某市教育局同友存儲&#xff0c;存儲中有一組由數塊磁盤組建的raid5陣列&#xff0c;存儲空間劃分若干lun。每個lun中有若干臺虛擬機&#xff0c;其中有數臺linux操作系統的虛擬機為重要數據。 存儲結構&#xff1a; 服務器故障&#xff1a; r…

前端面試個人技能總結

1.html5新特性 語義化標簽&#xff1a;header footer nav section artical aside媒體標簽&#xff1a;qudio video &#xff08;control autoplay loop &#xff09; source標簽表單新增屬性&#xff1a;輸入類型type:email url data month week color&#xff1b;新增屬性&…

slam14講(第9,10講 后端)

slam14講&#xff08;第9&#xff0c;10講 后端&#xff09; 后端分類基于濾波器的后端線性系統和卡爾曼濾波非線性系統和擴展卡爾曼濾波 BA優化H矩陣的稀疏性和邊緣化H矩陣求解的總結 位姿圖優化公式推導 基于滑動窗口的后端個人見解舊關鍵幀的邊緣化 后端分類 基于濾波器的后…

AtCoder Beginner Contest 355 A~F

A.Who Ate the Cake?(思維) 題意 已知有三個嫌疑人&#xff0c;有兩個證人&#xff0c;每個證人可以指出其中一個嫌疑人不是罪犯&#xff0c;如果可以排除兩個嫌疑人來確定犯人&#xff0c;輸出犯人的身份&#xff0c;如果無法確定&#xff0c;輸出"-1"。 分析 …

AT_abc351_c [ABC351C] Merge the balls 題解

題目傳送門 題目大意 你有一個空序列和 N N N 個球。第 i i i 個球 ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1≤i≤N) 的大小是 2 A i 2^{A_i} 2Ai?。 計算 N N N 操作后序列中剩余的球的個數。 你將進行 N N N 次運算。 在第 i i i 次操作中&#xff0c;你將第 i i…

springboot + Vue前后端項目(第十一記)

項目實戰第十一記 1.寫在前面2. 文件上傳和下載后端2.1 數據庫編寫2.2 工具類CodeGenerator生成代碼2.2.1 FileController2.2.2 application.yml2.2.3 攔截器InterceptorConfig 放行 3 文件上傳和下載前端3.1 File.vue頁面編寫3.2 路由配置3.3 Aside.vue 最終效果圖總結寫在最后…

TabAttention:基于表格數據的條件注意力學習

文章目錄 TabAttention: Learning Attention Conditionally on Tabular Data摘要方法實驗結果 TabAttention: Learning Attention Conditionally on Tabular Data 摘要 醫療數據分析通常結合成像數據和表格數據處理&#xff0c;使用機器學習算法。盡管先前的研究探討了注意力…

Hudi 多表攝取工具 HoodieMultiTableStreamer 配置方法與示例

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

vue3添加收藏網站頁面

結構與樣式 <template><div class"web_view"><ul><li v-for"web in webList" :key"web.title"><a :href"web.src" :title"web.title" target"_blank"><img :src"web.img&…

微信小程序基礎 -- 小程序UI組件(5)

小程序UI組件 1.小程序UI組件概述 開發文檔&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/view/component.html 什么是組件&#xff1a; 組件是視圖層的基本組成單元。 組件自帶一些功能與微信風格一致的樣式。 一個組件通常包括 開始標簽 和 結…

Cyber Weekly #8

賽博新聞 1、微軟召開年度發布會Microsoft Build 2024 本周&#xff08;5.22&#xff09;微軟召開了年度發布會&#xff0c;Microsoft Build 2024&#xff0c;發布了包括大殺器 Copilot Studio 在內的 50 項更新。主要包括&#xff1a; 硬件層面&#xff1a;與英偉達 & A…