在HC32L136的例程中,只有筆段式液晶屏的測試程序,卻沒有提供一個可供用戶直接調(diào)用的數(shù)值顯示函數(shù)。 為此在了解液晶屏的工作原理后,在原例程的基礎(chǔ)上完成了它的數(shù)值顯示函數(shù)。 1. 液晶屏工作原理及顯示編碼 在HC32L136開發(fā)板上,所配置的液晶屏為4位數(shù)字式顯示屏并配有小數(shù)點和時間分隔符,其布局如圖1所示。 圖1 液晶屏筆段布局顯示 盡管筆段式液晶屏在顯示顯示上與數(shù)碼管十分相近,但在工作原理和機制上卻差別很大。 以數(shù)碼管為例,它是通過段碼和位碼來控制顯示的,編寫好段碼表后,只需把段碼送到位碼控制的位置即可顯示出相應(yīng)的內(nèi)容。 例如“1”的顯示碼為0x06,即0000 0110對應(yīng)CB被點亮。 而對于液晶屏就不同了,它是按節(jié)拍來完成代碼的輸出,按顯示位置的不同,是將顯示筆段分成4組,每組占2位,共8位。而每組內(nèi),相同位置所控制的筆段名稱相同,故只需定義一組編碼即可,然后按顯示的位置進行移位處理即可(例如第一組需移動6位,第二組需移動4位第三組需移動2位)。 若每組顯示碼占2個字節(jié),則可到如下的顯示碼表:
2.顯示程序
1)定義顯示數(shù)組 #define LCD_POINT 0X0008 const uint16_t lcd_tab[16] = { 0x0F05, 0x0600, 0x0B06, 0x0F02,0x0603, 0x0D03, 0x0D07, 0x0700, 0x0F07, 0x0F03, 0x0707, 0x0C07, 0x0905, 0x0E05,0x0907, 0x0107, }; 2)清屏函數(shù) - void Lcd_ClearDisp(void)
- {
- uint8_t tmp;
- volatile uint32_t *ram = NULL;
- ram = &M0P_LCD->RAM0;
- for(tmp=0;tmp<16;tmp++)
- {
- *ram = 0;
- ram++;
- }
- }
復(fù)制代碼 3)顯示函數(shù) - void LCD_Display(uint16_t * str)
- {
- uint32_t n;
- n = str[1];
- n <<= 16;
- n += str[0];
- M0P_LCD->RAM0 = n;
- n = str[3];
- n <<= 16;
- n += str[2];
- M0P_LCD->RAM1 = n;
- }
復(fù)制代碼 3. RTC電子時鐘 在HC32L136內(nèi)部配置了RTC計時器,將它與SLCD液晶屏配合即可實現(xiàn)一個RTC電子時鐘。 實現(xiàn)電子時鐘的主程序為: - int32_t main(void)
- {
- uint32_t i;
- uint16_t str[4];
- Sysctrl_ClkSourceEnable(SysctrlClkRCL,TRUE);
- Sysctrl_SetRCLTrim(SysctrlRclFreq32768);
- Sysctrl_SetPeripheralGate(SysctrlPeripheralLcd,TRUE);
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
- App_PortCfg();
- App_LcdCfg();
- Lcd_ClearDisp();
- stc_rtc_time_t readtime;
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE);
- Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE);
- Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
- RTC_Cfg();
- EnableNvic(RTC_IRQn, IrqLevel3, TRUE);
- Rtc_Cmd(TRUE);
- while (1)
- {
- M0P_GPIO->PDOUT ^= (1U << 5);
- if(flag == 1)
- {
- flag = 0;
- Rtc_ReadDateTime(&readtime);
- second = readtime.u8Second;
- minute = readtime.u8Minute;
- hour = readtime.u8Hour;
- str[0] = lcd_tab[minute>>4];
- str[1] = lcd_tab[minute&0x0f]|LCD_POINT;
- str[2] = lcd_tab[second>>4];
- str[3] = lcd_tab[second&0x0f];
- LCD_Display(str);
- }
- delay1ms(500);
- }
- }
復(fù)制代碼 有了顯示程序固然可喜,但下載工具的作用也是必不可少的,本人使用的第三方的下載工具,并通過虛擬串口來完成下載,見圖2和圖3所示。 圖2 下載工具
圖3 下載過程 在下載程序后,其顯示效果如圖4所示。
圖4運行效果
|