1.項目介紹
不管是LED數碼管,還是段碼式LCD液晶顯示屏,在顯示上都是由各個段位組合顯示成我們想要的字符的。本項目中采用的是4位段碼式LCD顯示屏,每一位由A~G共7個段位組成,另外還有P1~P4共4個點段位。為了實現在顯示程序上的可移植性和通用性,本項目通過數據結構的設計形式結合驅動LCD顯示芯片內部RAM的操作方法,給出一種既適合LED數碼管,也適合段碼式LCD液晶顯示屏的程序設計方法。
2.開發環境
軟件開發環境:Keil MDK 5.25,HC32005_SDK
硬件設計軟件:立創EDA
3.硬件設計
3.1.原理圖設計
硬件設計上使用了華大的Cortex-M0+內核的HC32F005C6PA作為主控芯片,整個系統電壓工作在3.3V~5V之間,簡單的電源設計和復位電路,使用內部24MHz晶振,通用的SWD在線調試和下載接口,在硬件外圍電路上省了不少的空間。4個用戶自定義按鍵、2個串口全部引出,一個連接SP232芯片進行RS-232通訊,另一個直接引出TTL作調試監控用、還有一個4位的LCD段碼式液晶屏,使用TM1621驅動芯片,作為顯示接口。
3.2.PCB設計
3.3.焊接調試
3.4.華大MCU初次使用,調試體會
4.程序設計
4.1.TM1621驅動設計
TM1621芯片內部帶有靜態顯示內存(RAM),RAM以32*4位格式存儲所顯示的數據。RAM的數據直接映像到LCD驅動器,也就是說可以通過修改RAM的數據內容,來修改液晶屏顯示的內容。對應的COM和SEG所對應的RAM映像圖可以參考TM1621的數據手冊。對于TM1621我們有4個基礎的主要函數,分別如下所述:
4.1.1.void TM1621_Write(uint16_t value, uint8_t length),這是TM1621最底層的函數, 是將value這個數據的高length個bit位寫入到TM1621芯片內部,例如:
TM1621_Write(0x8020/*0b 1000 0000 0010 0000*/, 0x0C); // SYS_EN,將0x8020這個數值的高12位寫入到TM1621芯片
4.1.2.void TM1621_UpdateRAM(void),更新TM1621顯示RAM,將全局數組暫存儲的RAM數據統一一次性的更新到TM1621芯片內,使用的是TM1621的WRITE命令,命令概述詳見TM1621數據手冊。
4.1.3.void TM1621_ModifyRAM(uint8_t index, uint8_t bit, uint8_t flag),修改TM1621顯示RAM,根據數據結構及算法確認修改的TM1621顯示RAM的下標和位下標,flag是置位和清除的操作標志。統一修改完成后,需要調用TM1621_UpdateRAM函數更新TM1621的顯示RAM,更新液晶屏顯示。
4.1.4.void TM1621_Init(void),TM1621芯片初始化配置操作,詳見程序設計說明。
4.2.顯示設計
4.2.1.定義顯示字符和段位的映射表,如下代碼給出了38個常用的顯示字符:
typedef struct
{
char ch; /*字符索引*/
uint8_t segment[8]; /*字符對應的段編碼*/
} 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.定義段位的組成關系,如下給出了顯示一位字符所需要的一個段組合,這些定義可以參照段碼式LCD液晶屏的PIN引腳關系定義:
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引腳關系與TM1621驅動芯片顯示RAM的對應關系表,如下代碼所示:
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”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”,“ ”},
};
這個數組的每一行對應著一個COM,每一列對應著一個SEG,這樣一個數據就直接映射成TM1621顯示RAM中的每一個BIT位;但需要注意的是,這個數據是需要根據原理圖的COM和SEG引腳的設計而定的;本項目在硬件設計上段碼式LCD液晶的COM0~COM3分別對應的也是TM1621驅動芯片的COM0~COM3,所以在行的對應關系上與段碼式LCD液晶屏PIN引腳關系保持一致,如果順序不一致,那在數組的行順序要也要做相應的對應排序;SEG段的數組對應關系設計和COM段的思想是一樣的。
4.2.4.void DISPLAY_SearchCS(const char *str, uint8_t *com, uint8_t *seg),這是最關鍵的一個函數,結合硬件電路設計,查找某個顯示字符對應的每一個段編碼在TM1621顯示RAM的下標和位下標。
4.2.5.void DISPLAY_Digit(uint8_t index, char ch, uint8_t blink, uint8_t flag),這是位顯示函數,index是位下標,ch是需要顯示字符,blink是閃爍標志,flag是刷新標志;通過這個函數,我們可以調用DISPLAY_Digit(0, ‘8’, 0, 1);在第一個位置上顯一個不閃爍的8字。
5.程序移植性和通用性
在相同硬件驅動的情況下,對應不同設計的段碼式LCD,我們只需要根據段碼式LCD液晶屏PIN引腳關系,再結合硬件原理圖電路設計,修改LCD_CS_TABLE數組即可實現如上顯示功能。
-
lcd
+關注
關注
34文章
4437瀏覽量
167955 -
RAM
+關注
關注
8文章
1369瀏覽量
114823 -
液晶顯示屏
+關注
關注
1文章
208瀏覽量
27630
發布評論請先 登錄
相關推薦
評論