最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

基于ARM的LCD顯示(附硬件電路和源碼)

出處: 電子工程專輯 發(fā)布于:2019-08-02 14:17:14

  1.項目介紹
  不管是LED數(shù)碼管,還是段碼式LCD液晶顯示屏,在顯示上都是由各個段位組合顯示成我們想要的字符的。本項目中采用的是4位段碼式LCD顯示屏,每一位由A~G共7個段位組成,另外還有P1~P4共4個點段位。為了實現(xiàn)在顯示程序上的可移植性和通用性,本項目通過數(shù)據(jù)結(jié)構(gòu)的設(shè)計形式結(jié)合驅(qū)動LCD顯示芯片內(nèi)部RAM的操作方法,給出一種既適合LED數(shù)碼管,也適合段碼式LCD液晶顯示屏的程序設(shè)計方法。
  2.開發(fā)環(huán)境
  軟件開發(fā)環(huán)境:Keil MDK 5.25,HC32005_SDK
  硬件設(shè)計軟件:立創(chuàng)EDA
  3.硬件設(shè)計


  3.1.原理圖設(shè)計
  硬件設(shè)計上使用了華大的Cortex-M0+內(nèi)核的HC32F005C6PA作為主控芯片,整個系統(tǒng)電壓工作在3.3V~5V之間,簡單的電源設(shè)計和復(fù)位電路,使用內(nèi)部24MHz晶振,通用的SWD在線調(diào)試和接口,在硬件外圍電路上省了不少的空間。4個用戶自定義按鍵、2個串口全部引出,一個連接SP232芯片進行RS-232通訊,另一個直接引出TTL作調(diào)試監(jiān)控用、還有一個4位的LCD段碼式液晶屏,使用TM1621驅(qū)動芯片,作為顯示接口。
  3.2.PCB設(shè)計


  3.3.焊接調(diào)試

 

 


  3.4.華大MCU初次使用,調(diào)試體會


  所有的芯片,我都喜歡從新建工程開始研究,華大的MCU也不例外,也給出了MCU開發(fā)工具用戶手冊,可以對照手冊一步一步的新建工程。但是讓我困惑的件事是我調(diào)用delay函數(shù)進行GPIO口翻轉(zhuǎn)的實驗與給的DEMO例程實際的效果不一樣,很明顯是我的代碼有問題,GPIO口通過示波器測出來的速度明顯快相當(dāng)多,因為次用,真是無從下手,一步步的從startup_hc32f005.s文件分析起,后來看到system_hc32f005.c,發(fā)現(xiàn)KEIL創(chuàng)建自動生成的這兩個文件和的DEMO例程不一樣,也是因為system_hc32f005.c文件中的一些初始化和調(diào)用導(dǎo)致了我芯片啟動后時鐘配置不正確,導(dǎo)致了GPIO口翻轉(zhuǎn)過快的問題。后面也是因為這邊的兩個文件其它部分的不一致導(dǎo)致了串口異常的問題,所以個人建議是:如果你要自建工程,還是用DEMO中的startup_hc32f005.s、system_hc32f005.c和system_hc32f005.h這3個文件覆蓋KEIL自動生成的這幾個文件。第2個需要注意的地方就是如果你要使用定時器、串口功能模塊之前,一定要開啟相應(yīng)模塊對應(yīng)的時鐘,這個大家都清楚;但別忘了,華大的MCU還需要配置PCLK等一些初始化操作,具體一可以參考代碼board.c文件中的BSP_InitSysClock函數(shù)。第3個就是串口模式的選擇和波特率的設(shè)定,這個跟其它的MCU,比如說ST之類的,有點不太一樣,具體一可以把這一塊的用戶手冊看一下,有助于加深理解,我也是想當(dāng)然跳了不少坑……
  當(dāng)然華大半導(dǎo)體作為國產(chǎn)芯片,個人感覺還是不錯的,通過這一個項目的前期調(diào)試,耐下心來,一兩天就能上手了;性價比也是相當(dāng)?shù)母撸档猛扑]!
  4.程序設(shè)計
  4.1.TM1621驅(qū)動設(shè)計
  TM1621芯片內(nèi)部帶有靜態(tài)顯示內(nèi)存(RAM),RAM以32*4位格式存儲所顯示的數(shù)據(jù)。RAM的數(shù)據(jù)直接映像到LCD驅(qū)動器,也就是說可以通過修改RAM的數(shù)據(jù)內(nèi)容,來修改液晶屏顯示的內(nèi)容。對應(yīng)的COM和SEG所對應(yīng)的RAM映像圖可以參考TM1621的數(shù)據(jù)手冊。對于TM1621我們有4個基礎(chǔ)的主要函數(shù),分別如下所述:
  4.1.1.void TM1621_Write(uint16_t value, uint8_t length),這是TM1621層的函數(shù), 是將value這個數(shù)據(jù)的高length個bit位寫入到TM1621芯片內(nèi)部,例如:
  TM1621_Write(0x8020/*0b 1000 0000 0010 0000*/, 0x0C); // SYS_EN,將0x8020這個數(shù)值的高12位寫入到TM1621芯片
  4.1.2.void TM1621_UpdateRAM(void),更新TM1621顯示RAM,將全局數(shù)組暫存儲的RAM數(shù)據(jù)統(tǒng)一性的更新到TM1621芯片內(nèi),使用的是TM1621的WRITE命令,命令概述詳見TM1621數(shù)據(jù)手冊。
  4.1.3.void TM1621_ModifyRAM(uint8_t index, uint8_t bit, uint8_t flag),修改TM1621顯示RAM,根據(jù)數(shù)據(jù)結(jié)構(gòu)及算法確認修改的TM1621顯示RAM的下標和位下標,flag是置位和清除的操作標志。統(tǒng)一修改完成后,需要調(diào)用TM1621_UpdateRAM函數(shù)更新TM1621的顯示RAM,更新液晶屏顯示。
  4.1.4.void TM1621_Init(void),TM1621芯片初始化配置操作,詳見程序設(shè)計說明。
  4.2.顯示設(shè)計
  4.2.1.定義顯示字符和段位的映射表,如下代碼給出了38個常用的顯示字符:
  typedef struct
  {
  char    ch;            /*字符索引*/
  uint8_t segment[8];    /*字符對應(yīng)的段編碼*/
  } DIGITRON_STRUCT;
  const DIGITRON_STRUCT DIGITRON_TABLE[38] =
  {
  {' ', {0, 0, 0, 0, 0, 0, 0, 0}},
  {'0', {1, 1, 1, 1, 1, 1, 0, 0}},
  {'1', {0, 1, 1, 0, 0, 0, 0, 0}},
  {'2', {1, 1, 0, 1, 1, 0, 1, 0}},
  {'3', {1, 1, 1, 1, 0, 0, 1, 0}},
  {'4', {0, 1, 1, 0, 0, 1, 1, 0}},
  {'5', {1, 0, 1, 1, 0, 1, 1, 0}},
  {'6', {1, 0, 1, 1, 1, 1, 1, 0}},
  {'7', {1, 1, 1, 0, 0, 0, 0, 0}},
  {'8', {1, 1, 1, 1, 1, 1, 1, 0}},
  {'9', {1, 1, 1, 1, 0, 1, 1, 0}},
  {'A', {1, 1, 1, 0, 1, 1, 1, 0}},
  {'b', {0, 0, 1, 1, 1, 1, 1, 0}},
  {'c', {0, 0, 0, 1, 1, 0, 1, 0}},
  {'C', {1, 0, 0, 1, 1, 1, 0, 0}},
  {'d', {0, 1, 1, 1, 1, 0, 1, 0}},
  {'E', {1, 0, 0, 1, 1, 1, 1, 0}},
  {'F', {1, 0, 0, 0, 1, 1, 1, 0}},
  {'g', {1, 1, 1, 1, 0, 1, 1, 0}},
  {'H', {0, 1, 1, 0, 1, 1, 1, 0}},
  {'h', {0, 0, 1, 0, 1, 1, 1, 0}},
  {'i', {0, 0, 1, 0, 0, 0, 0, 0}},
  {'I', {0, 0, 0, 0, 1, 1, 0, 0}},
  {'J', {0, 1, 1, 1, 1, 0, 0, 0}},
  {'l', {0, 0, 0, 0, 1, 1, 0, 0}},
  {'L', {0, 0, 0, 1, 1, 1, 0, 0}},
  {'n', {0, 0, 1, 0, 1, 0, 1, 0}},
  {'o', {0, 0, 1, 1, 1, 0, 1, 0}},
  {'O', {1, 1, 1, 1, 1, 1, 0, 0}},
  {'P', {1, 1, 0, 0, 1, 1, 1, 0}},
  {'q', {1, 1, 1, 0, 0, 1, 1, 0}},
  {'r', {0, 0, 0, 0, 1, 0, 1, 0}},
  {'S', {1, 0, 1, 1, 0, 1, 1, 0}},
  {'t', {0, 0, 0, 1, 1, 1, 1, 0}},
  {'u', {0, 0, 1, 1, 1, 0, 0, 0}},
  {'U', {0, 1, 1, 1, 1, 1, 0, 0}},
  {'y', {0, 1, 1, 1, 0, 1, 1, 0}},
  {'-', {0, 0, 0, 0, 0, 0, 1, 0}},
  };
  4.2.2.定義段位的組成關(guān)系,如下給出了顯示一位字符所需要的一個段組合,這些定義可以參照段碼式LCD液晶屏的PIN引腳關(guān)系定義:
  const char DISPLAY_DIGIT_TABLE[4][7][3] =
  {
  {"1A", "1B", "1C", "1D", "1E", "1F", "1G"},
  {"2A", "2B", "2C", "2D", "2E", "2F", "2G"},
  {"3A", "3B", "3C", "3D", "3E", "3F", "3G"},
  {"4A", "4B", "4C", "4D", "4E", "4F", "4G"},
  };
  const char DISPLAY_POINT_TABLE[4][3] =
  {
  "P1", "P2", "P3", "P4"
  };
  直白了說,就是我要在位上顯示一個‘8’這個字符,那這個字符肯定是由"1A", "1B", "1C", "1D", "1E", "1F", "1G"這7個段位組合顯示而成的。
  4.2.3.定義段碼式LCD液晶屏PIN引腳關(guān)系與TM1621驅(qū)動芯片顯示RAM的對應(yīng)關(guān)系表,如下代碼所示:
  const char LCD_CS_TABLE[4][32][3] =
  {
  {"1F","1A","2F","2A","3F","3A","4F","4A","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  "},
  {"1G","1B","2G","2B","3G","3B","4G","4B","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  "},
  {"1E","1C","2E","2C","3E","3C","4E","4C","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  "},
  {"P1","1D","P2","2D","P3","3D","P4","4D","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  ","  "},
  };
  這個數(shù)組的每一行對應(yīng)著一個COM,每一列對應(yīng)著一個SEG,這樣一個數(shù)據(jù)就直接映射成TM1621顯示RAM中的每一個BIT位;但需要注意的是,這個數(shù)據(jù)是需要根據(jù)原理圖的COM和SEG引腳的設(shè)計而定的;本項目在硬件設(shè)計上段碼式LCD液晶的COM0~COM3分別對應(yīng)的也是TM1621驅(qū)動芯片的COM0~COM3,所以在行的對應(yīng)關(guān)系上與段碼式LCD液晶屏PIN引腳關(guān)系保持一致,如果順序不一致,那在數(shù)組的行順序要也要做相應(yīng)的對應(yīng)排序;SEG段的數(shù)組對應(yīng)關(guān)系設(shè)計和COM段的思想是一樣的。
  4.2.4.void DISPLAY_SearchCS(const char *str, uint8_t *com, uint8_t *seg),這是關(guān)鍵的一個函數(shù),結(jié)合硬件電路設(shè)計,查找某個顯示字符對應(yīng)的每一個段編碼在TM1621顯示RAM的下標和位下標。
  4.2.5.void DISPLAY_Digit(uint8_t index, char ch, uint8_t blink, uint8_t flag),這是位顯示函數(shù),index是位下標,ch是需要顯示字符,blink是閃爍標志,flag是刷新標志;通過這個函數(shù),我們可以調(diào)用DISPLAY_Digit(0, '8', 0, 1);在個位置上顯一個不閃爍的8字。
  5.程序移植性和通用性
  在相同硬件驅(qū)動的情況下,對應(yīng)不同設(shè)計的段碼式LCD,我們只需要根據(jù)段碼式LCD液晶屏PIN引腳關(guān)系,再結(jié)合硬件原理圖電路設(shè)計,修改LCD_CS_TABLE數(shù)組即可實現(xiàn)如上顯示功能。
  有人說,我驅(qū)動LED數(shù)碼寫沒有用驅(qū)動芯片,那怎么辦呢?只是用了一個74HC595,或者是單片機引腳直接控制的,怎么辦呢?對于這種情況,我們的數(shù)據(jù)結(jié)構(gòu)和程序設(shè)計思想是一樣的,我們可以定義一個顯示緩存,在顯示的時候,將這個顯示緩存通過定時器的方式不斷的進行刷新到LED數(shù)碼管,進行顯示;當(dāng)然這邊不需要TM1621驅(qū)動程序了,應(yīng)該替換成驅(qū)動數(shù)碼管顯示的驅(qū)動程序。

關(guān)鍵詞:ARM

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://udpf.com.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

聯(lián)發(fā)科開發(fā)高性能CPU的SoC,進軍Windows On Arm生態(tài)系統(tǒng)?#世界互聯(lián)網(wǎng)大會
廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!