本帖最后由 jinglixixi 于 2020-10-31 17:13 编辑
在HC32L136的例程中,只有笔段式液晶屏的测试程序,却没有提供一个可供用户直接调用的数值显示函数。 为此在了解液晶屏的工作原理后,在原例程的基础上完成了它的数值显示函数。 1. 液晶屏工作原理及显示编码 在HC32L136开发板上,所配置的液晶屏为4位数字式显示屏并配有小数点和时间分隔符,其布局如图1所示。
图1 液晶屏笔段布局显示 尽管笔段式液晶屏在显示显示上与数码管十分相近,但在工作原理和机制上却差别很大。 以数码管为例,它是通过段码和位码来控制显示的,编写好段码表后,只需把段码送到位码控制的位置即可显示出相应的内容。 例如“1”的显示码为0x06,即0000 0110对应CB被点亮。 而对于液晶屏就不同了,它是按节拍来完成代码的输出,按显示位置的不同,是将显示笔段分成4组,每组占2位,共8位。而每组内,相同位置所控制的笔段名称相同,故只需定义一组编码即可,然后按显示的位置进行移位处理即可(例如第一组需移动6位,第二组需移动4位第三组需移动2位)。 若每组显示码占2个字节,则可到如下的显示码表: 2.显示程序 1)定义显示数组 #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)寄存器设置函数 en_result_t Lcd_WriteRam(uint8_t u8Row,uint32_t u32Data)
{
en_result_t enRet = Error;
volatile uint32_t *ram = NULL;
ram = (volatile uint32_t*)&M0P_LCD->RAM0;
if (u8Row > 15)
{
enRet = ErrorInvalidParameter;
return enRet;
}
ram += u8Row;
*ram = u32Data;
enRet = Ok;
return enRet;
}
3)清屏函数 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++;
}
}
4)显示函数 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;
}
3. RTC电子时钟 在HC32L136内部配置了RTC计时器,将它与SLCD液晶屏配合即可实现一个RTC电子时钟。 实现电子时钟的主程序为: 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);
}
}
有了显示程序固然可喜,但下载工具的作用也是必不可少的,本人使用的第三方的下载工具,并通过虚拟串口来完成下载,见图2和图3所示。
图2 下载工具
图3 下载过程
在下载程序后,其显示效果如图4和图5所示。
图4 运行效果1
图5 运行效果2
工程文件:
|