【蓝桥杯】近几年省赛试题

第八届——电子钟

#include "sys.h"
#include "seg.h"
#include "key.h"
#include "ds18b20.h"
#include "ds1302.h"

extern bit set=0;
extern u8 yi,er,san,si,wu,liu,qi,ba;
extern u8 alarm_set=0;
extern u8 clock_set=0;
extern bit clock_show=1;
extern bit alarm_show=0;

u8 temperature;
u8 alarm[7];

bit led=0;
bit led_shanshuo=0;
bit led_flag=0;

bit wendu_flag=0;
bit wendu_show=0;

void Timer0Init(void)		//2毫秒@11.0592MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x9A;		//设置定时初值
	TH0 = 0xA9;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	EA = 1;
	ET0 = 1;
	
}


void main()
{
	All_Init();
	Timer0Init();
	Init_1302();
	while(1)
	{
		LedShow();
		keydriver();
		Time_Get();
		if(wendu_flag==1)
		{
			wendu_flag=0;
			temperature=Temp_Get();
		}
		if((time[2]==alarm[2])&&(time[1]==alarm[1])&&(time[0]==alarm[0]))
		{
			if(led_flag==0)
			{
				led=1;
			}	
		}
		if(clock_show==1&&wendu_show==0)
		{
			if(set==0)
			{
				yi=time[2]/10;er=time[2]%10;san=10;
				si=time[1]/10;wu=time[1]%10;liu=10;
				qi=time[0]/10;ba=time[0]%10;
			}
			else if(set==1)
			{
				if(clock_set==0)
				{
					if(time[0]%2==0)
					{
						yi=time[2]/10;er=time[2]%10;san=10;
						si=time[1]/10;wu=time[1]%10;liu=10;
						qi=time[0]/10;ba=time[0]%10;
					}
					else if(time[0]%2!=0)
					{
						yi=11;er=11;san=10;
						si=time[1]/10;wu=time[1]%10;liu=10;
						qi=time[0]/10;ba=time[0]%10;
					}
				}
				else if(clock_set==1)
				{
					if(time[0]%2==0)
					{
						yi=time[2]/10;er=time[2]%10;san=10;
						si=time[1]/10;wu=time[1]%10;liu=10;
						qi=time[0]/10;ba=time[0]%10;
					}
					else if(time[0]%2!=0)
					{
						yi=time[2]/10;er=time[2]%10;san=10;
						si=11;wu=11;liu=10;
						qi=time[0]/10;ba=time[0]%10;
					}
				}
				else if(clock_set==2)
				{
					if(time[0]%2==0)
					{
						yi=time[2]/10;er=time[2]%10;san=10;
						si=time[1]/10;wu=time[1]%10;liu=10;
						qi=time[0]/10;ba=time[0]%10;
					}
					else if(time[0]%2!=0)
					{
						yi=time[2]/10;er=time[2]%10;san=10;
						si=time[1]/10;wu=time[1]%10;liu=10;
						qi=11;ba=11;
					}
				}
			}
		}
		
		else if(alarm_show==1&&wendu_show==0)
		{
			if(alarm_set==1)
			{
				if(time[0]%2==0)
					{
						yi=alarm[2]/10;er=alarm[2]%10;san=10;
						si=alarm[1]/10;wu=alarm[1]%10;liu=10;
						qi=alarm[0]/10;ba=alarm[0]%10;
					}
					else if(time[0]%2!=0)
					{
						yi=11;er=11;san=10;
						si=alarm[1]/10;wu=alarm[1]%10;liu=10;
						qi=alarm[0]/10;ba=alarm[0]%10;
					}
			}
			
			if(alarm_set==2)
			{
				if(time[0]%2==0)
					{
						yi=alarm[2]/10;er=alarm[2]%10;san=10;
						si=alarm[1]/10;wu=alarm[1]%10;liu=10;
						qi=alarm[0]/10;ba=alarm[0]%10;
					}
					else if(time[0]%2!=0)
					{
						yi=alarm[2]/10;er=alarm[2]/10;san=10;
						si=11;wu=11;liu=10;
						qi=alarm[0]/10;ba=alarm[0]%10;
					}
				}
		 if(alarm_set==3)
			{
				if(time[0]%2==0)
					{
						yi=alarm[2]/10;er=alarm[2]%10;san=10;
						si=alarm[1]/10;wu=alarm[1]%10;liu=10;
						qi=alarm[0]/10;ba=alarm[0]%10;
					}
					else if(time[0]%2!=0)
					{
						yi=alarm[2]/10;er=alarm[2]/10;san=10;
						si=alarm[1]/10;wu=alarm[1]/10;liu=10;
						qi=11;ba=11;
					}
				}
			}
		else if(wendu_show==1)
		{
			yi=11;er=11;san=11;si=11;wu=11;
			liu=temperature/10;qi=temperature%10;ba=12;
		}	
	}
}
void Timer0() interrupt 1
{
	static u16 led_count=0,lednum_count=0;
	static u8 wendu_count=0;
	wendu_count++;
	if(wendu_count==100)  
	{
		wendu_count=0;
		wendu_flag=1;
	}
	else if(led==1)
	{
		led_count++;
		lednum_count++;
		if(led_count==100)
		{
			led_count=0;
			if(led_shanshuo==0)
			{
				led_shanshuo=1;
				P2=(P2&0X1F)|0X80;
				P0=0XFE;
				P2&=0X1F;
			}
			else if(led_shanshuo==1)
			{
				led_shanshuo=0;
				P2=(P2&0X1F)|0X80;
				P0=0XFF;
				P2&=0X1F;
			}
		}
		if(lednum_count==2500)
		{
			lednum_count=0;
			led_flag=1;
			led=0;
			P2=(P2&0X1F)|0X80;
			P0=0XFF;
			P2&=0X1F;
		}
	}
	
	LedScan();
	keyscan();
}

