1、LCD顯示驅(qū)動概述
在上一章節(jié)GPIO中斷的學(xué)習(xí)中,我們通過LCD液晶來顯示中斷的發(fā)生次數(shù),很直觀的知道了程序的運行情況,但這也只是LCD的一個小應(yīng)用。在以后的學(xué)習(xí)和開發(fā)中,LCD作為顯示單元,會愈發(fā)顯示出它的重要性。那么接下來就開始介紹ME32F030的LCD驅(qū)動。學(xué)習(xí)前先對其做個簡單的概述。
ME32F030的LCD 顯示驅(qū)動通過自動地創(chuàng)建交流段和公共電壓信號來直接驅(qū)動 LCD。它可以支持靜態(tài),1/2,1/3,1/4,1/5 和 1/6 占空比 的 LCD 面板。.最多可以支持 6 個公共電壓端和 16 個段組合(共計 96)的 LCD 顯示面板。
主要特征有:
? 多達(dá) 96 個點(6x16)
? 可配置公共電壓信號(Common) 0-5
? 可配置段電壓信號(Segment) 0-16
? 支持靜態(tài),1/2 偏壓和 1/3 偏壓電壓
? 六種顯示模式:靜態(tài),1/2 占空比,1/3 占空比,1/4 占空比,1/5 占空比或 1/6 占空比
? 可配置的幀頻率
? 在數(shù)字模式下,支持 8 個 7 段 LED
其對應(yīng)的復(fù)用管腳映射圖如下:
圖1 LCD寄存器0
2、LCD驅(qū)動寄存器
液晶顯示的驅(qū)動還是比較饒的,因此肯定會有專門的LCD驅(qū)動寄存器,來輔助完成LCD液晶的驅(qū)動工作。ME32F030的LCD液晶驅(qū)動寄存器總覽如圖所示:
圖2 LCD寄存器0
2-1 LCD控制寄存器0
查看LCD控制寄存器的列表,獲知LCD驅(qū)動是支持 LCD 輸出和 LED 輸出兩種工作模式的。因此要根據(jù)自己的實際情況使能相應(yīng)的功能。這里需要注意的是,在 LED 模式下,LEDINV位決定著共陰極/共陽極顯示,一定要根據(jù)實際電路進(jìn)行選擇。
圖3 LCD寄存器0
2-2 LCD控制寄存器1
在使能了相應(yīng)的驅(qū)動工作方式后,就需要對控制模式以及輸出參數(shù)進(jìn)行設(shè)置。有LCD顯示占空比選擇、偏壓選擇、掃描周期頻率需要配置。
圖4 LCD控制寄存器1
2-3 數(shù)據(jù)映射寄存器
需要讓LCD顯示期望的數(shù)據(jù)時,只要向數(shù)據(jù)映射寄存器0~3寫入相應(yīng)的值即可。隨后就會按預(yù)先設(shè)定自動輸出到相應(yīng)的 LCD 管腳上。
2-4 LCD驅(qū)動使能控制器0
該寄存器決定著LCD COM0~5的輸出控制,相應(yīng)的BIT位置1來使能對應(yīng)的COM。
圖5 LCD使能寄存器0
2-5 LCD驅(qū)動使能控制器1
該寄存器決定著LCD Segment0~16的輸出控制,相應(yīng)的BIT位置1來使能對應(yīng)的 Segment。
圖6 LCD使能寄存器1
3、LCD驅(qū)動函數(shù)
在例程LIB->common->Drivers->Source文件夾內(nèi)有l(wèi)cd.c文件,這個就是提供的LCD驅(qū)動文件,里面包含了一些基本的驅(qū)動函數(shù),使用起來十分方便。下面會對每個函數(shù)進(jìn)行講解。
3-1 LCD初始化
在每段源代碼的后面,筆者對其進(jìn)行一下注釋,方便大家快速掌握和使用這個函數(shù)。這個函數(shù)的4個參數(shù)的意義如下:
Mode:LCD的輸出模式,可選LCD_MODE、LED_MODE。
Duty:顯示占空比,可選DUTY_1 ~ DUTY_8.
Biasanod:LCD輸出模式下代表偏置電壓,可選LCD_BIAS_3(1/3偏壓)、LCD_BIAS_2(1/2偏壓)。LED輸出模式下代表共正極/共負(fù)極選擇。
Finhz:COM掃描周期頻率,手冊推薦80-100Hz。
voidLCD_Init(uint8_tmode,uint8_tduty,uint8_tbiasanode,uint8_tfinhz) { SYSCON->SYSAHBCLKCTRL_b.LCD_CLK=1;//LCD時鐘使能 SYSCON->PRESETCTRL_b.LCD_RST_N=0;//LCD復(fù)位操作 SYSCON->PRESETCTRL_b.LCD_RST_N=1; //disableoutput LCD->LCDOUTEN0=0;//LCDCOM口初始化(禁止輸出) LCD->LCDOUTEN1=0;//LCDSEG口初始化(禁止輸出) //setduty LCD->LCDCTRL1_b.DUTY=duty;//LCD顯示占空比 if((finhz>0) (duty>0)) LCD->LCDCTRL1_b.FREQDIV=SystemCoreClock/(duty*finhz);//LCDCOM掃描周期頻率 if(mode==LCD_MODE) { SYSCON->PDRUNCFG_b.LCD_PD=0;//LCD電壓發(fā)生器上電 LCD->LCDCTRL1_b.BIAS=biasanode;//偏置電壓選擇 LCD->LCDCTRL0_b.LCDEN=1;//選擇為LCD輸出模式 LCD->LCDCTRL0_b.LEDEN=0; } elseif(mode==LED_MODE) { SYSCON->PDRUNCFG_b.LCD_PD=1;//LCD電壓發(fā)生器掉電 LCD->LCDCTRL0_b.LEDINV=biasanode;//LED共正極/共負(fù)極選擇 LCD->LCDCTRL0_b.LEDEN=1;//選擇為LED輸出模式 LCD->LCDCTRL0_b.LCDEN=0; } return; }
3-2 LCD輸出使能
這段函數(shù)控制著LCD的COM端口和SEGMEN端口的輸出使能,可以根據(jù)實際需求來進(jìn)行配置。比如開發(fā)板使用了COM0~COM3,SEG0~SEG7。因此comchannel參數(shù)的低4位都是置1的,即輸入?yún)?shù)應(yīng)該為0xF。同理,segchannel的低8位都是置1的,即輸入?yún)?shù)應(yīng)該為0xFF。
voidLCD_EnableOutput(uint8_tcomchannel,uint16_tsegchannel) { LCD->LCDOUTEN0_b.LCDCOMEN=comchannel; LCD->LCDOUTEN1_b.LCDSEGEN=segchannel; return; }
3-3 LCD功能關(guān)閉
這段函數(shù)的作用是關(guān)閉LCD外設(shè)功能,通過LCD電壓發(fā)生器,并且關(guān)閉其時鐘。
voidLCD_Deinit(void) { SYSCON->PDRUNCFG_b.LCD_PD=1;//LCD電壓發(fā)生器掉電 SYSCON->SYSAHBCLKCTRL_b.LCD_CLK=0;//LCD時鐘關(guān)閉 return; }
3-4 LCD全顯
這段函數(shù)的功能是數(shù)據(jù)映射寄存器全部置位,從而全部顯示。
voidLCD_LightFullScreen(void) { LCD->MEMMAP0=0xFFFFFFFF; LCD->MEMMAP1=0xFFFFFFFF; LCD->MEMMAP2=0xFFFFFFFF; LCD->MEMMAP3=0xFFFFFFFF; return; }
3-5 LCD清屏
這段函數(shù)的功能是數(shù)據(jù)映射寄存器全部清0,從而快速清屏。
voidLCD_ClearScreen(void) { LCD->MEMMAP0=0; LCD->MEMMAP1=0; LCD->MEMMAP2=0; LCD->MEMMAP3=0; return; }
4、端口中斷例程
介紹完LCD常用的驅(qū)動函數(shù),接下來用個小例程來演示LCD的驅(qū)動。測試程序的代碼如下:
voidlcd_PortInit(void) { //initialLCDpin PB_2_INIT(PB_2_LCD_COM0);//LCD_COM0:PB_2 PB_10_INIT(PB_10_LCD_COM1);//LCD_COM1:PB_10 PB_11_INIT(PB_11_LCD_COM2);//LCD_COM2:PB_11 PB_6_INIT(PB_6_LCD_COM3);//LCD_COM3:PB_6 PB_12_INIT(PB_12_LCD_SEG0);//LCD_SEG0:PB_12 PB_13_INIT(PB_13_LCD_SEG1);//LCD_SEG1:PB_13 PB_14_INIT(PB_14_LCD_SEG2);//LCD_SEG2:PB_14 PB_15_INIT(PB_15_LCD_SEG3);//LCD_SEG3:PB_15 PA_8_INIT(PA_8_LCD_SEG4);//LCD_SEG4:PA_8 PA_9_INIT(PA_9_LCD_SEG5);//LCD_SEG5:PA_9 PA_10_INIT(PA_10_LCD_SEG6);//LCD_SEG6:PA_10 PA_11_INIT(PA_11_LCD_SEG7);//LCD_SEG7:PA_11 } intmain(void) { uint32_tnumber=0; uint32_tlcd[10]={0xD07,0x500,0xB05,0xF01,0x702,0xE03,0xE07,0x501,0xF07,0x703};//0~9LCD真值表 lcd_PortInit();//LCD端口初始化 LCD_Init(LCD_MODE,DUTY_4,LCD_BIAS_3,100);//LCD驅(qū)動初始化 LCD_EnableOutput(0xF,0xFF);//使能LCD輸出 while(1) { LCD->MEMMAP0=(lcd[number]<<16)|lcd[number]; LCD->MEMMAP1=(lcd[number]<<16)|lcd[number]; if?(number++==11) number=0; SYS_DelaymS(1000); } }
程序第一步先執(zhí)行l(wèi)cd_PortInit函數(shù)來復(fù)用LCD端口。端口復(fù)用完成后就是LCD_Init函數(shù),這個在前面講解過。我們選擇的是LCD輸出模式,1/4占空比輸出,1/3偏壓,100Hz的COM刷新率。完成初始化的配置后,就可以使能LCD的輸出了。
測試用的顯示程序是讓液晶在0~9之間不停的循環(huán)顯示。效果圖如下:
全0顯示:
圖7 LCD顯示全0
全9顯示:
圖8 LCD顯示全9
來源:敏矽MCU
-
mcu
+關(guān)注
關(guān)注
146文章
17985瀏覽量
367353 -
lcd
+關(guān)注
關(guān)注
34文章
4520瀏覽量
171671 -
液晶
+關(guān)注
關(guān)注
6文章
621瀏覽量
70386 -
Cortex-M0
+關(guān)注
關(guān)注
4文章
126瀏覽量
39533
發(fā)布評論請先 登錄
MCU學(xué)習(xí)筆記_ARM Cortex M0_簡介

基于ARM Cortex-M0核的MCU設(shè)計及應(yīng)用

全球最強(qiáng)性能Cortex-M0 MCU誕生!
敏矽微電子Cortex-M0學(xué)習(xí)筆記03——時鐘系統(tǒng)設(shè)計例程

敏矽微電子Cortex-M0學(xué)習(xí)筆記02——Cortex-M0開發(fā)環(huán)境的建立及調(diào)試

評論