[MCU] 【CW32L052测评】+以按键设置和调整RTC时间值

jinglixixi   2023-8-24 01:08 楼主

前面曾介绍过RTC及电子时钟的实现方法,但由于开发板上没有配置相应的后备电池,因此在断电后将无法保持RTC的继续运行。在重新上电后需再次设置和调整RTC的时间值。

为此,可利用开发板上提供的2个按键来完成这个任务,其电路见图1所示。

image.png  

图 1 原理图

 

对按键与LED引脚配置函数为:

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	//LED1
	GPIO_InitStructure.Pins = LED1_GPIO_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.IT = GPIO_IT_NONE;
    GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
	//LED2
	GPIO_InitStructure.Pins = LED2_GPIO_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.IT = GPIO_IT_NONE;
    GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
	//KEY1
    GPIO_InitStructure.Pins = KEY1_GPIO_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
	GPIO_InitStructure.IT = GPIO_IT_FALLING;
    GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
    //KEY2
    GPIO_InitStructure.Pins = KEY2_GPIO_PIN;
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
	GPIO_InitStructure.IT = GPIO_IT_FALLING;
    GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
	LED1_ON;
    LED2_OFF;
}

对按键进行中断处理的函数为:

void NVIC_Configuration(void)
{
    __disable_irq();
	GPIOB_INTFLAG_CLR( 0xFFFF );
	NVIC_EnableIRQ(GPIOA_IRQn);
    __enable_irq();
}

实现按键设置和调整RTC时间值的主程序为:

int32_t main(void)
{
    int32_t m,s;
    int8_t f;
	RTC_InitTypeDef* RTC_Config;
	RTC_TimeTypeDef RTC_DateTime;
	RTC_TimeTypeDef TempTime;
	RTC_DateTypeDef TempDate;
	uint8_t hh,mm,ss;
    RCC_Configuration();
	InitTick( 24000000 );
    GPIO_Configuration();
    NVIC_Configuration();
	SysTickDelay(10);
	OLED_Configuration();
	OLED_Init();
    OLED_Clear();
    OLED_ShowString(20,0,"CW32L052",16);
	OLED_ShowString(20,2,"  :  :",16);
    m=0;
	s=0;
	gKey1Status = 0;
	gKey2Status = 0;
    f=0;
    OLED_ShowNum(20,4,m,6,16);
	while(f<6)
	{
		if( (gKey1Status == 1) && (gKey2Status == 0) )
		{
			  LED1_TOG;
			  LED2_OFF;
			  m=(m+1)%10;
			  OLED_ShowNum(20,4,s+m,6,16);  //
		}
		if((gKey1Status == 0) && (gKey2Status == 1))
		{
			  LED2_TOG;
			  LED1_OFF;
			  s=s+m; 
			  m=0;
			  OLED_ShowNum(20,4,s,6,16);   //
			  if(d<100)
			  {
				   OLED_ShowNum(68,2,s%100,2,16);
			  }
			  if(d>=100)
		      {
				   OLED_ShowNum(68,2,s%100,2,16);
				   OLED_ShowNum(44,2,(s%10000)/100,2,16);
			  }
			  if(d>=10000) OLED_ShowNum(20,2,s/10000,2,16);
              s=s*10;
              f=f+1;
		}
		gKey1Status = 0;
	    gKey2Status = 0;
		SysTickDelay(500);
	}
    while(1);
}

经程序的编译与下载,其实现效果如图2所示。

注:在使用时,用按KEY1来选取数值,用KEY2来进行移位或确认。

image.png  

图2 显示效果

回复评论 (1)

有安键设置,就非常方便了。
点赞  2023-8-24 10:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复