/*KEY*/
#include <key.h>
#include <ds1302.h>
#include "seg.h"

extern u8 yi,er,san,si,wu,liu,qi,ba;
extern u8 clock_set;  //时钟设定时分秒标志位
extern u8 alarm_set;  //闹钟设定时分秒标志位
extern bit clock_show;  //时钟显示界面标志
extern bit alarm_show;  //闹钟显示界面标志
extern bit wendu_show;

extern bit led;   //闹钟提示灯
extern bit led_flag;  //灯亮了五秒标志位

extern bit set;    //时钟设置界面标志位 
u8 time_init[7];   //时钟时间数组及初始时间数组
extern u8 alarm[7];  //闹钟时间数组

u8 keysta[4]={1,1,1,1};
u8 keycodemap[4]={1,2,3,4};
u8 keydowntime[]={0,0,0,0};
	
void keydriver()
{
	u8 i;
	static u8 backup[]={1,1,1,1};
	static u8 timestr[]={1000,1000,1000,1000};
	
	for(i=0;i<4;i++)
	{
		if(keysta[i]!=backup[i])
		{
			if(backup[i]!=0)
			{
				keyaction(keycodemap[i]);
			}
			backup[i]=keysta[i];
		}
		else if(keydowntime[i]>timestr[i])
		{
			if(i==3)
			{
				keyaction(keycodemap[i]);
				timestr[i]+=4;
			}
		}
	}
}

void keyscan()
{
	u8 i;
	static u8 keybuff[]={0xff,0xff,0xff,0xff};
	keybuff[0]=(keybuff[0]<<1)|S7;
	keybuff[1]=(keybuff[1]<<1)|S6;
	keybuff[2]=(keybuff[2]<<1)|S5;
	keybuff[3]=(keybuff[3]<<1)|S4;
	
	for(i=0;i<4;i++)
	{
		if(keybuff[i]==0xff)
		{
			keysta[i]=1;
			keydowntime[i]=0;
			if(i==3)
			{
				wendu_show=0;
			}
		}
		else if(keybuff[i]==0x00)
		{
			keysta[i]=0;
			keydowntime[i]+=200;
		}
		else{}
	}
}

void keyaction(u8 keycode)
{
	if(keycode==1)
	{
		if(led==1)   //判断闹钟时间是否到了,到了随机按下按键即停止小灯闪烁
		{
			led=0;
			led_flag=1;
			P2=(P2&0x1f)|0x80;
			P0=0XFF;
			P2&=0X1F;
		}
		else if(clock_show==1)
		{
			if(set==0)   //如果在非设置界面 切换到设置界面
			{
				set=1;
			}
			else if(set==1)
			{
				if(clock_set==0)   //当前设置在时,按一下在分
				{
					clock_set=1;
				}
				else if(clock_set==1)  //当前设置在分,按一下在秒
				{
					clock_set=2;
				}
				else if(clock_set==2)  
				{
					clock_set=0;
					set=0;    //最后回到非设置界面
				}
			}
		}
	}
	
	if (keycode==2)
	{
		if(led==1)   //判断闹钟时间是否到了,到了随机按下按键即停止小灯闪烁
		{
			led=0;
			led_flag=1;
			P2=(P2&0x1f)|0x
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值