第十五届蓝桥杯单片机省一代码


前言

  今年单片机试题比14届可以说是简单太多了(参加过14届,直接被创死555),题主提前两小时就交卷了,最后也是稳定拿下省一进入国赛(嘿嘿)。
在这里插入图片描述


一、问题重现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、代码实现

  下面给出main.c,而其他部分子函数由于较为基础,不再赘述。可前往stc15单片机进一步了解其他子函数的来源。

#include "main.h"
#include "key_smg.h"
#include "timer.h"
#include "ds1302.h"
#include "iic.h"

u8 smgflash=0;
u8 showpage=0,setpage=0,huixianpage=0;

u8 keyflash=0,keytemp=0,keynum=0;

u16 f=0,fflash=0,flimit=2000;
u8 fmaxtime[3]={0,0,0};
int fjiaozun=0;
long ftemp=0,fmax=0;

u8 led[]={1,1,1,1,1,1,1,1};u8 led1=0;
#define ledset outputp0(0x80,led[0]*1+led[1]*2+led[2]*4+led[3]*8+led[4]*16+led[5]*32+led[6]*64+led[7]*128)

void smgshowflash();
void keyfun();
void page0();
void page1();
void page2();
void page3();

void smgshowpage()
{
	if(showpage==0)
	{
		page0();
	}
	else if(showpage==1)
	{
		page1();
		
	}
	else if(showpage==2)
	{
		page2();
		
	}
	else if(showpage==3)
	{
		page3();
		
	}
	
}
void fun()
{
	if(ftemp>fmax)
	{
		fmax=ftemp;
		ds1302read();
		fmaxtime[0]=ds1302dectime[0];
		fmaxtime[1]=ds1302dectime[1];
		fmaxtime[2]=ds1302dectime[2];
	}
	if(ftemp<0)
	{
		pcf_da(0);	
	}
	else if(ftemp<=500&&ftemp>=0)
	{
		pcf_da(51);
	}
	else if(ftemp<=fmax&&ftemp>500)
	{
		pcf_da(256*4*(ftemp-500)/(fmax-500)/5+256/5);		
	}
	
	if(led1>=200)
	{
		led1=0;
		if(showpage==0)
		{
			if(ftemp>flimit)
			{			
				led[0]=!led[0];
				led[1]=!led[1];
				ledset;
			}
			else if(ftemp<=flimit)
			{
				if(ftemp>=0)
				{
					led[1]=1;
					led[0]=!led[0];
					ledset;
				}
				else if(ftemp<0)
				{
					led[1]=0;
					led[0]=!led[0];
					ledset;
				}				
			}
			
		}
		else if(showpage!=0)
		{
			led[0]=1;
			if(ftemp>flimit)
			{			
				led[1]=!led[1];
				ledset;
			}
			else if(ftemp<=flimit)
			{
				if(ftemp>=0)
				{
					led[1]=1;
					ledset;
				}
				else if(ftemp<0)
				{
					led[1]=0;
					ledset;
				}				
			}
			
		}

	}

}

void Delay1000ms(void)	//@11.0592MHz
{
	unsigned char data i, j, k;

	_nop_();
	_nop_();
	i = 43;
	j = 6;
	k = 203;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	outputp0(0x80,0xff);
	outputp0(0xa0,0x00);
	
	ds1302set();
	Timer1_Init();
	Timer0_Init();
	Delay1000ms();
	while(1)
	{
		keyfun();fun();smgshowpage();	
	}
}

void Timer0_Isr(void) interrupt 1
{
	f++;
}

void Timer1_Isr(void) interrupt 3
{
	smgflash++;smgshowflash();
	
	keyflash++;	
	
	fflash++;
	if(fflash>=1000)
	{
		fflash=0;
		ftemp=f;
		ftemp+=fjiaozun;
		f=0;
	}	
	led1++;	
}

void keyfun()
{
	if(keyflash>=25)
	{
		keyflash=0;
		keytemp=keyvalue();
	}
	if(keytemp)
	{
		keynum=keytemp;
		keytemp=0;		
	}
	if(keynum==4)
	{
		showpage++;
		showpage%=4;
		smgoff();	
		if(showpage==1)
		{
			setpage=0;
		}
		else if(showpage==3)
		{
			huixianpage=0;
		}		
		keynum=0;
	}
	else if(keynum==5)
	{
		if(showpage==1)
		{
			setpage++;
			setpage%=2;
			smgoff();		
		}
		else if(showpage==3)
		{
			huixianpage++;
			huixianpage%=2;
			smgoff();		
		}
		keynum=0;
	}
	else if(keynum==8)
	{
		if(showpage==1)
		{
			if(setpage==0)
			{
				flimit+=1000;
				if(flimit>=10000)
					flimit=1000;			
			}
			if(setpage==1)
			{
				fjiaozun+=100;
				if(fjiaozun>=1000)
					fjiaozun=-900;			
			}			
		}	
		keynum=0;
	}
	else if(keynum==9)
	{
		if(showpage==1)
		{
			if(setpage==0)
			{
				flimit-=1000;
				if(flimit<=0)
					flimit=9000;			
			}
			if(setpage==1)
			{
				fjiaozun-=100;
				if(fjiaozun<=-1000)
					fjiaozun=900;			
			}			
		}	
		keynum=0;
	}
}

