在HC32L136開發板上配有一個筆段式的液晶屏,但無奈的是廠家卻沒提供一個能直接調用的顯示函數。 在沒解決該顯示屏的顯示函數前,先以輕車熟路的OLED屏來實現顯示的問題。 由于手頭的OLED屏是一款I2C接口的單色顯示屏,故另其與MCU的連接關系為: PA11:SCL PA12:SDA 使這2個引腳輸出高低電平的語句定義為: #define OLED_SCLK_Set() Gpio_SetIO(GpioPortA, GpioPin11) #define OLED_SCLK_Clr() Gpio_ClrIO(GpioPortA, GpioPin11); #define OLED_SDIN_Set() Gpio_SetIO(GpioPortA, GpioPin12) #define OLED_SDIN_Clr() Gpio_ClrIO(GpioPortA, GpioPin12); 分配2個引腳為輸出功能的函數為: - void App_OledInit(void)
- {
- stc_gpio_cfg_t stcGpioCfg;
- ///< 打開GPIO外設時鐘門控
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
- ///< 端口方向配置->輸出(其它參數與以上(輸入)配置參數一致)
- stcGpioCfg.enDir = GpioDirOut;
- ///< 端口上下拉配置->下拉
- stcGpioCfg.enPu = GpioPuDisable;
- stcGpioCfg.enPd = GpioPdEnable;
- ///< GPIO IO OLED端口初始化
- Gpio_Init(GpioPortA, GpioPin11, &stcGpioCfg);
- Gpio_Init(GpioPortA, GpioPin12, &stcGpioCfg);
- }
復制代碼
實現圖1 顯示效果的主程序為:- int32_t main(void)
- {
- stc_rtc_time_t readtime;
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //GPIO外設時鐘打開
- Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE); //RTC模塊時鐘打開
- Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
- RTC_Cfg(); //配置RTC
- EnableNvic(RTC_IRQn, IrqLevel3, TRUE); //使能RTC中斷向量
- Rtc_Cmd(TRUE); //使能RTC開始計數
- App_OledInit();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"HC32L136 TEST",16);
- OLED_ShowString(0,2,"OLED DISPLAY",16);
- while (1);
- }
復制代碼
圖1 OLED屏顯示效果 實現RTC時間設置的函數為: - void RTC_Cfg(void)
- {
- stc_rtc_initstruct_t RtcInitStruct;
- RtcInitStruct.rtcAmpm = RtcPm; //12小時制
- RtcInitStruct.rtcClksrc = RtcClkRcl; //內部低速時鐘
- RtcInitStruct.rtcPrdsel.rtcPrdsel = RtcPrds; //周期中斷類型PRDS
- RtcInitStruct.rtcPrdsel.rtcPrds = Rtc1S; //周期中斷事件間隔
- RtcInitStruct.rtcTime.u8Second = 0x55;
- RtcInitStruct.rtcTime.u8Minute = 0x55;
- RtcInitStruct.rtcTime.u8Hour = 0x10;
- RtcInitStruct.rtcTime.u8Day = 0x06;
- RtcInitStruct.rtcTime.u8DayOfWeek = 0x04;
- RtcInitStruct.rtcTime.u8Month = 0x10;
- RtcInitStruct.rtcTime.u8Year = 0x20;
- RtcInitStruct.rtcCompen = RtcCompenEnable;
- RtcInitStruct.rtcCompValue = 0;//補償值根據實際情況進行補償
- Rtc_Init(&RtcInitStruct);
- Rtc_AlmIeCmd(TRUE); //使能鬧鐘中斷
- }
復制代碼
實現圖3 RTC 計時效果的主程序為:- int32_t main(void)
- {
- stc_rtc_time_t readtime;
- Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //GPIO外設時鐘打開
- Sysctrl_SetPeripheralGate(SysctrlPeripheralRtc,TRUE); //RTC模塊時鐘打開
- Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE);
- RTC_Cfg(); //配置RTC
- EnableNvic(RTC_IRQn, IrqLevel3, TRUE); //使能RTC中斷向量
- Rtc_Cmd(TRUE); //使能RTC開始計數
- App_OledInit();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"HC32L136 TEST",16);
- OLED_ShowString(0,2,"OLED & RTC",16);
- delay1ms(2000);
- OLED_Clear();
- OLED_ShowString(0,0,"20 - -",16);
- OLED_ShowString(0,2," : :",16);
- while (1)
- {
- if(flag == 1)
- {
- flag = 0;
- Rtc_ReadDateTime(&readtime);
- second = readtime.u8Second;
- minute = readtime.u8Minute;
- hour = readtime.u8Hour;
- day = readtime.u8Day;
- week = readtime.u8DayOfWeek;
- month = readtime.u8Month;
- year = readtime.u8Year;
- OLED_ShowNum(16,0,year/16*10+year%16,2,16);
- OLED_ShowNum(40,0,month/16*10+month%16,2,16);
- OLED_ShowNum(64,0,day/16*10+day%16,2,16);
- OLED_ShowNum(16,2,hour/16*10+hour%16,2,16);
- OLED_ShowNum(40,2,minute/16*10+minute%16,2,16);
- OLED_ShowNum(64,2,second/16*10+second%16,2,16);
- }
- }
- }
復制代碼
圖2 RTC起始界面
圖3 RTC計時效果
|