蓝桥杯第13届省赛

#include <STC15F2K60S2.H>
#include <Seg.H>
#include <Buzzer.H>
#include <Timer0.H>
#include <Key.H>
#include <Led.H>
#include <DS1302.H>
#include <ONEWIRE.H>
#include <IIC.H>

unsigned char Key_Val,Key_Old,Key_Down,Key_Up;
unsigned char Key_Slow_Down;
unsigned char Seg_Slow_Down;
unsigned char Seg_Buf[]={10,10,10,10,10,10,10,10};
unsigned char Seg_Pos;
unsigned char Dot_Table[]={0,0,0,0,0,0,0,0};
unsigned char ucLed[]={0,0,0,0,0,0,0,0};
unsigned char ucRtc[]={0x23,0x59,0x50};
unsigned char Seg_Mode;  //0-温度显示 1-时间显示 2-参数设置
float T;
float T_Set=23;
bit Control_Mode;  //0-温度控制 1-时间控制
unsigned int Timer_5000ms;
bit Time_Control_Flag;
bit Led_Flag;
unsigned int Timer_50ms;

void Key_Proc()
{
    if(Key_Slow_Down) return;
    Key_Slow_Down=1;
    
    Key_Val=Key_Read();
    Key_Down=Key_Val&(Key_Val^Key_Old);
    Key_Up=~Key_Val&(Key_Val^Key_Old);
    Key_Old=Key_Val;
    
    if(Seg_Mode==1)
    {
        if(Key_Old==17)
        {
            Seg_Buf[3]=ucRtc[1]/16;
            Seg_Buf[4]=ucRtc[1]%16;
            Seg_Buf[6]=ucRtc[2]/16;
            Seg_Buf[7]=ucRtc[2]%16;
        }
        if(Key_Up==17)
        {
            Seg_Buf[3]=ucRtc[0]/16;
            Seg_Buf[4]=ucRtc[0]%16;
            Seg_Buf[6]=ucRtc[1]/16;
            Seg_Buf[7]=ucRtc[1]%16;
        }
    }
        
    
    switch (Key_Down)
    {
        case 12:    //模式切换
            if(++Seg_Mode==3)
                Seg_Mode=0;
        break;
            
        case 13:
            Control_Mode^=1;
        break;
        
        case 16:  //+
            if(Seg_Mode==2)
            {
                T_Set++;
                if(T_Set==100)
                    T_Set=99;
            }
        break;
        
        case 17:  //-
            if(Seg_Mode==2)
            {
                T_Set--;
                if(T_Set==9)
                    T_Set=10;
            }
        break;
    }
}

void Seg_Proc()
{
    if(Seg_Slow_Down) return;
    Seg_Slow_Down=1;
    
    T=T_Read();
    Read_Rtc(ucRtc);
    
    switch (Seg_Mode)
    {
        case 0:
            Seg_Buf[0]=11;
            Seg_Buf[1]=1;
            Seg_Buf[2]=10;
            Seg_Buf[3]=10;
            Seg_Buf[4]=10;
            Seg_Buf[5]=(int)(T*10)/100%10;
            Seg_Buf[6]=(int)(T*10)/10%10;
            Seg_Buf[7]=(int)(T*10)%10;
            Dot_Table[6]=1;
        break;
        
        case 1:
            Seg_Buf[0]=11;
            Seg_Buf[1]=2;
            Seg_Buf[2]=10;
            Seg_Buf[3]=ucRtc[0]/16;
            Seg_Buf[4]=ucRtc[0]%16;
            Seg_Buf[5]=12;
            Seg_Buf[6]=ucRtc[1]/16;
            Seg_Buf[7]=ucRtc[1]%16;
            Dot_Table[6]=0;
        break;
        
        case 2:
            Seg_Buf[0]=11;
            Seg_Buf[1]=3;
            Seg_Buf[2]=10;
            Seg_Buf[3]=10;
            Seg_Buf[4]=10;
            Seg_Buf[5]=10;
            Seg_Buf[6]=T_Set/10;
            Seg_Buf[7]=(int)T_Set%10;
        break;
    }

}

void Led_Proc()
{
    if(Control_Mode==0)  //温度控制
    {
        ucLed[1]=1;
        if(T_Set<T)
        {            
            Relay(1);
            ucLed[2]=Led_Flag?1:0;
        }
        else
        {
            Relay(0);
            ucLed[2]=0;
        }
    }
    if(Control_Mode==1)  //时间控制
    {
        ucLed[1]=0;
        if(ucRtc[1]==0x00&&ucRtc[2]==0x00)
            Time_Control_Flag=1;
        if(Time_Control_Flag==1)
        {
            Relay(1);
            ucLed[0]=1;
            ucLed[2]=Led_Flag?1:0;
        }
        if(Time_Control_Flag==0)
        {
            Relay(0);
            ucLed[0]=0;
            ucLed[2]=0;
        }
    }
}

void Delay750ms(void)    //@12.000MHz
{
    unsigned char data i, j, k;
    i = 35;
    j = 51;
    k = 182;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


void main()
{
    T_Read();
    Delay750ms();
    Timer0_Init();
    Buzzer_Init();
    Set_Rtc(ucRtc);
  while(1)
  {
    Key_Proc();
        Seg_Proc();
        Led_Proc();
  }
}

void Timer0_Routine() interrupt 1
{
    TL0 = 0x18;                //设置定时初始值
    TH0 = 0xFC;                //设置定时初始值
    if(++Key_Slow_Down==20)  Key_Slow_Down=0;
    if(++Seg_Slow_Down==200)  Seg_Slow_Down=0;
    if(++Seg_Pos==8)  Seg_Pos=0;
    Seg_Disp(Seg_Pos+1,Seg_Buf[Seg_Pos],Dot_Table[Seg_Pos]);
  Led_Disp(Seg_Pos+1,ucLed[Seg_Pos]);        
    if(Time_Control_Flag==1)
    {
        if(++Timer_5000ms==5000)
        {
            Timer_5000ms=0;
            Time_Control_Flag=0;
        }
    }
    if(++Timer_50ms==50)
    {
        Timer_50ms=0;
        Led_Flag^=1;
    }
}

这是main.c里的内容,我按照b站西风写的,底层代码西风视频里有,都说挺难的,我感觉也没啥

-_-

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值