#include "STC15F2K60S2.h"
#include "Init.h"
#include "Seg.h"
#include "Key.h"
#include "Led.h"
#include "iic.h"
#include "ds1302.h"
unsigned char Seg_Slow_Down;
unsigned char Key_Slow_Down;
unsigned char Key_Val,Key_Old,Key_Down,Key_Up;
unsigned char Seg_Pos;
unsigned char Seg_Buf8={10,10,10,10,10,10,10,10};
unsigned char Seg_Point8 ={0,0,0,0,0,0,0,0};
unsigned char ucLed8 = {0,0,0,0,0,0,0,0};
unsigned int Timer1s;
unsigned int Freq;
float temp;
unsigned char Seg_Disp_Mode;//0-频率 1-参数 2-时间 3-回显
unsigned char Param_Mode;
int Param_Max =2000;
int Param_Disp=200;
int Param_Ctrol=200;
unsigned char ucRtc3 ={0x20,0x23,0x22};
unsigned int Freq_Max =0;
unsigned char ucRtc_Max\[\] = {0x00,0x00,0x00};
unsigned char Choice_Index;
unsigned char Timer_200ms;
bit Star_Flag;
float Vol;
void Key_Proc()
{
if(Key_Slow_Down) return;
Key_Slow_Down =1;
Key_Val = Key_Read();
Key_Down =Key_Val&(Key_Old^Key_Val);
Key_Up =~Key_Val&(Key_Old^Key_Val);
Key_Old = Key_Val;
switch (Key_Down)
{
case 4:
if(++Seg_Disp_Mode==4) Seg_Disp_Mode =0;
if(Seg_Disp_Mode == 2) Param_Mode=0;
if(Seg_Disp_Mode==0) Choice_Index=0;
break;
case 5:
if(Seg_Disp_Mode == 1)
{
if(++Param_Mode == 2) Param_Mode=0;
}
else if(Seg_Disp_Mode==3)
{
if(++Choice_Index == 2) Choice_Index=0;
}
break;
case 8: // 加法操作按键
if(Seg_Disp_Mode ==1)
{
if(Param_Mode == 0)
{ if(Param_Max<9000&&Param_Max>-9000)
Param_Max +=1000;
}
else
{
Param_Disp +=100;
Param_Ctrol =Param_Disp;
}
}
break;
case 9: // 减法操作按键
if(Seg_Disp_Mode ==1)
{
if(Param_Mode == 0)
{ if(Param_Max<9000&&Param_Max>-9000)
Param_Max -=1000;
}
else
{if(Param_Disp<900&&Param_Disp>-900)
Param_Disp -=100;
Param_Ctrol =Param_Disp;
}
}
break;
}
}
void Seg_Proc()
{
unsigned char i=0;
if(Seg_Slow_Down)return;
Seg_Slow_Down = 1;
Read_Rtc(ucRtc);
temp =AD_Read(0x03) /51.0;
DA_Write(Vol);
if(Freq_Max<=Freq)
{
Freq_Max = Freq;
for(i=0;i<3;i++){
ucRtc_Maxi =ucRtci;
}
}
switch (Seg_Disp_Mode)
{
case 0:
for(i=0;i<8;i++)
{
Seg_Bufi =10;
Seg_Pointi=0;
}
if(Freq<0) {Seg_Buf6 = Seg_Buf7 = 20;
}
else{
Seg_Buf0 =16;
Seg_Buf3 =Freq>10000?Freq/10000%10:10;
Seg_Buf4 = Freq/1000%10;
Seg_Buf5 =Freq/100%10;
Seg_Buf6 =Freq/10%10;
Seg_Buf7 =Freq%10;}
break;
case 1:
for(i=0;i<8;i++)
{
Seg_Bufi =10;
Seg_Pointi=0;
}
Seg_Buf0 = 17;
Seg_Buf1 = Param_Mode+1;
switch(Param_Mode){
case 0:
if(Param_Max>0){
Seg_Buf4 =Param_Max/1000%10;
Seg_Buf5 =Param_Max/100%10;
Seg_Buf6 =Param_Max/10%10;
Seg_Buf7 =Param_Max%10;}
if(Param_Max<0){
Seg_Buf3 =18;
Seg_Buf4 =-Param_Max/1000%10;
Seg_Buf5 =-Param_Max/100%10;
Seg_Buf6 =-Param_Max/10%10;
Seg_Buf7 =-Param_Max%10;
}
if(Param_Max==0) Seg_Buf7 = 0;
break;
case 1:
if(Param_Disp>0){
Seg_Buf5 =Param_Disp/100%10;
Seg_Buf6 =Param_Disp/10%10;
Seg_Buf7 =Param_Disp%10;
}
else if(Param_Disp==0) Seg_Buf7 =0;
else if(Param_Disp<0){
Seg_Buf4 =18;
Seg_Buf5 =-Param_Disp/100%10;
Seg_Buf6 =-Param_Disp/10%10;
Seg_Buf7 =-Param_Disp%10;
}
break;
}
break;
case 2:
for(i=0;i<8;i++)
{
Seg_Bufi =10;
Seg_Pointi=0;
}
Seg_Buf2 =Seg_Buf5 = 18;
for(i=0;i<3;i++)
{
Seg_Buf3\*i =ucRtci/16%10;
Seg_Buf3\*i+1 =ucRtci%16;
}
break;
case 3:
if(Choice_Index ==0){
for(i=0;i<8;i++)
{
Seg_Bufi =10;
Seg_Pointi=0;
}
Seg_Buf0 =19;
Seg_Buf1 =16;
Seg_Buf3 =Freq_Max>10000?Freq_Max/10000%10:10;
Seg_Buf4 = Freq_Max/1000%10;
Seg_Buf5 =Freq_Max/100%10;
Seg_Buf6 =Freq_Max/10%10;
Seg_Buf7 =Freq_Max%10;}
else if(Choice_Index == 1)
{
for(i=0;i<8;i++)
{
Seg_Bufi =10;
Seg_Pointi=0;
}
Seg_Buf0 =19;
Seg_Buf1 =14;
for(i=1;i<4;i++)
{
Seg_Buf2\*i =ucRtc_Maxi-1/16%10;
Seg_Buf2\*i+1 = ucRtc_Maxi-1%16;
}
}
break;
}
}
void Led_Proc()
{
if(Freq<500) Vol =1.0;
else if(Freq>Param_Max) Vol =5.0;
else if(Freq<Param_Max&&Freq>500)
Vol = (Freq-500)*4/(Param_Max-500)+1;
if(Seg_Disp_Mode==0)
ucLed0 = Star_Flag?1:0;
if(Freq>Param_Max)
ucLed1 =Star_Flag?1:0;
if(Freq<0) ucLed1 =1;
}
void Timer0_Init(void) //1毫秒@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |=0x05;
TL0 = 0; //设置定时初始值
TH0 = 0; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer1_Init(void) //1毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x18; //设置定时初始值
TH1 = 0xFC; //设置定时初始值
TF1 = 0; //清除TF1标志
TR1 = 1; //定时器1开始计时
ET1 =1;
EA =1;
}
void Timer1_Server() interrupt 3
{
if(++Key_Slow_Down == 20) Key_Slow_Down =0;
if(++Seg_Slow_Down == 500) Seg_Slow_Down =0;
if(++Seg_Pos == 8) Seg_Pos=0;
Seg_Disp(Seg_Pos,Seg_BufSeg_Pos,Seg_PointSeg_Pos);
Led_Disp(Seg_Pos,ucLedSeg_Pos);
if(++Timer1s ==1000)
{
Timer1s =0;
Freq =TH0<<8|TL0;
Freq +=Param_Ctrol;
TH0 =TL0 =0;
}
if(++Timer_200ms == 200)
{
Timer_200ms =0;
Star_Flag ^=1;
}
}
void main()
{
Set_Rtc(ucRtc);
System_Init();
Timer0_Init();
Timer1_Init();
while(1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}