前面曾介绍过RTC及电子时钟的实现方法,但由于开发板上没有配置相应的后备电池,因此在断电后将无法保持RTC的继续运行。在重新上电后需再次设置和调整RTC的时间值。
为此,可利用开发板上提供的2个按键来完成这个任务,其电路见图1所示。
图 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来进行移位或确认。
图2 显示效果