⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yk.c

📁 这是一个51单片机实现的控制器程序
💻 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 + -