1、LCD顯示驅動概述
在上一章節GPIO中斷的學習中,我們通過LCD液晶來顯示中斷的發生次數,很直觀的知道了程序的運行情況,但這也只是LCD的一個小應用。在以后的學習和開發中,LCD作為顯示單元,會愈發顯示出它的重要性。那么接下來就開始介紹ME32F030的LCD驅動。學習前先對其做個簡單的概述。
ME32F030的LCD 顯示驅動通過自動地創建交流段和公共電壓信號來直接驅動 LCD。它可以支持靜態,1/2,1/3,1/4,1/5 和 1/6 占空比 的 LCD 面板。.最多可以支持 6 個公共電壓端和 16 個段組合(共計 96)的 LCD 顯示面板。
主要特征有:
? 多達 96 個點(6x16)
? 可配置公共電壓信號(Common) 0-5
? 可配置段電壓信號(Segment) 0-16
? 支持靜態,1/2 偏壓和 1/3 偏壓電壓
? 六種顯示模式:靜態,1/2 占空比,1/3 占空比,1/4 占空比,1/5 占空比或 1/6 占空比
? 可配置的幀頻率
? 在數字模式下,支持 8 個 7 段 LED
其對應的復用管腳映射圖如下:
圖1 LCD寄存器0
2、LCD驅動寄存器
液晶顯示的驅動還是比較饒的,因此肯定會有專門的LCD驅動寄存器,來輔助完成LCD液晶的驅動工作。ME32F030的LCD液晶驅動寄存器總覽如圖所示:
圖2 LCD寄存器0
2-1 LCD控制寄存器0
查看LCD控制寄存器的列表,獲知LCD驅動是支持 LCD 輸出和 LED 輸出兩種工作模式的。因此要根據自己的實際情況使能相應的功能。這里需要注意的是,在 LED 模式下,LEDINV位決定著共陰極/共陽極顯示,一定要根據實際電路進行選擇。
圖3 LCD寄存器0
2-2 LCD控制寄存器1
在使能了相應的驅動工作方式后,就需要對控制模式以及輸出參數進行設置。有LCD顯示占空比選擇、偏壓選擇、掃描周期頻率需要配置。
圖4 LCD控制寄存器1
2-3 數據映射寄存器
需要讓LCD顯示期望的數據時,只要向數據映射寄存器0~3寫入相應的值即可。隨后就會按預先設定自動輸出到相應的 LCD 管腳上。
2-4 LCD驅動使能控制器0
該寄存器決定著LCD COM0~5的輸出控制,相應的BIT位置1來使能對應的COM。
圖5 LCD使能寄存器0
2-5 LCD驅動使能控制器1
該寄存器決定著LCD Segment0~16的輸出控制,相應的BIT位置1來使能對應的 Segment。
圖6 LCD使能寄存器1
3、LCD驅動函數
在例程LIB->common->Drivers->Source文件夾內有lcd.c文件,這個就是提供的LCD驅動文件,里面包含了一些基本的驅動函數,使用起來十分方便。下面會對每個函數進行講解。
3-1 LCD初始化
在每段源代碼的后面,筆者對其進行一下注釋,方便大家快速掌握和使用這個函數。這個函數的4個參數的意義如下:
Mode:LCD的輸出模式,可選LCD_MODE、LED_MODE。
Duty:顯示占空比,可選DUTY_1 ~ DUTY_8.
Biasanod:LCD輸出模式下代表偏置電壓,可選LCD_BIAS_3(1/3偏壓)、LCD_BIAS_2(1/2偏壓)。LED輸出模式下代表共正極/共負極選擇。
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復位操作 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電壓發生器上電 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電壓發生器掉電 LCD->LCDCTRL0_b.LEDINV=biasanode;//LED共正極/共負極選擇 LCD->LCDCTRL0_b.LEDEN=1;//選擇為LED輸出模式 LCD->LCDCTRL0_b.LCDEN=0; } return; }
3-2 LCD輸出使能
這段函數控制著LCD的COM端口和SEGMEN端口的輸出使能,可以根據實際需求來進行配置。比如開發板使用了COM0~COM3,SEG0~SEG7。因此comchannel參數的低4位都是置1的,即輸入參數應該為0xF。同理,segchannel的低8位都是置1的,即輸入參數應該為0xFF。
voidLCD_EnableOutput(uint8_tcomchannel,uint16_tsegchannel) { LCD->LCDOUTEN0_b.LCDCOMEN=comchannel; LCD->LCDOUTEN1_b.LCDSEGEN=segchannel; return; }
3-3 LCD功能關閉
這段函數的作用是關閉LCD外設功能,通過LCD電壓發生器,并且關閉其時鐘。
voidLCD_Deinit(void) { SYSCON->PDRUNCFG_b.LCD_PD=1;//LCD電壓發生器掉電 SYSCON->SYSAHBCLKCTRL_b.LCD_CLK=0;//LCD時鐘關閉 return; }
3-4 LCD全顯
這段函數的功能是數據映射寄存器全部置位,從而全部顯示。
voidLCD_LightFullScreen(void) { LCD->MEMMAP0=0xFFFFFFFF; LCD->MEMMAP1=0xFFFFFFFF; LCD->MEMMAP2=0xFFFFFFFF; LCD->MEMMAP3=0xFFFFFFFF; return; }
3-5 LCD清屏
這段函數的功能是數據映射寄存器全部清0,從而快速清屏。
voidLCD_ClearScreen(void) { LCD->MEMMAP0=0; LCD->MEMMAP1=0; LCD->MEMMAP2=0; LCD->MEMMAP3=0; return; }
4、端口中斷例程
介紹完LCD常用的驅動函數,接下來用個小例程來演示LCD的驅動。測試程序的代碼如下:
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驅動初始化 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); } }
程序第一步先執行lcd_PortInit函數來復用LCD端口。端口復用完成后就是LCD_Init函數,這個在前面講解過。我們選擇的是LCD輸出模式,1/4占空比輸出,1/3偏壓,100Hz的COM刷新率。完成初始化的配置后,就可以使能LCD的輸出了。
測試用的顯示程序是讓液晶在0~9之間不停的循環顯示。效果圖如下:
全0顯示:
圖7 LCD顯示全0
全9顯示:
圖8 LCD顯示全9
來源:敏矽MCU
-
mcu
+關注
關注
146文章
17324瀏覽量
352656 -
lcd
+關注
關注
34文章
4438瀏覽量
168397 -
液晶
+關注
關注
6文章
606瀏覽量
69742 -
Cortex-M0
+關注
關注
4文章
124瀏覽量
38807
發布評論請先 登錄
相關推薦
評論