本帖最后由 jinglixixi 于 2024-11-27 20:58 编辑
AT-START-L021开发板为了便于对RTC的所用,提供了相应的RTC例程,使用这些例程可以快速地完成自己的应用设计。 这里就在LCD屏显示驱动的基础上,通过增添数值显示函数来与RTC功能相配合以实现电子时钟功能。
LCD屏实现数值显示的函数为: - void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color)
- {
- u8 t,temp;
- u8 enshow=0;
- for(t=0;t<len;t++)
- {
- temp=(num/mypow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- LCD_ShowChar(x+8*t,y,' ',0,color);
- continue;
- }
- else enshow=1;
- }
- LCD_ShowChar(x+8*t,y,temp+48,0,color);
- }
- }
实现电子时钟计时功能的主程序为: - int main(void)
- {
- exint_init_type exint_init_struct;
- ertc_time_type time;
- uint32_t temp = 0;
- system_clock_config();
- at32_board_init();
- crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
- pwc_battery_powered_domain_access(TRUE);
- if (ertc_bpr_data_read(ERTC_DT1) != 0x1234)
- {
- ertc_config();
- }
- else
- {
- ertc_wait_update();
- ertc_flag_clear(ERTC_ALAF_FLAG);
- exint_flag_clear(EXINT_LINE_17);
- }
- ertc_time_show();
- ertc_alarm_show();
- exint_default_para_init(&exint_init_struct);
- exint_init_struct.line_enable = TRUE;
- exint_init_struct.line_mode = EXINT_LINE_INTERRUPT;
- exint_init_struct.line_select = EXINT_LINE_17;
- exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
- exint_init(&exint_init_struct);
- nvic_irq_enable(ERTC_IRQn, 0, 1);
- LCD_config();
- LCD _Init();
- LCD_Clear(RED);
- LCD_ShowString(20,10,"AT32L021_RTC",YELLOW);
- LCD_ShowString(20,30," : :",YELLOW);
- while(1)
- {
- ertc_calendar_get(&time);
- if(temp != time.sec)
- {
- temp = time.sec;
- LCD_ShowNum(20,30,time.hour,2,YELLOW);
- LCD_ShowNum(44,30,time.min,2,YELLOW);
- LCD_ShowNum(68,30,time.sec,2,YELLOW);
- }
- delay_ms(500);
- }
- }
经程序的编译与下载,其显示效果如图1所示。 图1 连接与显示
图2 显示效果
|