void smgshowflash()
{
	if(smgflash>=2)
	{
		smgflash=0;
		smgloop();	
	}
}

void page0()
{
	segsy[0]=15;
	if(ftemp>=10000)
	{		
		segsy[3]=ftemp/10000%10;
		segsy[4]=ftemp/1000%10;
		segsy[5]=ftemp/100%10;
		segsy[6]=ftemp/10%10;
		segsy[7]=ftemp%10;	
	}
	else if(ftemp>=1000)
	{		
		segsy[3]=16;
		segsy[4]=ftemp/1000%10;
		segsy[5]=ftemp/100%10;
		segsy[6]=ftemp/10%10;
		segsy[7]=ftemp%10;	
	}
	else if(ftemp>=100)
	{		
		segsy[3]=16;
		segsy[4]=16;
		segsy[5]=ftemp/100%10;
		segsy[6]=ftemp/10%10;
		segsy[7]=ftemp%10;	
	}
	else if(ftemp>=10)
	{		
		segsy[3]=16;
		segsy[4]=16;
		segsy[5]=16;
		segsy[6]=ftemp/10%10;
		segsy[7]=ftemp%10;	
	}
	else if(ftemp>=0)
	{		
		segsy[3]=16;
		segsy[4]=16;
		segsy[5]=16;
		segsy[6]=16;
		segsy[7]=ftemp%10;	
	}
	else if(ftemp<0)
	{
		segsy[3]=16;
		segsy[4]=16;
		segsy[5]=16;
		segsy[6]=20;
		segsy[7]=20;	
	}
}
void page1()
{
	if(setpage==0)
	{
		segsy[0]=18;
		segsy[1]=1;		
		segsy[4]=flimit/1000%10;
		segsy[5]=flimit/100%10;
		segsy[6]=flimit/10%10;
		segsy[7]=flimit%10;	
	}
	else if(setpage==1)
	{
		segsy[0]=18;
		segsy[1]=2;		
		if(fjiaozun<0)
		{					
			segsy[4]=17;
			segsy[5]=-1*fjiaozun/100%10;
			segsy[6]=-1*fjiaozun/10%10;
			segsy[7]=-1*fjiaozun%10;	
		}
		else if(fjiaozun>0)
		{
			segsy[4]=16;
			segsy[5]=fjiaozun/100%10;
			segsy[6]=fjiaozun/10%10;
			segsy[7]=fjiaozun%10;	
		}
		else if(fjiaozun==0)
		{
			segsy[4]=16;
			segsy[5]=16;
			segsy[6]=16;
			segsy[7]=0;	
		}		
	}	
}
void page2()
{
	ds1302read();
	
	segsy[0]=ds1302dectime[0]/10;
	segsy[1]=ds1302dectime[0]%10;	
	segsy[2]=17;
	segsy[3]=ds1302dectime[1]/10;
	segsy[4]=ds1302dectime[1]%10;	
	segsy[5]=17;
	segsy[6]=ds1302dectime[2]/10;
	segsy[7]=ds1302dectime[2]%10;	

}
void page3()
{
	if(huixianpage==0)
	{
		segsy[0]=19;
		segsy[1]=15;		
		if(fmax>=10000)
		{		
			segsy[3]=fmax/10000%10;
			segsy[4]=fmax/1000%10;
			segsy[5]=fmax/100%10;
			segsy[6]=fmax/10%10;
			segsy[7]=fmax%10;	
		}
		else if(fmax>=1000)
		{		
			segsy[3]=16;
			segsy[4]=fmax/1000%10;
			segsy[5]=fmax/100%10;
			segsy[6]=fmax/10%10;
			segsy[7]=fmax%10;	
		}
		else if(fmax>=100)
		{		
			segsy[3]=16;
			segsy[4]=16;
			segsy[5]=fmax/100%10;
			segsy[6]=fmax/10%10;
			segsy[7]=fmax%10;	
		}
		else if(fmax>=10)
		{		
			segsy[3]=16;
			segsy[4]=16;
			segsy[5]=16;
			segsy[6]=fmax/10%10;
			segsy[7]=fmax%10;	
		}
		else if(fmax>=0)
		{		
			segsy[3]=16;
			segsy[4]=16;
			segsy[5]=16;
			segsy[6]=16;
			segsy[7]=fmax%10;	
		}
	}	
	else if(huixianpage==1)
	{
		segsy[0]=19;
		segsy[1]=10;		
		segsy[2]=fmaxtime[0]/10;
		segsy[3]=fmaxtime[0]%10;	
		segsy[4]=fmaxtime[1]/10;
		segsy[5]=fmaxtime[1]%10;	
		segsy[6]=fmaxtime[2]/10;
		segsy[7]=fmaxtime[2]%10;
	}	
}

总结

  国赛冲冲冲!!!

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值