📄 vfd.c
字号:
#include<reg52.h>
#include<panel.h>
#include<use.h>
void WR_PANEL(BYTE);
void LIGHT_ALL(void);
BYTE RD_PANEL(void);
BYTE GET_KEY_VAL(void);
BIT LEAP_YEAR(void); // if this year /4 =0
BIT LEAP_MONTH(void); // if this month only 30 days
void DAY_INC(void); // month and year inc process
BYTE HEXTOBCD(BYTE); //translate hex to bcd
void COMPARE_TIME(BYTE *); //compare now_time and (alarm_begin&alarm_end)
void FILL_ALL_PIX(void);
void FILL_BCD_DISP(BYTE *,BYTE *,BYTE *);
void KEY_PROCESS(void);
void DELAY_TIME(BYTE);
void DELAY_100uS(void);
BYTE GET_IR_KEY(void);
void ALARM_MAKE(void);
void timer0(void) interrupt 1 using 1
{ TR0=0;
TH0=0XD8;
TL0=0XF0;
TR0=1;
mSECOND++;
if(mSECOND==50) COUNT2=0;
if((mSECOND<40)||(mSECOND>60))// SOUND OF ALARM 0mS ON;40mS OFF;60mS ON
COUNT1=1;
if((mSECOND>40)&&(mSECOND<60))
COUNT1=0;
if(mSECOND>=100)
{ SECOND_INC=1;
COUNT2=1;
COUNT3++;
mSECOND=0;
};
}
void IR0(void) interrupt 0 using 2
{
EX0=0;//do not allow extern interrupt0
bKEY=GET_IR_KEY();
EX0=1;
}
main()
{
BYTE TEMP,TEMPA;
SP=0x70;
IR = 1;
ALARM_OUT1=0;
ALARM_OUT2=0;
TR0=0;
TMOD=0X01;
TH0=0XD8;
TL0=0XF0;
TR0=1;
PT0=1;//Priority Interrupt timer0
ET0=1;
EX0=1;
IT0=1;
EA=1;//ENABLE TIMER0
TEMP=12;
while(TEMP--)
DISP_ARRAY[TEMP-1]=0;
TEMP=15;
while(TEMP--)
{ TEMPA=3;
while(TEMPA--)
ALARM_ARRAY[TEMP-1][TEMPA-1]=0;
};
KEY_ARRAY[0]=0;
KEY_ARRAY[1]=0;
KEY_ARRAY[2]=0;
//INITIAL VFD_PANEL AND LET IT ALL DARKEN
VFD_STB=1;
VFD_STB=0;
WR_PANEL(VFD_DISP_MODE);
VFD_STB=1;
VFD_STB=0;
WR_PANEL(VFD_CTRL_MODE);
VFD_STB=1;
LIGHT_ALL();
// WHILE LOOP
while(1)
{
if(SECOND_INC)
{ SECOND_INC=0;
SECOND++;
if(SECOND>=60)
{
SECOND=0;
MINUTE++;
if(MINUTE>=60)
{
MINUTE=0;
HOUR++;
if(HOUR>=24)
{
HOUR=0;
DAY++;
switch(DAY)
{
case 29:
if(MONTH==2)
if(!LEAP_YEAR())
{ DAY=0;
DAY_INC();
};
break;
case 30:
if(MONTH==2) DAY_INC();
break;
case 31:
if(LEAP_MONTH()) DAY_INC();
break;
case 32:
DAY_INC();
break;
};// END OF SWITCH
};// hour>=24
};// minute>=60
};// second>=60
};//(second_inc) END OF TIME PROCESS
SECOND1=HEXTOBCD(SECOND);
MINUTE1=HEXTOBCD(MINUTE);
HOUR1=HEXTOBCD(HOUR);
DAY1=HEXTOBCD(DAY);
MONTH1=HEXTOBCD(MONTH);
YEAR1=HEXTOBCD(YEAR);
//BEGIN ALARM TIME PROCESS
if(ALARM_ENABLE)
{ TEMP=8;
do
{ ALARM_ON_OFF=ALARM_ON_OFF_1;
TEMP=0;
ALARM_ON_OFF>>=TEMP;
if(ALARM_ON_OFF^0)
COMPARE_TIME(&ALARM_ARRAY[TEMP][0]);
}while(TEMPA--);
TEMP=8;
do
{ ALARM_ON_OFF=ALARM_ON_OFF_2;
TEMP=0;
ALARM_ON_OFF>>=TEMP;
if(ALARM_ON_OFF^0)
COMPARE_TIME(&ALARM_ARRAY[TEMP+8][0]);
}while(TEMPA--);
ALARM_MAKE();
};//END OF PROCESS ALARM
KEY_PROCESS();
FILL_ALL_PIX();
LIGHT_ALL();
};//END OF WHILE(1)
}//END OF MAIN
void WR_PANEL(BYTE TEMP1)
{ BYTE TEMP4;
VFD_CLK=1;
for(TEMP4=0;TEMP4<8;TEMP4++)
{ VFD_CLK=0;
if(TEMP1&0X01)
VFD_DATA=1;
else
VFD_DATA=0;
TEMP1>>=1;
VFD_CLK=1;
};
}
BYTE RD_PANEL(void)
{
BIT I;
BYTE TEMP5;
BYTE TEMP4,TEMP6;
VFD_CLK=1;
VFD_DATA=1;
TEMP5=0;
for(TEMP4=0;TEMP4<8;TEMP4++)
{ VFD_CLK=0;
for(TEMP6=0;TEMP6<6;TEMP6++)
I=VFD_DATA;
if(I)
{ TEMP6=0X80;
TEMP6>>=(7-TEMP4);
TEMP5|=TEMP6;
};
VFD_CLK=1;
};
return(TEMP5);
}
void LIGHT_ALL(void)
{ BYTE I;
VFD_STB=1;
VFD_STB=0;
WR_PANEL(0X40);
VFD_STB=1;
VFD_STB=0;
WR_PANEL(0XC0);
for(I=0;I<12;I++) WR_PANEL(DISP_ARRAY[I]);
VFD_STB=1;
}
BIT LEAP_YEAR(void)
{ BIT T;
switch(YEAR)
{ case 0:
case 4:
case 8:
T=1;
break;
default:
T=0;
break;
};
return(T);
}
BIT LEAP_MONTH(void) //if this month has 30 day
{ BIT T;
switch(MONTH)
{ case 4:
case 6:
case 9:
case 11:
T=1;
break;
default:
T=0;
break;
};
return(T);
}
void DAY_INC(void)
{ DAY=0;
MONTH++;
if(MONTH==0x12)
{ MONTH=0;
YEAR++;
if(YEAR==10)
YEAR=0;
} ;
}
BYTE HEXTOBCD(BYTE TEMP7)
{ BYTE E,F;
E=TEMP7;
F=E/10;
E%=10;
F<<=4;
F|=E;
TEMP7=F;
return(TEMP7);
}
void COMPARE_TIME(BYTE *CP1)
{ if(HOUR1==*CP1)
if(MINUTE1==*(CP1++))
ALARM_ON=1;
if(HOUR1==*(CP1++))
if(MINUTE1==*(CP1++))
ALARM_ON=0;
}
void FILL_BCD_DISP(BYTE *I,BYTE *J,BYTE *K)
{ BYTE TEMP;
TEMP=*I;
TEMP&=0X0F;
DISP_ARRAY[VFD_N1_ADDR]=DISP_CHARACTER[TEMP];
TEMP=*I;
TEMP>>=4;
TEMP&=0X0F;
DISP_ARRAY[VFD_N2_ADDR]=DISP_CHARACTER[TEMP];
TEMP=*J;
TEMP&=0X0F;
DISP_ARRAY[VFD_MIN_N1_ADDR]=DISP_CHARACTER[TEMP];
TEMP=*J;
TEMP>>=4;
TEMP&=0X0F;
DISP_ARRAY[VFD_MIN_N2_ADDR]=DISP_CHARACTER[TEMP];
TEMP=*K;
TEMP&=0X0F;
DISP_ARRAY[VFD_SEC_N1_ADDR]=DISP_CHARACTER[TEMP];
TEMP=*K;
TEMP>>=4;
TEMP&=0X0F;
DISP_ARRAY[VFD_SEC_N2_ADDR]=DISP_CHARACTER[TEMP];
}
void FILL_ALL_PIX(void)
{ BYTE TEMP;
BIT1=ALARM1;
BIT2=ALARM2;
BIT3=ALARM3;
BIT4=ALARM4;
BIT5=ALARM5;
BIT6=ALARM6;
BIT7=ALARM7;
BIT8=ALARM8;
BIT9=ALARM9;
BIT10=ALARM10;
BIT11=ALARM11;
BIT12=ALARM12;
BIT13=ALARM13;
BIT14=ALARM14;
BIT15=ALARM15;
BIT16=ALARM16;
DISP_ARRAY[VFD_TRACKBIT_N2_ADDR]=BIT_A;
DISP_ARRAY[VFD_TRACKBIT_N1_ADDR]=BIT_B;
BG_HOUR =HEXTOBCD(ALARM_ARRAY[DISP_SW-2][0]);
BG_MINUTE =HEXTOBCD(ALARM_ARRAY[DISP_SW-2][1]);
END_HOUR =HEXTOBCD(ALARM_ARRAY[DISP_SW-2][2]);
END_MINUTE =HEXTOBCD(ALARM_ARRAY[DISP_SW-2][3]);
if((DISP_SW<=DISP_ALARM8)&&(DISP_SW>DISP_DATE))
{ ALARM_ON_OFF=ALARM_ON_OFF_1;
ALARM_ON_OFF>>=(DISP_SW-2);
}
if(DISP_SW>DISP_ALARM8)
{ ALARM_ON_OFF=ALARM_ON_OFF_2;
ALARM_ON_OFF>>=(DISP_SW-10);
}
switch(DISP_SW)
{
case DISP_TIME:
FILL_BCD_DISP(&HOUR1,&MINUTE1,&SECOND1);
if(COUNT2)
{ DISP_ARRAY[VFD_DASH_ADDR]|=VFD_DASH;
DISP_ARRAY[VFD_COL_ADDR]|=VFD_COL;
}
else
{ DISP_ARRAY[VFD_DASH_ADDR]&=~VFD_DASH;
DISP_ARRAY[VFD_COL_ADDR]&=~VFD_COL;
};
DISP_ARRAY[VFD_SEC_ADDR]|=VFD_SEC;
DISP_ARRAY[VFD_MIN_ADDR]|=VFD_MIN;
TEMP=~VFD_MIC1;
DISP_ARRAY[VFD_MIC1_ADDR]&=TEMP;
TEMP=~VFD_MIC2;
DISP_ARRAY[VFD_MIC2_ADDR]&=TEMP;
break;
case DISP_DATE:
FILL_BCD_DISP(&YEAR1,&MONTH1,&DAY1);
TEMP=~VFD_DASH;
DISP_ARRAY[VFD_DASH_ADDR]&=TEMP;
TEMP=~VFD_COL;
DISP_ARRAY[VFD_COL_ADDR]&=TEMP;
TEMP=~VFD_MIC1;
DISP_ARRAY[VFD_MIC1_ADDR]&=TEMP;
TEMP=~VFD_MIC2;
DISP_ARRAY[VFD_MIC2_ADDR]&=TEMP;
break;
default:
if(DISP_BG_END)
{ if(ALARM_ON_OFF^0)
FILL_BCD_DISP(&ON,&BG_HOUR,&BG_MINUTE);
else
FILL_BCD_DISP(&OF,&BG_HOUR,&BG_MINUTE);
DISP_ARRAY[VFD_MIC1_ADDR]|=VFD_MIC1;
TEMP=~VFD_MIC2;
DISP_ARRAY[VFD_MIC2_ADDR]&=TEMP;
}
else
{ if(ALARM_ON_OFF^0)
FILL_BCD_DISP(&ON,&END_HOUR,&END_MINUTE);
else
FILL_BCD_DISP(&OF,&END_HOUR,&END_MINUTE);
DISP_ARRAY[VFD_MIC1_ADDR]|=VFD_MIC1;
DISP_ARRAY[VFD_MIC2_ADDR]|=VFD_MIC2;
};
DISP_ARRAY[VFD_TRACKBIT_N2_ADDR]=0;
DISP_ARRAY[VFD_TRACKBIT_N1_ADDR]=0;
if(DISP_SW<=DISP_ALARM8)
DISP_ARRAY[VFD_TRACKBIT_N2_ADDR]=BIT_ARRAY[DISP_SW-2];
else
DISP_ARRAY[VFD_TRACKBIT_N1_ADDR]=BIT_ARRAY[DISP_SW-2];
break;
}; //END OF switch(DISP_SW)
if(TIME_EDIT)
{ switch(TIME_EDIT)
{
case EDIT_HOUR:
case EDIT_YEAR:
case EDIT_SWITCH:
if(COUNT2)
{ DISP_ARRAY[VFD_N2_ADDR]=0;
DISP_ARRAY[VFD_N1_ADDR]=0;
};
break;
case EDIT_MINUTE:
case EDIT_MONTH:
case EDIT_BG_HOUR:
case EDIT_END_HOUR:
if(COUNT2)
{ DISP_ARRAY[VFD_MIN_N2_ADDR]=0;
DISP_ARRAY[VFD_MIN_N1_ADDR]=0;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -