第二十三天-LCD液晶顯示實驗

一、LCD結構體

定義LCD為LCD_TypeDef類型的指針,指向0x6C000000的地址空間(bank1分區4的地址范圍)。

為什么需要并上0x000007FE呢?

因為雖然驅動SRAM的時序和16位8080接口時序(驅動LCD時序)很像,但是8080的RS(寄存器選擇)信號需要解決,解決方法是使用SRAM地址信號中的A10作為RS位。

0x000007FE是內部地址,指向一個8位的存儲空間。同時也是A10引腳的偏移值,因為A10是外部存儲器16位的地址,所以我們要先把該地址變成外部地址(右移一位或除以2),也就是說

111 1111 1110 -> 011 1111 1111

也就是該結構體變量的首地址是011 1111 1111(對于外部存儲器來說),那么結構體變量成員LCD_REG的地址就是011 1111 1111,而LCD_RAM的地址是外部地址加1,即100 0000 0000。

這種設計使得,兩個變量所在地址空間的A10不同,解決了RS的問題。

二、lcddev結構體

用來設置LCD的結構體。

三、底層接口函數

四、LCD初始化函數

五、LCD坐標設置函數

六、LCD畫點函數

七、LCD字符顯示函數

以下是針對圖片中 LCD_ShowChar 函數的逐行解析,結合其功能實現和硬件交互邏輯:


?1. 函數功能概述?

void LCD_ShowChar(u16 x, u16 y, u8 num, u8 size, u8 mode)
  • ?作用?:在LCD屏幕的指定位置 (x,y) 顯示一個ASCII字符。
  • ?參數?:
    • x, y:字符左上角起始坐標(像素單位)。
    • num:要顯示的字符(ASCII碼,范圍從空格 ' ''~')。
    • size:字體大小(12/16/24像素)。
    • mode:顯示模式(0非疊加,1疊加。疊加模式下保留背景,僅繪制字符像素)。

?2. 關鍵變量與初始化?

u8 temp, t1, t;
u16 y0 = y;  // 保存起始y坐標
u8 csize = (size/8 + ((size%8)?1:0)) * (size/2);  // 計算字符點陣數據占用的字節數
num = num - ' ';  // ASCII字庫偏移(字庫從空格開始存儲)
  • ?**csize 計算邏輯?:
    字體點陣通常按
    行存儲**,每行像素用1字節表示(每bit代表1像素)。例如:

    • ?12像素字體?:每行12像素 → 占用2字節(12/8=1.5 → 向上取整為2字節)。
    • 總字節數 = (行字節數) * (行數) = (size/8 + 余數處理) * (size/2)
  • ?**num 偏移**?:
    字庫數組(如 asc2_1206)從空格字符(ASCII 32)開始存儲,減去 ' ' 得到正確的索引。


?3. 字符點陣數據獲取?

for(t=0; t<csize; t++) {if(size==12) temp = asc2_1206[num][t];      // 12像素字體else if(size==16) temp = asc2_1608[num][t]; // 16像素字體else if(size==24) temp = asc2_2412[num][t]; // 24像素字體else return;                                // 不支持的字體大小
  • ?字庫結構?:
    字庫為二維數組(如 asc2_1206[字符數][點陣字節數]),每個字符的點陣數據按行排列。
  • ?示例?:
    若顯示字符 'A'(ASCII 65),則 num = 65 - 32 = 33,從字庫中獲取第33個字符的點陣。

?4. 逐像素繪制字符?

for(t1=0; t1<8; t1++) {if(temp & 0x80) LCD_Fast_DrawPoint(x, y, POINT_COLOR);  // 當前bit=1,繪制字符顏色else if(mode==0) LCD_Fast_DrawPoint(x, y, BACK_COLOR);  // 非疊加模式,繪制背景色temp <<= 1;  // 左移檢查下一bity++;         // 移動到下一行像素if(y >= lcddev.height) return;  // 超出屏幕高度if((y - y0) == size) {         // 完成一列繪制y = y0;  // y坐標復位x++;     // 移動到下一列if(x >= lcddev.width) return;  // 超出屏幕寬度break;}
}
  • ?像素繪制邏輯?:
    1. ?檢查最高位(temp & 0x80)??:
      • 若為1,調用 LCD_Fast_DrawPoint 繪制字符顏色(POINT_COLOR)。
      • 若為0且 mode=0,繪制背景色(BACK_COLOR,覆蓋原有內容)。
    2. ?坐標更新?:
      • 每處理1bit,y++ 向下移動一行像素。
      • y - y0 == size 時,表示一列像素繪制完成,復位 y 并右移一列(x++)。

?5. 邊界檢查與優化?

  • ?屏幕邊界處理?:
    每次更新坐標后檢查 xy 是否超出屏幕尺寸(lcddev.width/height),避免越界。
  • ?性能優化?:
    LCD_Fast_DrawPoint 應為優化后的快速畫點函數(可能直接操作FSMC或顯存)。

?6. 字庫與硬件交互?

  • ?字庫存儲?:
    字庫數組(如 asc2_1206)通常存儲在代碼區(Flash)或外部SPI Flash,通過查表獲取點陣。
  • ?LCD寫入?:
    LCD_Fast_DrawPoint 內部通過FSMC或GPIO模擬8080接口,向LCD顯存寫入像素顏色值。

?總結:字符顯示流程?

  1. ?參數校驗? → 2. ?計算字模數據位置? → 3. ?逐字節讀取點陣? →
  2. ?逐bit繪制像素? → 5. ?坐標更新與邊界檢查? → 6. ?循環直至字符繪制完成

此函數通過硬件加速的像素操作高效的字模解析,實現了靈活的字符顯示功能。如需顯示中文或自定義圖形,需擴展字庫和繪制邏輯。

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

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

相關文章

SQL性能調優

MySQL出現性能差的原因有哪些? 可能是 SOL查詢使用了全表掃描&#xff0c;也可能是查詢語句過于復雜&#xff0c;如多表 IOIN 或嵌套子查詢。 也有可能是單表數據量過大。 通常情況下&#xff0c;添加索引就能解決大部分性能問題。對于一些熱點數據&#xff0c;還可以通過增加…

dapo:開源大規模llm強化學習系統的突破與實現

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; ? 1. dapo概述&#xff1a;開源llm強化學習系統的重要突破 dapo&…

【車載開發系列】ParaSoft集成測試環境配置(五)

【車載開發系列】ParaSoft集成測試環境配置(五) 【車載開發系列】ParaSoft集成測試環境配置(五) 【車載開發系列】ParaSoft集成測試環境配置(五) 一. 剝離硬件環境的設置 二. 靈活使用編譯開關 三. 導入修改后的bdf文件 四. 自動生成底層樁函數 五. 開始跑集成測試用例 六…

大模型(一)什么是 MCP?如何使用 Charry Studio 集成 MCP?

目錄一、什么是 MCP&#xff1f;1.1 &#x1f914; 開始之前的思考1.2 MCP 的定義1.3 MCP 結構二、MCP 的使用2.1 uv 的安裝2.2 MCP 廣場2.3 MCP 的配置2.4 MCP 的依賴安裝2.5 Charry Studio2.6 測試結果背景&#xff1a; MCP 這個概念大概是 2025 年上半年火起來的&#xff0c…

源碼導航頁

一、Python捕捉動作發送到Unity驅動模型跟著動&#xff08;獲取源碼&#xff09; 二、AI輸入法源碼&#xff08;獲取源碼&#xff09; 三、Java企業級后臺管理系統-登錄授權角色菜單&#xff08;獲取源碼&#xff09; 四、Jetson實現純視覺導航&#xff08;獲取源碼&#xff09…

HTTP/2 性能提升的核心原因

一、協議架構優化??二進制分幀&#xff08;Binary Framing&#xff09;?HTTP/2 將傳統文本格式的報文&#xff08;如請求頭、數據體&#xff09;拆分為獨立的二進制幀&#xff08;Frame&#xff09;&#xff0c;每個幀包含流標識符&#xff08;Stream ID&#xff09;&#x…

vulnhub-billu_b0x靶機滲透

一、靶場詳情 Billu_b0x 是 Vulnhub 上的經典中等難度靶機&#xff0c;主要考察從信息收集到提權的完整滲透流程&#xff1a;先通過端口和目錄掃描發現網站入口&#xff0c;利用 SQL 注入或文件包含進入后臺并上傳 WebShell&#xff0c;再通過反彈 Shell 獲取低權限用戶&#…

C# 相機內存復用(減少圖像采集耗時)以及行數復用

背景我們在做圖像處理時&#xff0c;都會對一些相機的SDK進行開發完成圖像采集的操作&#xff0c;為后續圖像處理做準備。本文主要的目的是降低圖像采集的耗時&#xff0c;應用在一些高速檢測的場景下。利用循環隊列內存復用的方式&#xff0c;去掉或者減少新建內存的時間。線掃…

MTK Linux DRM分析(十三)- Mediatek KMS實現mtk_drm_drv.c(Part.1)

一、簡介 MediaTek (MTK) 的DRM驅動(基于mtk_drm_drv.c)是為MediaTek SoC(如MT6985、MT6895等)設計的顯示子系統(Display Subsystem)驅動程序。它實現了Linux DRM/KMS框架,支持多CRTC、多平面(plane)、連接器(connector)和編碼器(encoder)的顯示管道。驅動處理硬…

Wireshark筆記-DHCP流程與數據包解析

背景DHCP從大學上網絡課時就開始知道了&#xff0c;當時只知道&#xff0c;能讓計算機上網&#xff0c;要不就靜態配IP&#xff0c;要不就DHCP獲取&#xff0c;就能上網。2021年時&#xff0c;畢業好幾年了&#xff0c;想學習下網絡知識&#xff0c;就準備考一個軟考網工。按要…

Coze用戶賬號設置修改用戶頭像-前端源碼

概述 Coze Studio的用戶頭像修改功能是用戶賬號設置中的重要組成部分&#xff0c;允許用戶上傳和更新個人頭像。本文將深入分析該功能的前端實現&#xff0c;包括組件架構、文件上傳處理、API設計和用戶體驗優化等方面。 技術架構 整體架構設計 Coze Studio采用現代化的前端架構…

新手Github提交PR(Pull requests)詳細教程

一、什么是Pull requests&#xff1f; Pull Requests&#xff08;PR&#xff09;是代碼協作平臺&#xff08;如 GitHub、GitLab 等&#xff09;中的一種功能&#xff0c;用于提議將某分支的代碼變更合并到另一個分支&#xff08;通常是主分支&#xff09;。它允許開發者在合并…

本地通過跳板機連接無公網IP的內網服務器

本地環境&#xff1a;SSH client 堡壘機&#xff1a;有公網IP&#xff0c;有連接內網服務器的秘鑰 SSH配置&#xff1a; Host jmsHostName [堡壘機的公網IP]Port 22User rootIdentityFile ~/.ssh/id_rsaHost appHostName 10.0.0.14Port 22User rootIdentityFile ~/.ssh/svc-p…

B樹,B+樹,B*樹

下面我們來詳細講解一下 B樹、B樹、B*樹 這三種非常重要的多路平衡查找樹。它們在數據庫和文件系統中有著極其廣泛的應用。一、為什么需要這些樹結構&#xff1f;在開始之前&#xff0c;我們先思考一個問題&#xff1a;為什么已經有了二叉搜索樹&#xff08;BST&#xff09;、A…

汽車零部件工廠ESOP系統工業一體機如何選型

在汽車零部件工廠的生產管理中&#xff0c;ESOP 系統發揮著至關重要的作用。而工業一體機作為 ESOP 系統的關鍵硬件支撐&#xff0c;其選型的合理性直接關系到生產效率的提升、生產過程的精準控制以及生產數據的可靠采集與分析。因此&#xff0c;為汽車零部件工廠選擇一款適合的…

?維基框架 (Wiki Framework) 1.1.0 版本發布? 提供多模型AI輔助開發

介紹 多模型AI輔助開發? 維基框架1.1.0集成了主流AI引擎的統一接口&#xff0c;支持開發者按需調用不同模型的優勢能力&#xff1a; ?DeepSeek?&#xff1a;專注代碼生成與重構&#xff0c;擅長復雜業務邏輯實現 ?ChatGPT?&#xff1a;多模態推理能力&#xff0c;適用于…

LabVIEW調用MATLAB 的分形生成

LabVIEW 調用 MATLAB&#xff0c;可借前者可視化流程與硬件交互優勢&#xff0c;結合后者強數值計算、算法能力&#xff0c;復用成熟算法提速開發&#xff0c;還能靈活改代碼。但需匹配版本、裝運行環境&#xff0c;數據傳遞有性能損耗&#xff0c;腳本出錯需跨軟件調試。?優點…

ubuntu20.04開發ros2,使用docker安裝部署的詳細教程

學習docker的教程&#xff1a;可以直接在菜鳥教程上學習即可階段 0&#xff1a;系統檢查| 內容 | 建議 | |------|------| | 操作系統 | Ubuntu 22.04&#xff08;與 ROS2 Humble 最匹配&#xff09; | | 用戶權限 | 能執行 sudo |&#x1f9e9; 階段 1&#xff1a;在 Ubuntu 上…

SQL Server縮小日志文件.ldf的方法(適用于開發環境)

SQL Server縮小日志文件.ldf的方法&#xff08;適用于開發環境&#xff09; 核心概念&#xff1a;為什么日志文件會變大&#xff1f; 首先&#xff0c;理解原因至關重要。事務日志文件在以下情況下會增長&#xff1a; 大量操作&#xff1a;執行了大批量插入、更新或刪除操作&am…

2.3零基礎玩轉uni-app輪播圖:從入門到精通 (咸蝦米總結)

還在uni-app中的輪播圖組件頭疼嗎&#xff1f;看完這篇&#xff0c;讓你輕松掌握swiper的所有秘密&#xff01;輪播圖的重要性 在現代移動應用開發中&#xff0c;輪播圖&#xff08;Swiper&#xff09;已成為展示焦點內容、廣告推廣和產品展示的首選組件。無論是電商平臺的商品…