[活动专区] 【AT-START-L021测评】+RTC电子时钟

[复制链接]
 楼主| jinglixixi 发表于 2024-11-27 20:55 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2024-11-27 20:58 编辑

AT-START-L021开发板为了便于对RTC的所用,提供了相应的RTC例程,使用这些例程可以快速地完成自己的应用设计。
这里就在LCD屏显示驱动的基础上,通过增添数值显示函数来与RTC功能相配合以实现电子时钟功能。

LCD屏实现数值显示的函数为:
  1. void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color)
  2. {
  3.     u8 t,temp;
  4.     u8 enshow=0;
  5.     for(t=0;t<len;t++)
  6.     {
  7.         temp=(num/mypow(10,len-t-1))%10;
  8.         if(enshow==0&&t<(len-1))
  9.         {
  10.             if(temp==0)
  11.             {
  12.                 LCD_ShowChar(x+8*t,y,' ',0,color);
  13.                 continue;
  14.             }
  15.             else enshow=1;
  16.         }
  17.         LCD_ShowChar(x+8*t,y,temp+48,0,color);
  18.     }
  19. }

实现电子时钟计时功能的主程序为:
  1. int main(void)
  2. {
  3.   exint_init_type exint_init_struct;
  4.   ertc_time_type time;
  5.   uint32_t temp = 0;
  6.   system_clock_config();
  7.   at32_board_init();
  8.   crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);
  9.   pwc_battery_powered_domain_access(TRUE);
  10.   if (ertc_bpr_data_read(ERTC_DT1) != 0x1234)
  11.   {
  12.     ertc_config();
  13.   }
  14.   else
  15.   {
  16.     ertc_wait_update();
  17.     ertc_flag_clear(ERTC_ALAF_FLAG);
  18.     exint_flag_clear(EXINT_LINE_17);
  19.   }
  20.   ertc_time_show();
  21.   ertc_alarm_show();
  22.   exint_default_para_init(&exint_init_struct);
  23.   exint_init_struct.line_enable   = TRUE;
  24.   exint_init_struct.line_mode     = EXINT_LINE_INTERRUPT;
  25.   exint_init_struct.line_select   = EXINT_LINE_17;
  26.   exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
  27.   exint_init(&exint_init_struct);
  28.   nvic_irq_enable(ERTC_IRQn, 0, 1);
  29.   LCD_config();
  30.   LCD _Init();
  31.   LCD_Clear(RED);
  32.   LCD_ShowString(20,10,"AT32L021_RTC",YELLOW);
  33.   LCD_ShowString(20,30,"  :  :",YELLOW);
  34.   while(1)
  35.   {
  36.     ertc_calendar_get(&time);
  37.     if(temp != time.sec)
  38.     {
  39.                 temp = time.sec;
  40.                 LCD_ShowNum(20,30,time.hour,2,YELLOW);
  41.                 LCD_ShowNum(44,30,time.min,2,YELLOW);
  42.                 LCD_ShowNum(68,30,time.sec,2,YELLOW);
  43.     }
  44.     delay_ms(500);
  45.   }
  46. }

经程序的编译与下载,其显示效果如图1所示。
2113367471678e60db.png
图1 连接与显示

41027674716b4141a5.png
2 显示效果



您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2934

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部