#include <control.H>
uchar POS;
ulong systick;
uchar devies_dly;
uchar key_num;
uint Fre;
uint Fre_END;
uint Fre_new;
uint Fre_old;
uint P1_warn = 2000;//超限
uint P2_up;
uint P2_down;
uint Fre_max; //最大
uint max_comper_old;
uint max_comper_new;
uint P2_compare=0;//校准
uchar DAC_put; //DAC输出
uchar key4_flage;
uchar key5_flage1;
uchar key5_flage2;
uchar key8_flage;
uchar key9_flage;
uchar led1_flage;
uchar led2_flage;
uchar max_flage;
bit read_flage;
bit time_flage;
bit Buzzer;
bit Relay;
uchar Timer_max[] = {0,0,0};
//*******************************************
//void devies_init() //外设初始化
//{
// if(devies_dly) return;
//
//}
//*******************************************
void smg_working(uchar channel) //显示任务
{
switch(channel)
{
case 1: //频率界面
SMG[0] = 13;
SMG[1] = 12;
SMG[2] = 12;
SMG[3] = (Fre<10000) ? 12 : Fre/10000;
SMG[4] = (Fre<1000) ? 12 : Fre/1000%10;
SMG[5] = (Fre<100) ? 12 : Fre%1000/100;
SMG[6] = (Fre<10) ? 12 : Fre%100/10;
SMG[7] = Fre%10;
break;
case 2: //参数界面
SMG[0] = 14;
SMG[1] = 1;
SMG[2] = 12;
SMG[3] = 12;
SMG[4] = (P1_warn<1000) ? 12 : P1_warn/1000;
SMG[5] = (P1_warn<100) ? 12 : P1_warn/100%10;
SMG[6] = (P1_warn<10) ? 12 : P1_warn%100/10;
SMG[7] = P1_warn%10;
break;
case 3:
SMG[0] = 14;
SMG[1] = 2;
SMG[2] = 12;
SMG[3] = 12;
SMG[4] = 12;
SMG[5] = (P2_compare<100) ? 12 : P2_compare/100;
SMG[6] = (P2_compare<10) ? 12 : P2_compare/10%10;
SMG[7] = P2_compare%10;
break;
case 4:
SMG[0] = 14;
SMG[1] = 2;
SMG[2] = 12;
SMG[3] = 12;
SMG[4] = 10;
SMG[5] = (P2_down<100) ? 12 : P2_down/100;
SMG[6] = (P2_down<10) ? 12 : P2_down/10%10;
SMG[7] = P2_down%10;
break;
case 5:
SMG[0] = Timer_Read[2]/16;
SMG[1] = Timer_Read[2]%16;
SMG[2] = 10;
SMG[3] = Timer_Read[1]/16;
SMG[4] = Timer_Read[1]%16;
SMG[5] = 10;
SMG[6] = Timer_Read[0]/16;
SMG[7] = Timer_Read[0]%16;
break;
case 6:
SMG[0] = 15;
SMG[1] = 13;
SMG[2] = 12;
SMG[3] = (Fre_max<10000) ? 12 : Fre_max/10000;
SMG[4] = (Fre_max<1000) ? 12 : Fre_max/1000%10;
SMG[5] = (Fre_max<100) ? 12 : Fre_max%1000/100;
SMG[6] = (Fre_max<10) ? 12 : Fre_max%100/10;
SMG[7] = Fre_max%10;
break;
case 7:
SMG[0] = 15;
SMG[1] = 16;
SMG[2] = Timer_max[2]/16;
SMG[3] = Timer_max[2]%16;
SMG[4] = Timer_max[1]/16;
SMG[5] = Timer_max[1]%16;
SMG[6] = Timer_max[0]/16;
SMG[7] = Timer_max[0]%16;
break;
case 8:
SMG[0] = 13;
SMG[1] = 12;
SMG[2] = 12;
SMG[3] = 12;
SMG[4] = 12;
SMG[5] = 12;
SMG[6] = 17;
SMG[7] = 17;
break;
}
}
//*******************************************
void key_working()
{
key_num = key_2x2_scan();
switch(key_num)
{
case 4: key4_flage = (1+key4_flage)%4;
break;
case 5:
if(key4_flage == 1){key5_flage1 = 1-key5_flage1;}
if(key4_flage == 3){key5_flage2 = 1-key5_flage2;}
break;
case 8: key8_flage = 1; key9_flage = 0;
break;
case 9: key9_flage = 1; key8_flage = 0;
break;
}
if(key4_flage == 0)
{
key5_flage1=key5_flage2 = 0;
if(Fre_END >=0 && Fre_END <64636)smg_working(1);
if(Fre_END >64636)smg_working(8);
}
else if(key4_flage == 1)
{
if(key5_flage1 == 0)
{
smg_working(2);
if(key8_flage == 1)
{
P1_warn = P1_warn +1000;
if(P1_warn > 9000) P1_warn = 9000;
key8_flage = 0;
}
if(key9_flage == 1)
{
P1_warn = P1_warn -1000;
if(P1_warn < 1000) P1_warn = 1000;
key9_flage = 0;
}
}
else if(key5_flage1 == 1)
{
if(key8_flage == 1)
{
P2_compare = P2_compare + 100;
if(P2_compare > 900 && P2_compare < 64636) P2_compare = 900;
if(P2_compare>64636)
{
P2_down = 65536-P2_compare;
if(P2_compare < 64636) P2_compare = 64636;
}
key8_flage = 0;
}
if(key9_flage == 1)
{
P2_compare = P2_compare - 100;
if(P2_compare<=900 && P2_compare>=0) P2_compare = P2_compare;
if(P2_compare>900)
{
if(P2_compare <= 64636) P2_compare = 64636;
P2_down = 65536-P2_compare;
}
key9_flage = 0;
}
if(P2_compare>=0 && P2_compare<=900) smg_working(3);
if(P2_compare>900) smg_working(4);
}
}
else if(key4_flage == 2) smg_working(5);
else if(key4_flage == 3)
{
if(key5_flage2 == 0){smg_working(6);}
else if(key5_flage2 == 1){smg_working(7);}
}
}
//*******************************************
void solve_data()
{
if(P2_compare<=900 && P2_compare>=0){Fre_END = Fre + P2_compare;}
if(P2_compare>900){Fre_END = Fre - P2_down;}
DAC_put = ((4.0*P1_warn/((P1_warn-500)*1.0)) + 1 - 2000/((P1_warn-500)*1.0))*51.0;
if(Fre_END<500 && Fre_END>=0) {PCF8591_Write(0x40,51);}
else if(Fre_END>=500 && Fre_END<=P1_warn){PCF8591_Write(0x40,DAC_put);}
else if(Fre_END>P1_warn && Fre_END<64636){PCF8591_Write(0x40,255);}
else if(Fre_END >64636){PCF8591_Write(0x40,0);}
}
//*******************************************
void task_working()
{
uchar i;
ds1302_timer_read();
key_working();
solve_data();
if(key4_flage == 0){led1_flage = 1;}
if(key4_flage > 0) {led1_flage = 0;LED[0] = 0;}
if(Fre_END >=0 && Fre_END <64636)
{
if(Fre_END > P1_warn){led2_flage = 1;}
if(Fre_END <= P1_warn){led2_flage = 2;}
}
if( Fre_END > 64636){led2_flage = 3;}
if(max_flage == 1)
{
if(Fre_new >= Fre_old)
{
Fre_max = Fre_new;
for(i = 0; i < 3; i++){Timer_max[i] = Timer_Read[i];}
Fre_old = Fre_new;
}
else if(Fre_new < Fre_old)
{
Fre_max = Fre_old;
for(i = 0; i < 3; i++){Timer_max[i] = Timer_max[i];}
Fre_old = Fre_old;
}
}
}
//*******************************************
void system_init()
{
ds1302_timer_write();
Timer_Fre_Init();
EA = 1;
HC138_Init(0,0x00);
HC138_Init(5,0x00);
HC138_Init(4,0xff);
}
//*******************************************
void Timer_server() interrupt 3
{
systick ++;
if(systick%1000 == 0)
{
Fre = TH0 * 256 +TL0;
TH0 = TL0 = 0;
}
if(led1_flage == 1){if(systick%200 == 0){LED[0] = ~LED[0];}}
if(led2_flage == 1){if(systick%200 == 0){LED[1] = ~LED[1];}}
else if(led2_flage == 2){LED[1] = 0;}
else if(led2_flage == 3){LED[1] = 1;}
if(read_flage == 0)
{
read_flage = 1;
if(Fre_END >=0 && Fre_END <64536){Fre_old = Fre_END;}
else if(Fre_END >= 64536){Fre_old = Fre;}
}
else
{
if(systick%50 == 0)
{
if(Fre_END >=0 && Fre_END <64536){Fre_new = Fre_END;}
else if(Fre_END >= 64536){Fre_new = Fre;}
if(Fre_new > Fre_old || Fre_new < Fre_old){max_flage = 1;}
else if(Fre_new == Fre_old) max_flage = 0;
}
}
led_display(LED,POS);
smg_display(SMG,DOT,POS);
if(++POS == 8) POS = 0;
}
15届蓝桥杯大赛电子赛第一批代码
于 2024-05-12 22:03:34 首次发布