蓝桥杯单片机第十一届国赛

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "stdio.h"
#include "onewire.h"
#include "ds1302.h"  
#include "iic.h"

#define uchar unsigned char
#define uint unsigned int

extern unsigned char shijian[7];

//LED开关
uchar led_bit=0xff;
#define led_on(n) {led_bit&=_crol_(0xfe,n-1);P0=led_bit;P2|=0x80;P2&=0x9f;P2&=0x1f;}
#define led_off(n){led_bit|=_crol_(0x01,n-1);P0=led_bit;P2|=0x80;P2&=0x9f;P2&=0x1f;}

uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,\
									0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,\
									0XBF,0XFF,0XC6,0x86,0X8C};
uchar Digbuf[]={0,1,2,3,4,5,6,7};
uchar Digcom=0;

void Allinit();
void delayms(uint ms);
void Timer2Init(void);
void GID_Show();
void keyscan16();
void LED_Show();

uint wendu=0;
uchar inter_face1=0;  //数据,参数界面切换
uchar inter_face2=0;   //数据子界面
uchar inter_face3=0;//参数子界面
uchar voltage=0;
char shi_can=17;  //小时参数
char wen_can=25;  //温度参数
char led_can=4;  //指示灯参数
uint tt1=0,tt2=0;

void main(void)
{
	Allinit();
	Timer2Init();
	DS_init();
	
	while(1)
	{
		voltage=AD_Read(0x01); //光敏分压
		voltage=AD_Read(0x01);
		wendu=Temper_Get();
		DS_Get();
		
		LED_Show();
		

		keyscan16();
		GID_Show();
	}
}
void GID_Show()
{
	if(inter_face1==0)  //数据界面
	{
		if(inter_face2==0)  //时间数据显示
		{
			Digbuf[0]=shijian[2]/10;Digbuf[1]=shijian[2]%10;Digbuf[2]=20;
			Digbuf[3]=shijian[1]/10;Digbuf[4]=shijian[1]%10;Digbuf[5]=20;
			Digbuf[6]=shijian[0]/10;Digbuf[7]=shijian[0]%10;
		}
		else if(inter_face2==1)  //温度数据显示
		{
			Digbuf[0]=22;Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;
			Digbuf[5]=wendu/1000;Digbuf[6]=wendu%1000/100+10;Digbuf[7]=wendu%100/10;
		}
		else if(inter_face2==2)
		{
			Digbuf[0]=23;Digbuf[1]=21;Digbuf[2]=voltage/100+10;Digbuf[3]=voltage%100/10;Digbuf[4]=voltage%10;
			Digbuf[5]=21;Digbuf[6]=21;
			if(voltage<50){Digbuf[7]=1;}  //暗
			else Digbuf[7]=0;    //亮
		}
	}
	else if(inter_face1==1)  //参数界面
	{
		if(inter_face3==0)   //时间参数
		{
			Digbuf[0]=24;Digbuf[1]=1;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;
			Digbuf[6]=shi_can/10;Digbuf[7]=shi_can%10;
		}
		else if(inter_face3==1)   //温度参数
		{
			Digbuf[0]=24;Digbuf[1]=2;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;
			Digbuf[6]=wen_can/10;Digbuf[7]=wen_can%10;
		}
		else if(inter_face3==2)   //指示灯参数
		{
			Digbuf[0]=24;Digbuf[1]=2;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;Digbuf[6]=21;
			Digbuf[7]=led_can;
		}
	}
}
void LED_Show()
{
	if(shi_can<=7)
	{
		if((shijian[2]>=shi_can)&&(shijian[2]<=8)){led_on(1);}
		else {led_off(1);}
	}
	else if(shi_can>7)
	{
		if(((shijian[2]>=shi_can)&&(shijian[2]<=23))||((shijian[2]>=0)&&(shijian[2]<=8))){led_on(1);}
		else {led_off(1);}
	}
	
	if(wendu<wen_can*100){led_on(2);}  //温度
	else {led_off(2);}
	
  if(voltage<50)  //暗
	{
		if(led_can==4){led_on(4);led_off(5);led_off(6);led_off(7);led_off(8);}
		else if(led_can==5){led_off(4);led_on(5);led_off(6);led_off(7);led_off(8);}
		else if(led_can==6){led_off(4);led_off(5);led_on(6);led_off(7);led_off(8);}
		else if(led_can==7){led_off(4);led_off(5);led_off(6);led_on(7);led_off(8);}
		else if(led_can==8){led_off(4);led_off(5);led_off(6);led_off(7);led_on(8);}
	}
}
void keyscan16()
{
	P44=0;P42=1;
	if(P32==0)//s5 子界面切换
	{
		delayms(5);
		if(P32==0)
		{
			if(inter_face1==0) //数据界面
			{
				if(inter_face2==0){inter_face2=1;}
				else if(inter_face2==1){inter_face2=2;}
				else if(inter_face2==2){inter_face2=0;}
			}
			else if(inter_face1==1)  //参数界面
			{
				if(inter_face3==0){inter_face3=1;}
				else if(inter_face3==1){inter_face3=2;}
				else if(inter_face3==2){inter_face3=0;}
			}
		}
		while(!P32);
	}
	else if(P33==0)  //s4  数据,参数界面切换
	{
		delayms(5);
		if(P33==0)
		{
			if(inter_face1==0){inter_face1=1;inter_face3=0;}
			else if(inter_face1==1){inter_face1=0;inter_face2=0;}
		}
		while(!P33);
	}
	P44=1;P42=0;
	if(P32==0) //s9  +
	{
		delayms(5);
		if(P32==0)
		{
			if(inter_face1==1)//参数界面加
			{
				if(inter_face3==0)//小时参数  00-23
				{
					shi_can++;
					if(shi_can>=23)shi_can=23;
				}
				else if(inter_face3==1) //温度参数  00-99
				{
					wen_can++;
					if(wen_can>=99)wen_can=99;
				}
				else if(inter_face3==2)//指示灯参数 4-8
				{
					led_can++;
					if(led_can>=8)led_can=8;
				}
			}
		}
		while(!P32);
	}
	else if(P33==0)  //s8   —
	{
		delayms(5);
		if(P33==0)
		{
			if(inter_face1==1)//参数界面加
			{
				if(inter_face3==0)//小时参数  00-23
				{
					shi_can--;
					if(shi_can<=0)shi_can=0;
				}
				else if(inter_face3==1) //温度参数  00-99
				{
					wen_can--;
					if(wen_can<=0)wen_can=0;
				}
				else if(inter_face3==2)//指示灯参数 4-8
				{
					led_can--;
					if(led_can<=4)led_can=4;
				}
			}			
		}
		while(!P33);
	}	
}
void Timer2Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0x20;		//设置定时初值
	T2H = 0xD1;		//设置定时初值
	AUXR |= 0x10;		//定时器2开始计时
	IE2|=0X04;
	EA=1;
}
void timer2() interrupt 12
{
	P0=0XFF;
	P2|=0XC0;P2&=0XDF;P2&=0X1F;
	P0=0XFF;
	P2|=0XE0;P2&=0XFF;P2&=0X1F;
	P0=(1<<Digcom);
	P2|=0XC0;P2&=0XDF;P2&=0X1F;
	P0=tab[Digbuf[Digcom]];
	P2|=0XE0;P2&=0XFF;P2&=0X1F;
	
	if(++Digcom==8)Digcom=0;
	
	if(voltage<50)  //暗
	{
		tt2=0;
		tt1++;
		if(tt1>=3000)
		{
			tt1=0;
			led_on(3);
		}
	}
	else //亮
	{
		tt1=0;
		tt2++;
		if(tt2>=3000)
		{
			tt2=0;
			led_off(3);
		}
	}
	
	if(voltage<50)  //暗
	{
		if(led_can==4){led_on(4);led_off(5);led_off(6);led_off(7);led_off(8);}
		else if(led_can==5){led_off(4);led_on(5);led_off(6);led_off(7);led_off(8);}
		else if(led_can==6){led_off(4);led_off(5);led_on(6);led_off(7);led_off(8);}
		else if(led_can==7){led_off(4);led_off(5);led_off(6);led_on(7);led_off(8);}
		else if(led_can==8){led_off(4);led_off(5);led_off(6);led_off(7);led_on(8);}
	}
	else {led_off(4);led_off(5);led_off(6);led_off(7);led_off(8);}
}
void Allinit()
{
	P0=0X00;P2|=0XA0;P2&=0XBF;P2&=0X1F;
	P0=0XFF;P2|=0X80;P2&=0X9F;P2&=0X1F;
	P0=0XFF;P2|=0XC0;P2&=0XDF;P2&=0X1F;
	P0=0XFF;P2|=0XE0;P2&=0XFF;P2&=0X1F;
}
void delayms(uint ms)
{
	uint i,j;
	for(i=0;i<ms;i++)
	for(j=845;j>0;j--);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值