STM32实时钟设计精编版.docx
《STM32实时钟设计精编版.docx》由会员分享,可在线阅读,更多相关《STM32实时钟设计精编版.docx(24页珍藏版)》请在冰豆网上搜索。
STM32实时钟设计精编版
STM32实时钟设计
实现功能:
1、定时器用于实时钟的月日、时分和秒计时;
2、2个按键用于实时钟的显示切换和设置;
3、LCD用于实时钟的月日、时分和秒显示;
4、通过UART接口在微机上显示和设置实时钟。
按键要求:
程序如下:
#include"stm32f10x.h"
#include"misc.h"
//#include"uart_my.h"
#include"stdio.h"
#include"stm32f10x_exti.h"
//#defineNVIC_SETENA1(*(volatileunsignedlong*)(0xe000e104))
intRx=0;
intreceive=0;
u8temp;
inttime[6];
intled=0x200;
intlcddata[5][2]={0};
intrunnian=1,flag=2,dian=0,flag2=1,timer=0;
charrtc[30];
charno=0;
charlcd_code[16]= //编码
{
0xeb,//0
0x0a,//1
0xad,//2
0x8f,//3
0x4e,//4
0xc7,//5
0xe7,//6
0x8a,//7
0xef,//8
0xcf,//9
0x7e,//A
0x37,//B
0x71,//C
0x1f,//D
0x75,//E
0x74//F
};
//privatefunction
voidLCD_Write(intdata,intbit);
voidSystick_Proc(void);
voidLcd_Proc(void);
voidlcd_display0(void);
voidlcd_display1(void);
voidlcd_display2(void);
voidlcd_display3(void);
voidlcd_display4(void);
voidlcd_display5(void);
voidlcd_display6(void);
voidUart_IO_Config(void);
voidLCD_IO_Config(void);
voidLed_IO_Config(void);
voidUart_IO_Config(void);
voidButton_IO_Config(void);
voidEXTILineConfig(void);
voidNVIC_Configuration(void);
voidUart_Init(void);
voidLCD_Init(void);
voidSystick_Init(void);
voidLED_Proc(void);
voidLcd_Proc(void);
voidUart(void);
voiduartPuts(u8*s);
voidUart_r(void);
voidUSART_GetS_Time(void);
intmain(void)
{
//SystemInit();
//Systick_Init();
SystemInit();
SysTick_Config(9000000);
LCD_IO_Config();
Led_IO_Config();
Uart_IO_Config();
Button_IO_Config();
EXTILineConfig();
NVIC_Configuration();
Uart_Init();
LCD_Init();
while
(1)
{
Systick_Proc();
Lcd_Proc();
Uart_r();
}
}
voidSystick_Proc(void)
{
if(NVIC_STCSR&0x10000)
{
dian^=1;
if((++time[0])>=60)
{time[0]=0;
if((++time[1])>=60)
{time[1]=0;
if((++time[2])>=24)
time[2]=0;
switch(time[4])
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
if(++time[3]>=32){if(++time[4]>=13)time[4]=1;}break;
case2:
if(runnian){if(++time[3]>=30){if(++time[4]>=13)time[4]=0;}}
else{if(++time[3]>=29){if(++time[4]>=13)time[4]=0;}}break;
case4:
case6:
case9:
case11:
if(++time[3]>=31){if(++time[4]>=13)time[4]=0;}break;
default:
break;//time[4]=0;time[3]=0;
}
}
sprintf(rtc,"%d-%d%d:
%d:
%d",time[4],time[3],time[2],time[1],time[0]); //格式化输入出处
//sprintf(rtc2,"",);
}
lcddata[0][0]=time[0]%10;
lcddata[0][1]=time[0]/10;
lcddata[1][0]=time[1]%10;
lcddata[1][1]=time[1]/10;
lcddata[2][0]=time[2]%10;
lcddata[2][1]=time[2]/10;
lcddata[3][0]=time[3]%10;
lcddata[3][1]=time[3]/10;
lcddata[4][0]=time[4]%10;
lcddata[4][1]=time[4]/10;
//之前开始以分钟之后才能显示 放在前边
sprintf(rtc,"日期与时间是:
%d-%d%d:
%d:
%d",time[4],time[3],time[2],time[1],time[0]); //格式化输入出处
Uart();
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,0xd);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);USART_SendData(USART1,0xa);
LED_Proc();
}
}
voidLcd_Proc(void)
{ /*inttemp[8];
temp[0]=((lcd_code[min_display_h]&0xf0)>>4);//分钟十位高四位
temp[1]=(lcd_code[min_display_h]&0x0f);//分钟十位低四位
temp[2]=((lcd_code[min_display_l]&0xf0)>>4);//分钟个位高四位
temp[3]=(lcd_code[min_display_l]&0x0f);//分钟个位低四位
temp[4]=((lcd_code[sec_display_h]&0xf0)>>4);//秒钟十位高四位
temp[5]=(lcd_code[sec_display_h]&0x0f);//秒钟十位低四位
temp[6]=((lcd_code[sec_display_l]&0xf0)>>4);//秒钟个位高四位
temp[7]=(lcd_code[sec_display_l]&0x0f);//秒钟个位低四位*/
switch(flag)
{
case0:
lcd_display0();break;
case1:
lcd_display1();break;
case2:
lcd_display2();break;
case3:
lcd_display3();break;
case4:
lcd_display4();break;
case5:
lcd_display5();break;
case6:
lcd_display6();break;
default:
break;
}
}
voidlcd_display0(void)//时分显示
{
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[2][1]]+(dian<<4),17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[2][0]],17);//移位这一块
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[1][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[1][0]],17);
}
voidlcd_display1(void)//月日显示
{
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[4][1]],17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[4][0]],17);//移位这一块
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[3][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[3][0]],17);
}
voidlcd_display2(void)//分秒显示
{
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[1][1]]+(dian<<4),17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[1][0]],17);//移位这一块
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[0][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[0][0]],17);
}
voidlcd_display3(void)//月设置显示
{
if(dian)
{
LCD_Write((5<<14)+(0<<8)+no,17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+no,17);//移位这一块
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[3][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[3][0]],17);
}
else
{
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[4][1]],17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[4][0]],17);//移位这一块
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[3][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[3][0]],17);
}
}
voidlcd_display4(void)//天设置显示
{
if(dian)
{
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[4][1]],17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[4][0]],17);//移位这一块
LCD_Write((5<<14)+(4<<8)+no,17);
LCD_Write((5<<14)+(6<<8)+no,17);
}
else
{
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[4][1]],17);
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[4][0]],17);
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[3][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[3][0]],17);
}
}
voidlcd_display5(void)//时设置显示
{
if(dian)
{
LCD_Write((5<<14)+(0<<8)+no,17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+no,17);//移位这一块
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[1][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[1][0]],17);
}
else
{
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[2][1]],17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[2][0]],17);//移位这一块
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[1][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[1][0]],17);
}
}
voidlcd_display6(void)//分设置显示
{
if(dian)
{
LCD_Write((5<<14)+(4<<8)+no,17);//移位出现问题
LCD_Write((5<<14)+(6<<8)+no,17);//移位这一块
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[2][1]],17);
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[2][0]],17);
}
else
{
LCD_Write((5<<14)+(0<<8)+lcd_code[lcddata[2][1]],17);//移位出现问题
LCD_Write((5<<14)+(2<<8)+lcd_code[lcddata[2][0]],17);//移位这一块
LCD_Write((5<<14)+(4<<8)+lcd_code[lcddata[1][1]],17);
LCD_Write((5<<14)+(6<<8)+lcd_code[lcddata[1][0]],17);
}
}
voidLCD_IO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
voidButton_IO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置错误
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
voidLed_IO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
/*ConfigurePC.06,PC.07,PC.08andPC.09asoutputpush-pull*/
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
voidUart_IO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
USART_ClearITPendingBit(USART1,USART_IT_TC|USART_IT_RXNE);//RX
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; //接收
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//TX
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//发送
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidEXTILineConfig(void)
{
EXTI_InitTypeDefEXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);
EXTI_InitStructure.EXTI_Line=EXTI_Line14|EXTI_Line15;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//抢占优先级组4
//2位抢占优先级2位子优先级
/*EnabletheEXTI14InterruptonPB.14*///sw3输入时间
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;//对于相同中断号的中断无法设置抢断优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*EnabletheEXTI15InterruptonPB.15//sw2led方向
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure