本帖最后由 jinglixixi 于 2020-9-29 11:34 編輯
在HC32F460內(nèi)部配有RTC功能,這里我們?yōu)樗渖?/font>OLED屏顯示,這樣它就構(gòu)成一個RTC電子時鐘。 所用的OLED屏就是隨板子自帶的,該OLED屏的原理圖見圖1所示。
1.jpg (11.78 KB, 下載次數(shù): 80)
下載附件
2020-9-29 11:31 上傳
圖1 OLED屏原理圖
本想以I2C通訊來驅(qū)動OLED屏,但將其移到RTC的程序中,比較難協(xié)調(diào),最終還是以模擬I2C的方式來輕松地將兩者結(jié)合在一起。 由于SDA和SCL 仍占用原位置,故定義其輸出高低電平的語句如下: #define OLED_SCLK_Set() PORT_SetBits(PortD, Pin00) #define OLED_SCLK_Clr() PORT_ResetBits(PortD, Pin00)
#define OLED_SDIN_Set() PORT_SetBits(PortD, Pin01) #define OLED_SDIN_Clr() PORT_ResetBits(PortD, Pin01)
所用的字符顯示函數(shù)為: - void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t Char_Size)
- {
- unsigned char j=0;
- while (chr[j]!='\0')
- {
- OLED_ShowChar(x,y,chr[j],Char_Size);
- x+=8;
- if(x>120){x=0;y+=2;}
- j++;
- }
- }
復(fù)制代碼
所用的數(shù)值顯示函數(shù)為:
- void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
- {
- uint8_t t,temp;
- uint8_t enshow=0;
- for(t=0;t<len;t++)
- {
- temp=(num/oled_pow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
- continue;
- }else enshow=1;
- }
- OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
- }
- }
復(fù)制代碼
進(jìn)行RTC 時間設(shè)置的函數(shù)為:- static void Rtc_CalendarConfig(void)
- {
- stc_rtc_date_time_t stcRtcDateTimeCfg;
- MEM_ZERO_STRUCT(stcRtcDateTimeCfg);
- stcRtcDateTimeCfg.u8Year = 20u;
- stcRtcDateTimeCfg.u8Month = 9;
- stcRtcDateTimeCfg.u8Day = 27u;
- stcRtcDateTimeCfg.u8Weekday = RtcWeekdaySunday;
- stcRtcDateTimeCfg.u8Hour = 12u;
- stcRtcDateTimeCfg.u8Minute = 23u;
- stcRtcDateTimeCfg.u8Second = 01u;
- if (RTC_SetDateTime(RtcDataFormatDec, &stcRtcDateTimeCfg, Enable, Enable) != Ok)
- {
- printf("write calendar failed!\r\n");
- }
- }
復(fù)制代碼
實(shí)現(xiàn)圖1 和圖2 顯示效果的主程序如下:- int32_t main(void)
- {
- stc_port_init_t stcPortInit;
- stc_rtc_date_time_t stcCurrDateTime;
- MEM_ZERO_STRUCT(stcPortInit);
- MEM_ZERO_STRUCT(stcCurrDateTime);
- LED0_OFF();
- stcPortInit.enPinMode = Pin_Mode_Out;
- PORT_Init(LED0_PORT, LED0_PIN, &stcPortInit);
- stcPortInit.enPinMode = Pin_Mode_Out;
- PORT_Init(PortD, Pin00, &stcPortInit);
- PORT_Init(PortD, Pin01, &stcPortInit);
- Xtal32_ClockConfig();
- Ddl_UartInit();
- Rtc_Config();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"HC32F460 TEST",16);
- OLED_ShowString(0,2,"OLED & RTC",16);
- Ddl_Delay1ms(1000u);
- OLED_Clear();
- OLED_ShowString(0,0,"20 - -",16);
- OLED_ShowString(0,2," : :",16);
- while (1)
- {
- if (1u == u8SecIntFlag)
- {
- u8SecIntFlag = 0u;
- LED0_TOGGLE();
- if (RTC_GetDateTime(RtcDataFormatDec, &stcCurrDateTime) = Ok)
- {
- OLED_ShowNum(16,0,stcCurrDateTime.u8Year,2,16);
- OLED_ShowNum(40,0,stcCurrDateTime.u8Month,2,16);
- OLED_ShowNum(64,0,stcCurrDateTime.u8Day,2,16);
- OLED_ShowNum(16,2,stcCurrDateTime.u8Hour,2,16);
- OLED_ShowNum(40,2,stcCurrDateTime.u8Minute,2,16);
- OLED_ShowNum(64,2,stcCurrDateTime.u8Second,2,16);
- }
- }
- }
- }
復(fù)制代碼
2.jpg (31.92 KB, 下載次數(shù): 62)
下載附件
2020-9-29 11:31 上傳
圖2 初始界面
3.jpg (30.75 KB, 下載次數(shù): 83)
下載附件
2020-9-29 11:31 上傳
圖3 RTC運(yùn)行界面
|