赞助论坛
  • 10486阅读
  • 0回复

牛人DIY“硬盘时钟”资料 [复制链接]

楼层直达
fjpt  

级别: 高级会员
发帖
501
精华
0
金币
1976
威望
12
贡献
10
好评
21
注册
2009-09-21
楼主    fjpt 发表于: 2010-10-22 21:38:27 

C51源程序

// 硬盘时钟程序
//
//    周正华
// 2009.3.9


#include
#include
#include

#define WORDPORT P2
#define DIGPORT  P1

#define NUM2BCD(x) ((((x)/10)<<4)|(x%10))
#define BCD2NUM(x) (((x)>>4)*10+((x)&0x0f))


#define XZ 8 
#define Ru(x) (x+XZ)>59? (x+XZ-60):(x+XZ) 


#define Delay10Us {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define Delay100Us {Delay10Us;Delay10Us;Delay10Us;Delay10Us;Delay10Us;\
                    Delay10Us;Delay10Us;Delay10Us;Delay10Us;Delay10Us;}


#define TIME_SECOND  XBYTE[0x7f00]
#define TIME_MINUTE  XBYTE[0x7f02]
#define TIME_HOUR  XBYTE[0x7f04]
#define TIME_DAY  XBYTE[0x7f06]
#define TIME_DATE  XBYTE[0x7f07]
#define TIME_MONTH  XBYTE[0x7f08]
#define TIME_YEAR  XBYTE[0x7f09]

#define REGISTERA  XBYTE[0x7f0A]
#define REGISTERB  XBYTE[0x7f0B]
#define REGISTERC  XBYTE[0x7f0C]
#define REGISTERD  XBYTE[0x7f0D]

sbit P_LED_R=P3^0;
sbit P_LED_G=P3^4;
sbit P_LED_B=P3^1;

sbit Key1=P1^6;
sbit Key2=P1^7;
sbit Key0=P3^5;

sbit Put_LED=P3^3;

unsigned char code LED_COL[8][3]=
{
   1,1,1,       //白
   1,0,0,       //红
   0,1,0,       //绿
   0,0,1,       //蓝
   1,1,0,       //黄
   1,0,1,       //品红
   0,1,1,       //青
   0,0,0,       //黑
};

unsigned char code COL_MOD[3][5]=
{
   4,0,3,2,1,
   5,1,4,2,3,
   6,2,3,4,1
};

unsigned char code CH[]={32,32,32,32,32,32,32,32,
                         68,73,89,32,76,69,68,32,
    80,79,86,32,72,68,68,32,
    67,76,79,67,75,32,32,32,
    32,32,32,32,32,32
    };
                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
unsigned char code SD[5][6]={
                         77,73,78,85,84,69,
                         72,79,85,82,32,32,
                         68,65,84,69,32,32,
                         77,79,78,84,72,32,
                         89,69,65,82,32,32
                         };

unsigned char code maxnum[]={59,23,31,12,99,7};
unsigned char code minnum[]={0,0,1,1,0,1};    

unsigned char Time[7];
unsigned char t1,t2,t3,M1,M2,M3;
unsigned char PT_col[60],BL_col,KD_col;
unsigned char m,n,t,co,ST,CM,TZ,BZ;
unsigned int Tn,Tn0,Ti0,Ti1,Ti2,Ti,k,p;             
unsigned int RT=34100;

/*********************************************************************************************/ 

void intersvr0(void) interrupt 0 using 1
{
  if(ST==5) {                        
    Tn=0;
    TH0=-Ti2/256;TL0=-Ti2%256;
  }
  else {                            
    TH0=-Ti1/256;TL0=-Ti1%256;
    m=0;
  }
}

void timer0(void) interrupt 1
{

TH0=-Ti0/256;TL0=-Ti0%256;
                                   
if(ST==0){                   
  if(p<420) p++; else {p=0; ST=1;};
  P_LED_R=LED_COL[7-p/70][0];
  P_LED_G=LED_COL[7-p/70][1];
  P_LED_B=LED_COL[7-p/70][2];
}
if((ST>0)&&(ST<5)) {
  if(m  P_LED_R=LED_COL[m][0];
  P_LED_G=LED_COL[m][1];
  P_LED_B=LED_COL[m][2];

}
}

void timer1(void) interrupt 3 using 1
{
if(ST==5){

  TH1=-3;TL1=-21;

  P_LED_R=LED_COL[PT_col[Tn]][0];
  P_LED_G=LED_COL[PT_col[Tn]][1];
  P_LED_B=LED_COL[PT_col[Tn]][2];

  Delay100Us;Delay100Us;Delay100Us;

  P_LED_R=LED_COL[BL_col][0];
  P_LED_G=LED_COL[BL_col][1];
  P_LED_B=LED_COL[BL_col][2];

  Tn++;
}

if(ST<5) {TH1=Ti/256;TL1=Ti%256;}
if(ST==0) Ti0=RT;
if(ST==1) {if(t<3) t++; else {t=0;if(k>8) k--; else ST=4; Ti0=100*k;}}
//if(ST==2) {if(t<8) t++; else {t=0;if(n>1) n--;  else ST=3; Ti0=RT/n-44;}}
//if(ST==3) {if(t<40) t++; else {t=0;if(n<24) n++; else ST=4; Ti0=RT/n-44;}}
if(ST==4) {if(t<40) t++; else {t=0;if(co>1) co--; else {ST=5;Ti0=0;Ti1=160;Ti2=0;};Ti0=RT/24-44;}}
}


SetupDs12887(void)
{
    REGISTERA = 0x70;
 REGISTERB = 0xa2;

 TIME_SECOND= NUM2BCD(Time[0]);  
 TIME_MINUTE= NUM2BCD(Time[1]);
 TIME_HOUR  = NUM2BCD(Time[2]);

 TIME_DATE  = NUM2BCD(Time[3]);  
 TIME_MONTH = NUM2BCD(Time[4]);
 TIME_YEAR  = NUM2BCD(Time[5]);

 REGISTERA = 0x20; 
 REGISTERB = 0x22; 
}

void ReadDs12887(void)
{
 Time[0] = BCD2NUM(TIME_SECOND);
 Time[1] = BCD2NUM(TIME_MINUTE);
 Time[2] = BCD2NUM(TIME_HOUR);
 
 Time[3] = BCD2NUM(TIME_DATE);
 Time[4] = BCD2NUM(TIME_MONTH);
 Time[5] = BCD2NUM(TIME_YEAR);
}

void Delay_100Us(unsigned int tt)
{
  unsigned char ii;
  for(;tt>0;tt--)
    for(ii=94;ii>0;ii--);
}


/*主程序*/
void main(void)
{
unsigned char i,j;
unsigned char kdxz=3;
  P3=0xff;
 
  m=0;k=339;
  n=60;
  Ti0=RT/n;
  Ti1=57;
  Ti2=1750;
  Ti=43600;
  ST=0;
  co=7;

  CM=0;  
  BL_col=COL_MOD[CM][0];
  KD_col=COL_MOD[CM][1];
 
  TMOD=0x11;
 
  TH0=0; TL0=0;
  TR0=1; ET0=1;

  TH1=0; TL1=0;
  TR1=1; ET1=1;

  IT0=1; EX0=1;

  for(i=0;i<60;i++) PT_col[i]=BL_col;
  PT_col[0+kdxz]=0;
  PT_col[5+kdxz]=0;
  PT_col[10+kdxz]=0;
  PT_col[15+kdxz]=0;
  PT_col[20+kdxz]=0;
  PT_col[25+kdxz]=0;
  PT_col[30+kdxz]=0;
  PT_col[35+kdxz]=0;
  PT_col[40+kdxz]=0;
  PT_col[45+kdxz]=0;
  PT_col[50+kdxz]=0;
  PT_col[55+kdxz]=0;

  Delay_100Us(9000);
  Delay_100Us(9000);
  Delay_100Us(9000);
  EA=1;

  P_LED_R=0;
  P_LED_G=0;
  P_LED_B=0;

for(;;){
  if(TZ==0) ReadDs12887(); 

  Delay_100Us(50);
  Delay_100Us(50);
 
  if((ST>2)&&(TZ==0)){    
    M1=Time[0];M2=Time[1];M3=Time[2];
    DIGPORT=0xec; WORDPORT=0x30+Time[3]%10;
    DIGPORT=0xed; WORDPORT=0x30+Time[3]/10;
    DIGPORT=0xee; WORDPORT=0x2d;
    DIGPORT=0xef; WORDPORT=0x30+Time[4]%10;
    DIGPORT=0xd3; WORDPORT=0x30+Time[4]/10;
    DIGPORT=0xd7; WORDPORT=0x2d;
    DIGPORT=0xdb; WORDPORT=0x30+Time[5]%10;
    DIGPORT=0xdf; WORDPORT=0x30+Time[5]/10;
  }
  if((ST<3)&&(TZ==0)){
    for(j=0;j<30;j++){  
      DIGPORT=0xec; WORDPORT=CH[7+j];
      DIGPORT=0xed; WORDPORT=CH[6+j];
      DIGPORT=0xee; WORDPORT=CH[5+j];
      DIGPORT=0xef; WORDPORT=CH[4+j]; 
      DIGPORT=0xd3; WORDPORT=CH[3+j];
      DIGPORT=0xd7; WORDPORT=CH[2+j];
      DIGPORT=0xdb; WORDPORT=CH[1+j];
      DIGPORT=0xdf; WORDPORT=CH[0+j];
      Delay_100Us(2360);
    }
    Delay_100Us(9000); 
  }
  if((TZ>0)&&(BZ==1))   
  {
      DIGPORT=0xec; WORDPORT=0x30+Time[TZ]%10;
      DIGPORT=0xed; WORDPORT=0x30+Time[TZ]/10;
      DIGPORT=0xee; WORDPORT=SD[TZ-1][5];
      DIGPORT=0xef; WORDPORT=SD[TZ-1][4]; 
      DIGPORT=0xd3; WORDPORT=SD[TZ-1][3];
      DIGPORT=0xd7; WORDPORT=SD[TZ-1][2];
      DIGPORT=0xdb; WORDPORT=SD[TZ-1][1];
      DIGPORT=0xdf; WORDPORT=SD[TZ-1][0];
    BZ=0;
      M1=Time[0];M2=Time[1];M3=Time[2];
  } 

  Delay_100Us(50);
  Delay_100Us(50);

  PT_col[t1]=BL_col;
  PT_col[t2]=BL_col;
  PT_col[t3]=BL_col;

  if(M3>12) M3=M3-12;
  t1=Ru(M1);t2=Ru(M2);t3=Ru(M3*5+M2/12);

  PT_col[0+kdxz]=KD_col;
  PT_col[5+kdxz]=KD_col;
  PT_col[10+kdxz]=KD_col;
  PT_col[15+kdxz]=KD_col;
  PT_col[20+kdxz]=KD_col;
  PT_col[25+kdxz]=KD_col;
  PT_col[30+kdxz]=KD_col;
  PT_col[35+kdxz]=KD_col;
  PT_col[40+kdxz]=KD_col;
  PT_col[45+kdxz]=KD_col;
  PT_col[50+kdxz]=KD_col;
  PT_col[55+kdxz]=KD_col;

  PT_col[t1]=COL_MOD[CM][2];
  PT_col[t2]=COL_MOD[CM][3];
  PT_col[t3]=COL_MOD[CM][4];

  Delay_100Us(50);
  Delay_100Us(50);
 
  if(Key0==0){       
    Delay_100Us(80);
 if(Key0==0) {if(TZ<5) TZ++; else {TZ=0; SetupDs12887();};BZ=1;}
 }

  if(Key1==0){       
    Delay_100Us(50);
 if(Key1==0) {if(Time[TZ] }
    
  if(Key2==0){       
    Delay_100Us(50);
    if(Key2==0) {if(Time[TZ]>minnum[TZ-1]) Time[TZ]--; else Time[TZ]=maxnum[TZ-1];BZ=1;}
 }
   
  Delay_100Us(50);
  Delay_100Us(50);

  if(TZ!=0) Put_LED=~Put_LED; else Put_LED=1;
 
  Delay_100Us(50);
  Delay_100Us(50);
}
}