嵌入式蓝桥杯时钟、闹钟

可调时钟闹钟数据,保存修改次数。

#include "stm32f10x.h"
#include "lcd.h"
#include "key.h"
#include "i2c.h"
#include "stm32f10x.h"
#include "led.h"
#include "tim.h"

void Keypro(void);
void LCDpro(void);
void SUB(void);
void ADD(void);

unsigned char time[3] = {11,59,50};
unsigned char alarm[3] = {12,0,0};
unsigned char pucStr[16];
unsigned char pucStr1[16];
u32 state;
u32 ntime=0;
u32 num;
u8 i=8;

int main(void)
{
 	
	KeyInit();
	STM3210B_LCD_Init();
	SysTick_Config(8000);

	i2c_init();
	num=Read(0xff);

	LedInit();

	LCD_Clear(White);
	LCD_SetTextColor(Blue);
	LCD_SetBackColor(White);

//	
//	LCD_DisplayStringLine(Line1,"        CLOCK        ");
//	LCD_DisplayStringLine(Line3,"    you can change  ");		
//
//	LCD_SetTextColor(White);
//	LCD_SetBackColor(Blue);
//
//	LCD_DisplayStringLine(Line5,"please press button");

	TimInit();
	TIM_SetCompare1(TIM2,500); //占空比为500/1000=50%
	TIM_SetCompare2(TIM2,700); //占空比为700/1000=70%
	while(1)
	{
		Keypro();
		LCDpro();
		sprintf((char*)pucStr1,"     NUM:%d        ",num);
        LCD_DisplayStringLine(Line9, pucStr1);
	}

}

void LCDpro(void)
{
	switch(state)
	{
		case 0:
		LCD_DisplayStringLine(Line1,"        MAIN        ");
		sprintf((char*)pucStr, "    TIME:%02u:%02u:%02u   ",time[0], time[1], time[2]);
        LCD_DisplayStringLine(Line7, pucStr);
		sprintf((char*)pucStr, "   Alarm:%02u:%02u:%02u   ",alarm[0],alarm[1],alarm[2]);
        LCD_DisplayStringLine(Line8, pucStr);
		
		break;
		case 1:
		case 2:
		case 3:
		LCD_DisplayStringLine(Line1, (unsigned char*)"    RTC-SETTING     ");
		if(state==1)
		LCD_SetBackColor(Red);
		LCD_DisplayChar(Line7, 176, time[0]/10+0x30);
		LCD_DisplayChar(Line7, 160, time[0]%10+0x30);
		LCD_SetBackColor(White);

		LCD_DisplayChar(Line7, 144, ':');

		if(state==2)
		LCD_SetBackColor(Red);
		LCD_DisplayChar(Line7, 128, time[1]/10+0x30);
		LCD_DisplayChar(Line7, 112, time[1]%10+0x30);
		LCD_SetBackColor(White);
		
		LCD_DisplayChar(Line7, 96, ':');

		if(state==3)
		LCD_SetBackColor(Red);
		LCD_DisplayChar(Line7, 80, time[2]/10+0x30);
		LCD_DisplayChar(Line7, 64, time[2]%10+0x30);
		LCD_SetBackColor(White);
		break;
		case 4:
		case 5:
		case 6:
		LCD_DisplayStringLine(Line1, (unsigned char*)"    ALARM-SETTING     ");
		if(state==4)
		LCD_SetBackColor(Red);
		LCD_DisplayChar(Line8, 176, alarm[0]/10+0x30);
		LCD_DisplayChar(Line8, 160, alarm[0]%10+0x30);
		LCD_SetBackColor(White);

		LCD_DisplayChar(Line8, 144, ':');

		if(state==5)
		LCD_SetBackColor(Red);
		LCD_DisplayChar(Line8, 128, alarm[1]/10+0x30);
		LCD_DisplayChar(Line8, 112, alarm[1]%10+0x30);
		LCD_SetBackColor(White);
		
		LCD_DisplayChar(Line8, 96, ':');

		if(state==6)
		LCD_SetBackColor(Red);
		LCD_DisplayChar(Line8, 80, alarm[2]/10+0x30);
		LCD_DisplayChar(Line8, 64, alarm[2]%10+0x30);
		LCD_SetBackColor(White);
	}
}

void Keypro(void)
{
	u16 key;
	key=Keyscan();
	switch(key)
	{
		case 1:
		if(state==0)
		state=1;
		else if(state<4)
		state=0;
		
		else if(++state==7)
		state=4;
		break;

		case 2:
		if(state==0)
		state=4;
		else if(state==4)
		state=0;
		else if(++state==4)
		state=1;
		break;
		case 3:
		ADD();break;
		case 4:
		SUB();break;
	}				
}

void SysTick_Handler(void)
{
	ntime++;
	
	if(ntime==1000)
	{	
		ntime=0;
		time[2]++;
		if(time[2]==60)
		{
			time[2]=0;
			time[1]++;
			if(time[1]==60)
			{
				time[1]=0;
				time[0]++;
				if(time[0]==24)
				time[0]=0;
			}
		}
		GPIO_Write(GPIOC,~(1<<i));
		GPIO_SetBits(GPIOD,GPIO_Pin_2);
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);
		if(++i==16)
		i=8;
	}
	if((time[0]==alarm[0])&&(time[1]==alarm[1])&&(time[2]==alarm[2]))
	{
		GPIO_Write(GPIOC,0x00);
		GPIO_SetBits(GPIOD,GPIO_Pin_2);
		GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	}
}

void ADD(void)
{
	switch(state)
	{
		case 1:
		time[0]++;
		if(time[0]==24)
		time[0]=0;
		num++;
		Write(0xff,num);
		break;
		case 2:
		time[1]++;
		if(time[1]==60)
		time[1]=0;
		num++;
		Write(0xff,num);
		break;
		case 3:
		time[2]++;
		if(time[2]==60)
		time[2]=0;
		num++;
		Write(0xff,num);
		break;
		case 4:
		alarm[0]++;
		if(alarm[0]==60)
		alarm[0]=0;
		num++;
		Write(0xff,num);
		break;
		case 5:
		alarm[1]++;
		if(alarm[0]==24)
		alarm[1]=0;
		num++;
		Write(0xff,num);
		break;
		case 6:
		alarm[2]++;
		if(alarm[2]==60)
		alarm[2]=0;
		num++;
		Write(0xff,num);
		break;
	}	
}

void SUB(void)
{
	switch(state)
	{
		case 1:
		time[0]--;
		if(time[0]==0)
		time[0]=23;
		num++;
		Write(0xff,num);
		break;
		case 2:
		time[1]--;
		if(time[1]==0)
		time[1]=59;
		num++;
		Write(0xff,num);
		break;
		case 3:
		time[2]--;
		if(time[2]==0)
		time[2]=59;
		num++;
		Write(0xff,num);
		break;
		case 4:
		alarm[0]--;
		if(alarm[0]==0)
		alarm[0]=23;
		num++;
		Write(0xff,num);
		case 5:
		alarm[1]--;
		if(alarm[0]==0)
		alarm[1]=59;
		num++;
		Write(0xff,num);
		break;
		case 6:
		alarm[2]--;
		if(alarm[2]==0)
		alarm[2]=59;
		num++;
		Write(0xff,num);
		break;
	}	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值