📄 yk.c
字号:
#include "REGX52.h"
#include "yk.h"
//****** HD7279A 指令 ******
#define CMD_RESET 0xa4
#define CMD_TEST 0xbf
#define DECODE0 0x80
#define DECODE1 0xc8
#define CMD_READ 0x15
#define UNDECODE 0x90
#define RTL_CYCLE 0xa3
#define RTR_CYCLE 0xa2
#define RTL_UNCYL 0xa1
#define RTR_UNCYL 0xa0
#define ACTCTL 0x98
#define SEGON 0xe0
#define SEGOFF 0xc0
#define BLINKCTL 0x88
//Ds12c887
/* 所有的置位使用或操作,清除使用与操作 */
//#define MASK_SETB_SET 0x80 /* 禁止刷新 */
//#define MASK_CLR_SET 0x7f /* 使能刷新 */
extern void long_delay(void); // 长延时
extern void short_delay(void); // 短暂延时
extern void delay10ms(unsigned char);
extern void write7279(unsigned char, unsigned char,unsigned char);// 发送一个字节 // 写入到HD7279
extern unsigned char read7279(unsigned char); // 从HD7279读出
extern void send_byte(unsigned char,unsigned char);
extern unsigned char receive_byte(void);
extern void WriteSR(BYTE cData);
extern void Write1B(BYTE cData,BYTE cAddress,bit bRegion);
extern BYTE Read1B(BYTE cAddress,bit bRegion);
void Disp();
void YkPro(unsigned char,unsigned char);
BYTE data Station;
BYTE data First_Flag;
BYTE data Time_Counter;
BYTE data YkStart,YkCount;
BYTE data Rcv_Count;
BYTE data Rcv_Wp,Rcv_Rp;
bit data Trs_Flag,Rcv_Flag;
bit data Flash_Flag;
BYTE data Trs_Wp,Trs_Rp;
BYTE data Trs_Buf[25];
BYTE idata Rcv_Buf[30];
BYTE Tmp1,Yk_Fresh;
BYTE idata YkNo,YkHf,YkStatus,Yk_En;
bit data Yk_All,Disp_Flag,Yk_Self;
extern BYTE data Trs_Comm,Trs_Comm_Bak;
BYTE code F_TAB[4]={0x01,0x04,0x10,0x40};
BYTE code H_TAB[4]={0x02,0x08,0x20,0x80};
BYTE xdata Second _at_ 0xf00;
BYTE xdata Second_Alarm _at_ 0xf01;
BYTE xdata Minute _at_ 0xf02;
BYTE xdata Minute_Alarm _at_ 0xf03;
BYTE xdata Hour _at_ 0xf04;
BYTE xdata Hour_Alarm _at_ 0xf05;
BYTE xdata Week _at_ 0xf06;
BYTE xdata Day _at_ 0xf07;
BYTE xdata Month _at_ 0xf08;
BYTE xdata Year _at_ 0xf09;
BYTE xdata RegA _at_ 0xf0a;
BYTE xdata RegB _at_ 0xf0b;
BYTE xdata RegC _at_ 0xf0c;
BYTE xdata RegD _at_ 0xf0d;
BYTE xdata Century _at_ 0xf32;
BYTE xdata Nvram[10] _at_ 0xf33;
BYTE xdata Yk0 _at_ 0xf000;
BYTE xdata Yk1 _at_ 0xf100;
BYTE xdata Yk2 _at_ 0xf200;
BYTE xdata Yk3 _at_ 0xf300;
BYTE xdata Yk4 _at_ 0xf400;
BYTE xdata Yk5 _at_ 0xf500;
BYTE xdata Yk6 _at_ 0xf600;
BYTE xdata Yk7 _at_ 0xf700;
BYTE xdata Yk8_9 _at_ 0xff00;
struct Yk_Time_Struct
{
BYTE Minute;
BYTE Hour;
} Yk_Time;//,Yk_Time_Rd;
void timer0(void) interrupt 1 //using 2
{
Time_Counter++;
Rcv_Count++;
if(YkStart)YkCount++;
TL0=0;
TH0=0;
}
void serial_int(void) interrupt 4 //using 1
{
EA=0;
if (RI)
{
RI=0;
Rcv_Count=0;
if(Rcv_Wp==29)
{
Rcv_Wp=0;
}
Rcv_Buf[Rcv_Wp]=SBUF;
if(
Rcv_Buf[Rcv_Wp-2]==0xeb && Rcv_Buf[Rcv_Wp-1]==0x90
&&Rcv_Wp<8)
{
Rcv_Flag=1;
Rcv_Rp=Rcv_Wp;
}
Rcv_Wp++;
}
if (TI)
{
TI=0;
if(Trs_Wp!=Trs_Rp)
{
SBUF=Trs_Buf[Trs_Rp];
Trs_Rp++;
}
else DIR485=1;
}
EA=1;
}
void init()
{
BYTE i;
Yk_Clr=0;
Yk_UnDo=1;
Yk_UnDo=0;
Yk_UnDo=1;
TMOD=0x21;
TH1=0xfa; //9600-FD 4800-FA 2400-F4 1200-E8
TL1=0xfa;
SCON=0x50;
PCON=0;
TL0=0x0;
TH0=0x0;
ET0=1;
// EX1=1;
ES=1;
TR0=1;
TR1=1;
// ET1=1;
EA=1;
TI=0;
Cs12887=0;
RegA=0x20;
RegB=0x06;
Cs12887=1;
send_byte(CMD_TEST,0); // 测试指令
send_byte(CMD_TEST,1);
P1_7=P1_5=1;
for(i=0;i<200;i++)
{
long_delay();
Run=~Run;
}
send_byte(CMD_RESET,0); // 清除显示
send_byte(CMD_RESET,1); // 清除显示
P1_7=P1_5=1;
WriteSR(0x30); // WatchDog DISABLE
First_Flag=Read1B(1,0);
if(First_Flag!=0x55)
{
First_Flag=0x55;
Write1B(0x55,1,0);
for(i=0;i<10;i++)
{
Write1B(0xff,10+i,0);
}
for(i=20;i<160;i++)
{
Write1B(0x0,i,0);
}
Write1B(1,0,0);
}
Station=Read1B(0,0);
Disp_Flag=1;
YkStart=0;
}
void Disp()
{
BYTE i,Led,Seg,Status,Status_Tmp;
Disp_Flag=0;
for(i=0;i<4;i++)
{
Seg=0;
if(i<2)
{
Status= Read1B(10+i,0);
}
if(i==2)
{
Status= Read1B(12,0);
Status>>=4;
Status_Tmp= Read1B(13,0);
Status_Tmp<<=4;
Status|=Status_Tmp;
}
if(i==3)
{
Status= Read1B(13,0);
Status>>=4;
Status_Tmp= Read1B(14,0);
Status_Tmp<<=4;
Status|=Status_Tmp;
}
if (Status&0x01) Seg|=0x40;
if (Status&0x02) Seg|=0x20;
if (Status&0x04) Seg|=0x10;
if (Status&0x08) Seg|=0x08;
if (Status&0x10) Seg|=0x04;
if (Status&0x20) Seg|=0x02;
if (Status&0x40) Seg|=0x01;
if (Status&0x80) Seg|=0x80;
Yk_En=0;
if(i<2)
{
Status= Read1B(15+i,0);
}
if(i==2)
{
Status= Read1B(17,0);
Status>>=4;
Status_Tmp= Read1B(18,0);
Status_Tmp<<=4;
Status|=Status_Tmp;
}
if(i==3)
{
Status= Read1B(18,0);
Status>>=4;
Status_Tmp= Read1B(19,0);
Status_Tmp<<=4;
Status|=Status_Tmp;
}
if (Status&0x01) Yk_En|=0x40;
if (Status&0x02) Yk_En|=0x20;
if (Status&0x04) Yk_En|=0x10;
if (Status&0x08) Yk_En|=0x08;
if (Status&0x10) Yk_En|=0x04;
if (Status&0x20) Yk_En|=0x02;
if (Status&0x40) Yk_En|=0x01;
if (Status&0x80) Yk_En|=0x80;
switch (i)
{
case 0:
Led=3;
break;
case 1:
Led=1;
break;
case 2:
Led=2;
break;
case 3:
Led=0;
break;
default:
Led=0;
break;
}
write7279(UNDECODE+Led*2+1,Seg&Yk_En,0);
write7279(UNDECODE+Led*2,~Seg&Yk_En,0);
}
Seg=0;
Status= Read1B(12,0);
Status&=0x0f;
Status_Tmp= Read1B(14,0);
Status_Tmp&=0xf0;
Status|=Status_Tmp;
if (Status&0x01) Seg|=0x40;
if (Status&0x02) Seg|=0x20;
if (Status&0x04) Seg|=0x10;
if (Status&0x08) Seg|=0x08;
if (Status&0x10) Seg|=0x04;
if (Status&0x20) Seg|=0x02;
if (Status&0x40) Seg|=0x01;
if (Status&0x80) Seg|=0x80;
Yk_En=0;
Status= Read1B(17,0);
Status&=0x0f;
Status_Tmp= Read1B(19,0);
Status_Tmp&=0xf0;
Status|=Status_Tmp;
if (Status&0x01) Yk_En|=0x40;
if (Status&0x02) Yk_En|=0x20;
if (Status&0x04) Yk_En|=0x10;
if (Status&0x08) Yk_En|=0x08;
if (Status&0x10) Yk_En|=0x04;
if (Status&0x20) Yk_En|=0x02;
if (Status&0x40) Yk_En|=0x01;
if (Status&0x80) Yk_En|=0x80;
write7279(UNDECODE+1,Seg&Yk_En,1);
write7279(UNDECODE,~Seg&Yk_En,1);
}
void YkPro(BYTE YkNo,BYTE YkHf)
{
BYTE i,j,YkData;
Yk_Clr=1;
Yk_Do=1;
Yk_Do=0;
Yk_Do=1;
YkStart=1;
YkCount=0;
i=YkNo/4;
j=YkNo%4;
YkData=0;
if(YkHf==0xcc) //Kai
{
YkData=H_TAB[j];
}
if(YkHf==0x33) //Guan
{
YkData=F_TAB[j];
}
switch (i)
{
case 0: //1-4
Yk0=YkData;
break;
case 1: //5-8
Yk1=YkData;
break;
case 2: //9-12
Yk2=YkData;
break;
case 3: //13-16
Yk3=YkData;
break;
case 4: //17-20
Yk4=YkData;
break;
case 5: //21-24
Yk5=YkData;
break;
case 6: //25-28
Yk6=YkData;
break;
case 7: //29-32
Yk7=YkData;
break;
case 8: //33-36
/* P3_6=0;
Object8=0;
P0=YkData;
P3_6=1;
Object8=1; */
Object8=0;
Yk8_9=YkData;
Object8=1;
break;
case 9: //37-40
/*P3_6=0;
Object9=0;
P0=YkData;
P3_6=1;
Object9=1; */
Object9=0;
Yk8_9=YkData;
Object9=1;
break;
default:
Yk_Clr=0;
Yk_UnDo=1;
Yk_UnDo=0;
Yk_UnDo=1;
break;
}
Disp_Flag=1;
{
Tmp1=YkNo/8;
i=Read1B(10+Tmp1,0);
j=1<<(YkNo%8);
if(YkHf==0xcc)
{
i|=j;
}
else
{
i&=~j;
}
Write1B(i,10+Tmp1,0);
}
}
void Yk_Auto(void)
{
BYTE i,j;
j=Week-1;
for(i=0;i<5;i++) // AUTO ON
{
Yk_Time.Hour=Read1B(20+10*j+i*2,0);
if(Yk_Time.Hour&0x80)
{
Yk_Time.Hour&=0x7f;
Yk_Time.Minute=Read1B(20+10*j+i*2+1,0);
Cs12887=0;
if(Yk_Time.Hour==Hour && Yk_Time.Minute==Minute )
{
Yk_All=1;
YkStart=0;
YkNo=0;
YkHf=0xcc;
}
Cs12887=1;
}
Yk_Time.Hour=Read1B(90+10*j+i*2,0); //AUTO OFF
if(Yk_Time.Hour&0x80)
{
Yk_Time.Hour&=0x7f;
Yk_Time.Minute=Read1B(90+10*j+i*2+1,0);
Cs12887=0;
if(Yk_Time.Hour==Hour && Yk_Time.Minute==Minute )
{
Yk_All=1;
YkStart=0;
YkNo=0;
YkHf=0x33;
}
Cs12887=1;
}
}
}
main()
{ BYTE Day_Tmp,Tmp1,Tmp2,i,j,Minute_Tmp;
init();
/* Yk_All=1;
YkStart=0;
YkNo=0;
YkHf=0xcc; */
YkStart=0;
Yk_Fresh=0;
YkNo=0;
loop:
/* Tmp1++;
Write1B(0x55,0x30,0);
Tmp2=Read1B(0x30,0);
if(Tmp2!=0x55)
{
i++;
}
Cs12887=0;
Tmp1=Second;
Tmp1=Year;
Tmp1=Month;
Tmp1=0;
Tmp1=Week;
// Nvram[0]=0x55;
Tmp1=Nvram[0];
Cs12887=1; */
if(Time_Counter>5)
{
//DIR485=0;
//SBUF=0x55;
Run=~Run;
Time_Counter=0;
/* YkPro(YkNo,0xcc);
YkPro(YkNo,0x33);
YkPro(YkNo,0xcc);
YkNo++;
YkNo%=40; */
}
if(Rcv_Flag)
{
Rcv_Pro();
}
if(Trs_Flag==1 && Trs_Wp==Trs_Rp)
{
Trs_Edit();
}
if(Rcv_Count>10) Rcv_Wp=0;
if (YkCount>2)
{
YkStart=0;
YkCount=0;
Yk_Clr=0;
Yk_UnDo=1;
Yk_UnDo=0;
Yk_UnDo=1;
Disp_Flag=1;
}
if(Disp_Flag) Disp();
if((Yk_All==1) && (YkStart==0))
{
YkPro(YkNo,YkHf);
YkNo++;
if(YkNo==40)
{
YkNo=0;
Yk_All=0;
}
}
/* if(Yk_All) Yk_Fresh=0;
if((Yk_Fresh==1) && (YkStart==0))
{
i=Read1B(10+YkNo/8,0);
j=YkNo%8;
j=1<<j;
if(i&j)
YkHf=0xcc;
else YkHf=0x33;
YkPro(YkNo,YkHf);
YkNo++;
if(YkNo==40)
{
YkNo=0;
Yk_Fresh=0;
}
} */
if(YkStart==0)
{
Cs12887=0;
if(Minute!=Minute_Tmp)
{
Yk_Fresh=1;
YkNo=0;
Minute_Tmp=Minute;
if(Week>0 && Week<8) Yk_Auto();
}
Cs12887=1;
}
goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -