Thông báo

Collapse
No announcement yet.

Chia sẽ cho anh em trong DTVN cái LED CLOCK của mình mới làm.

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Chia sẽ cho anh em trong DTVN cái LED CLOCK của mình mới làm.

    Với phương châm vừa học hỏi vừa chia sẽ, tham gia dd đã lâu nhưng mình vẫn chưa đóng góp gì.
    Nay mình vừa có chúc thời gian rảnh với chúc kiến thức tích lũy từ trước đến giờ(từ khi bắt đầu
    đam mê điện tử nhất là VDK). Nay mình xin giới thiệu cái project nhỏ về led của mình cho mọi người
    nếu ai có thích có thể lấy về làm theo nhé.

    Thứ I project của mình có sự tích lũy từ anh chung 1608, thanks anh nhìu.
    Thứ II là cách cấp nguồn led có làm theo cách cấp nguồn của hanhcd, thanks nhìu

    Sau đây là code của mình, thật sự cái này cũng như là lập trình cho Matrix thôi nhưng $ pay thì lại vô
    cùng nhỏ so với làm một cái Matrix cùng cở nhưng bị cái là sẽ có tiếng ồn tí và hơi bị giật nhưng có thể chấp
    nhận được.

    Đầu tiên là file main.c Code này đọc coi chừng bị tẩu hảo.
    Những chổ màu đỏ là có liên quan đến hiệu ứng trôi số đó nhé.
    Code:
    #include "AT89x52.H"
    #include "DS1307.H"
    #include "FONT.H"
    
    #define Num_ASII 32
    #define COLUM	 120
    #define SPEED    1
    
    #define shiftleftbyte(a,b,c) {a<<=1;if(b&c)a|=1;}
    
    unsigned int Time,Time_on,static_i_1,i_mid;
    extern unsigned char hour,min,sec,date,day,month,year;
    unsigned char Colum,num_clock,l_clock;
    unsigned char Menu,Static_Menu;
    char          num_i_clock=-1;
    unsigned char Count,Speed,static_i_0,static_i_2;
    bit Clock_tick_bit,Start_tt,Start,Run_Stand,ok_next=1,  bit_save,Next,bit_do,bit_display,bit_big;
    
    bit bit_left,bit_menu;
    unsigned char n_left,byte_and;
    
    idata struct MATRIX{
    	  unsigned char hour_ten[lengh_font];
    	  unsigned char hour_isl[lengh_font];
    	  unsigned char min_ten[lengh_font];
    	  unsigned char min_isl[lengh_font];
    	  unsigned char sec_ten[lengh_font];
    	  unsigned char sec_isl[lengh_font];
    	  unsigned char Time_Save[8];
    	  unsigned char Date_Save[15];
    };
    
    idata struct MATRIX Matrix;
    
    // byte for display
    unsigned char port_0,port_1;
    
    code unsigned char code_date[7][3]={
    	 "SUN",
    	 "MON",
    	 "TUE",
    	 "WED",
    	 "THU",
    	 "FRI",
    	 "SAT"
    };
    
    code unsigned char code_month[12][3]={
    	 "JAN",
    	 "FEB",
    	 "MAR",
    	 "APR",
    	 "MAY",
    	 "JUN",
    	 "JUL",
    	 "AUG",
    	 "SEP",
    	 "OCT",
    	 "NOV",
    	 "DEC"
    };
    
    code unsigned char code_rr[]={
    0xF0,0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// step 1
    0xFF,0xFF,0xF0,0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFF,  0xFF,0xFF,0xFF,0xFF,// step 2
    0xFF,0xFF,0xFF,0xFF,0xF0,0x1F,0xF8,0x3F,0xFC,0x7F,  0xFE,0xFF,0xFF,0xFF // step 3
    };
    code unsigned char code_ll[]={
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFC,0x7F,  0xF8,0x3F,0xF0,0x1F,// step 1
    0xFF,0xFF,0xFF,0xFF,0xFE,0xFF,0xFC,0x7F,0xF8,0x3F,  0xF0,0x1F,0xFF,0xFF,// step 2
    0xFF,0xFF,0xFE,0xFF,0xFC,0x7F,0xF8,0x3F,0xF0,0x1F,  0xFF,0xFF,0xFF,0xFF // step 3
    };
    
    code unsigned char code_setting[]={
       
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,// space
       0xF0,0x1F,0xF0,0x1F,0xFE,0xFF,0xFE,0xFF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// H
       0xF8,0x3F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,0xF0,0x1F,  0xF8,0x3F,0xFF,0xFF,// O
       0xF0,0x3F,0xF0,0x1F,0xFF,0xDF,0xFF,0xDF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// U
       0xF0,0x1F,0xF0,0x1F,0xF6,0x7F,0xF6,0x3F,0xF0,0x9F,  0xF9,0xDF,0xFF,0xFF,// R
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,// space 
    
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// space
       0xF0,0x1F,0xF1,0xFF,0xF8,0x1F,0xF8,0x1F,0xF1,0xFF,  0xF0,0x1F,0xFF,0xFF,// M
       0xFF,0xFF,0xF7,0xDF,0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,  0xFF,0xFF,0xFF,0xFF,// I
       0xF0,0x1F,0xF0,0x1F,0xF9,0xFF,0xFC,0xFF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// N
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// space
    
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// space
       0xF9,0xBF,0xF0,0x9F,0xF6,0xDF,0xF6,0x5F,0xF3,0x1F,  0xFB,0xBF,0xFF,0xFF,// S
       0xF0,0x1F,0xF0,0x1F,0xF2,0x9F,0xF2,0x9F,0xF3,0x9F,  0xF3,0x9F,0xFF,0xFF,// E
       0xF8,0x3F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,0xF7,0xDF,  0xFB,0xBF,0xFF,0xFF,// C
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// space
    
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,// space
       0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,0xF8,0x3F,  0xFC,0x7F,0xFF,0xFF,// D
       0xFC,0x1F,0xF8,0x1F,0xF6,0xFF,0xF6,0xFF,0xF8,0x1F,  0xFC,0x1F,0xFF,0xFF,// A
       0xF3,0xFF,0xF7,0xDF,0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,  0xF3,0xFF,0xFF,0xFF,// T
       0xF0,0x1F,0xF0,0x1F,0xF2,0x9F,0xF2,0x9F,0xF3,0x9F,  0xF3,0x9F,0xFF,0xFF,// E
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,// space   
    
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// space
       0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,0xF8,0x3F,  0xFC,0x7F,0xFF,0xFF,// D
       0xFC,0x1F,0xF8,0x1F,0xF6,0xFF,0xF6,0xFF,0xF8,0x1F,  0xFC,0x1F,0xFF,0xFF,// A
       0xF3,0xFF,0xF9,0x9F,0xFC,0x1F,0xFC,0x3F,0xF9,0xFF,  0xF3,0xFF,0xFF,0xFF,// Y
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// space
    
       0xF0,0x1F,0xF1,0xFF,0xF8,0x1F,0xF8,0x1F,0xF1,0xFF,  0xF0,0x1F,0xFF,0xFF,// M
       0xF8,0x3F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,0xF0,0x1F,  0xF8,0x3F,0xFF,0xFF,// O
       0xF0,0x1F,0xF0,0x1F,0xF9,0xFF,0xFC,0xFF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// N
       0xF3,0xFF,0xF7,0xDF,0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,  0xF3,0xFF,0xFF,0xFF,// T
       0xF0,0x1F,0xF0,0x1F,0xFE,0xFF,0xFE,0xFF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// H
    
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,// space
       0xF3,0xFF,0xF9,0x9F,0xFC,0x1F,0xFC,0x3F,0xF9,0xFF,  0xF3,0xFF,0xFF,0xFF,// Y
       0xF0,0x1F,0xF0,0x1F,0xF2,0x9F,0xF2,0x9F,0xF3,0x9F,  0xF3,0x9F,0xFF,0xFF,// E
       0xFC,0x1F,0xF8,0x1F,0xF6,0xFF,0xF6,0xFF,0xF8,0x1F,  0xFC,0x1F,0xFF,0xFF,// A
       0xF0,0x1F,0xF0,0x1F,0xF6,0x7F,0xF6,0x3F,0xF0,0x9F,  0xF9,0xDF,0xFF,0xFF,// R
       0xFF,0xFF,0xFF,0xFF,0xFF,0xFF // space
    };
    
    
    code Tick_min[]={
    0xFE,0x7F,0xFC,0xFE,0xF8,0x00,0xFC,0xFE,0xFE,0x7F
    };
    code Tick_hour[]={
    0xFF,0x9F,0xFF,0x3E,0xFE,0x00,0xFF,0x3E,0xFF,0x9F
    };
    /*
    code unsigned char code_JVC_RM-C1171_remoteTV_not[]={
    	 // ADD : Command
    	   0x81	  0x8B   // button Power 
    	   0x81	  0xDA	 // button Sound
    	   0x81	  0xC9	 // button Colour
    	   0x81	  0xBD	 // button Menu
    	   0x81	  0xBE	 // button Up
    	   0x81	  0x89	 // button TV/VIDEO
    	   0x81	  0xAD	 // button left
    	   0x81	  0x85	 // button Ok
    	   0x81	  0xAD	 // button right
    	   0x81	  0x82	 // button Display
    	   0x81   0x8E	 // button Muting =>not = 0111 1110 : 0111 0001	 = DEC 239
    	   0x81	  0xBD	 // button down
    	   0x81	  0xBC	 // button DVD menu	=>not = 0111 1110 : 0100 0001= DEC 191
    	   0x81	  0x8C	 // button Chanel -
    	   0x81	  0x8C	 // button Chanel +
    	   0x81	  0x8F	 // button Volume -
    	   0x81	  0x8F	 // button Volume +
    	   .....
    };
    */
    
    void Delay_560us(); 
    void init();
    void IR_active_0();
    void IR_active_1();
    void Timer_init();
    void Timer1();
    void Clock();
    void Save_Time();
    void Save_date();
    void Setting();
    void Clock_tick();
    
    void main(){
             init();Timer_init();
    	 DS_Init();	// init ds1307
    	 Update_time();	// update hour-min-sec
    	 Update_date(); // update date-day-month-year
    	 Save_Time();Save_date();
    	 while(1){
    	 	  if(!Start_tt){while(!Start_tt){if(Start_tt){bit_me  nu=1;Update_date();Save_date();}}}
    	      if(Start&&Start_tt&&ok_next){
    		    if(bit_save){bit_save=0;bit_menu=1;Save_Newtime();  }	  
    			if(!Menu){if(Clock_tick_bit)Clock_tick(); else Clock();}
    			else Setting();
    			Time=0; // clear time
    			if(ok_next){
    			  Start=0;// clear bit
    			  loop:			
    			  if(!Start){Time++;if(Time==0xFFFF){// reset
    			                      Time=0;Start_tt=0;init();
    								  num_clock=0;l_clock=COLUM/2;num_i_clock=-1;
    								  EX1=0; // disabbe	interrupt 1
    								  Next=1;
    								  TR1=0;
    								  P1=P0=0xFF;
    								}
    			  else goto loop;} // count time&&stop program
    		  	}
    		  }	  
    	 }
    }
    
    void delay_560us(){
         TMOD = 0x11; //timer1 & timer0 in mode1  16 bit
    	 //560us 24Mhz
    	 TL0  = 0xA0;	//Lower Byte
         TH0  = 0xFB;	//Upper Byte
    	 // 560us 27MHz
    	 //TL0=0x14;
    	 //TH0=0xFB;
    	 TR0  = 1;	  // start timer 0
    	 while(!TF0); // wail for timer full      
         TR0  = 0;    // stop timer 0
         TF0  = 0;    // clear flag timer 0
    }
    bit  while_P3_3_in_ir(){
    	 unsigned char n=0;
    	 bit true=0;
    	 step_1:  n++;delay_560us();
    	          if(n>10){true = 0;goto step_2;}
    	          if(P3_3) goto step_1;
    	          if(n<10)true = 1;	 	
    	 step_2:return(true);
    }
    void IR_active_1() interrupt IE1_VECTOR{
    	 unsigned int byte;
    	 unsigned char num,n,Add,Command;
    	 Next=0; // off led in cycle
    	 P0=P1=0xFF; // led off
    	 // in bit START
    	 while(!P3_3);// while 0 in 16T ~ 9ms , T =560us,16T = 8960us
    	 // in bit SYNC
    	 // while 1 in 7,5T ~ 4,3ms ,7,5*T = 4200us//
    	 while(P3_3){if(!while_P3_3_in_ir())goto Exit;}// while 1
    	 // in ADDRESS BIT
    	 Add=0;Command=0;
    	 for(n=0;n<16;n++){
    	    while(!P3_3); // 	while 0
    		// wail in time = (2/3)*2T = 747us; ~ 800us	- 510us<time<1100us
    	    delay_560us();
    		// bit 0
    		if(!P3_3){
    		  if(n<8){Add|=0x80;Add>>=1;}
    		  else   {Command|=0x80;Command>>=1;}
    	    }
    		// bit 1
    		else     {
    		          if(n<8){Add|=0x00;Add>>=1;}
    		    	  else   {Command|=0x00;Command>>=1;}
    				  while(P3_3){if(!while_P3_3_in_ir())goto Exit;}// while 1
    				 }
          }
    	  byte = Add+Command;
    	  switch (byte){
    	        // 0x81	  0xDA	 // button Sound
    			case 163 : bit_big=!bit_big;
    			           break;
    	        // 0x81	  0x8C	 // button Chanel -
    			case 241 : Time--;// up delay
    			           break;
    			// 0x81	  0x8F	 // button Volume +	
    			case 238 : Time++;// up delay
    			           break;	    
    	  		// button Muting for stand or run
    			case 239 : if(!Menu)Run_Stand =!Run_Stand;
    					   break;
    			// button DVD menu for menu setting
    			case 193 : if(Menu!=0){Menu=0;bit_menu=1;}
    			           else {Menu=1;Static_Menu=1;static_i_1=0;
    							}
    					   break;
    			// button >> for change menu setting
    			case 208 : if(Menu>0)Menu++;
    			           //Save_in_buffer_setting();
    					   break;
    			// button 0k for save new setting
    			case 248 : if(Menu!=0){bit_save=1;Menu=0;}
    					   break;
    		    // button up for ++ Time
    			case 191 :      if(Menu==1){num= ((hour>>4)*10)+(hour&0x0F);
    										if(num<23)num++;else num=0;
    										hour=num/10;hour<<=4;
    										hour+=num%10;
    							}
    					   else	if(Menu==2){num= ((min>>4)*10)+(min&0x0F);
    					                    if(num<59)num++;else num=0;
    										min=num/10;min<<=4;
    										min+=num%10;
    							}
    					   else	if(Menu==3){num= ((sec>>4)*10)+(sec&0x0F);
    					                    if(num<59)num++;else num=0;
    										sec=num/10;sec<<=4;
    										sec+=num%10;
    							}
    					   else	if(Menu==4){if(++date>7)date=1;Save_date();}
    					   else	if(Menu==5){num= ((day>>4)*10)+(day&0x0F);
    					                    if(num<31)num++;else num=0;
    										day=num/10;day<<=4;
    										day+=num%10;
    							}
    					   else	if(Menu==6){num= ((month>>4)*10)+(month&0x0F);
    					                    if(num<13)num++;else num=0;
    									    month=num/10;month<<=4;
    										month+=num%10;Save_date();
    							}
    					   else	if(Menu==7){num= ((year>>4)*10)+(year&0x0F);
    					                    if(num<99)num++;else num=0;
    										year=num/10;year<<=4;
    										year+=num%10;
    							}
    						 //Save_in_buffer_setting();
    					     //bit_left_setting=1;		 
    					   break;
    			// button down for ++ Time
    			case 192 :      if(Menu==1){num= ((hour>>4)*10)+(hour&0x0F);
    										if(num>0)num--;else num=23;
    										hour=num/10;hour<<=4;
    										hour+=num%10;
    							}
    					   else	if(Menu==2){num= ((min>>4)*10)+(min&0x0F);
    					                    if(num>0)num--;else num=59;
    										min=num/10;min<<=4;
    										min+=num%10;
    							}
    					   else	if(Menu==3){num= ((sec>>4)*10)+(sec&0x0F);
    					                    if(num>0)num--;else num=59;
    										sec=num/10;sec<<=4;
    										sec+=num%10;
    							}
    					   else	if(Menu==4){if(--date<1)date=7;Save_date();}
    					   else	if(Menu==5){num= ((day>>4)*10)+(day&0x0F);
    					                    if(num>1)num--;else num=31;
    										day=num/10;day<<=4;
    										day+=num%10;
    							}
    					   else	if(Menu==6){num= ((month>>4)*10)+(month&0x0F);
    					                    if(num>1)num--;else num=12;
    										month=num/10;month<<=4;
    										month+=num%10;Save_date();
    							}
    					   else	if(Menu==7){num= ((year>>4)*10)+(year&0x0F);
    					                    if(num>1)num--;else num=99;
    										year=num/10;year<<=4;
    										year+=num%10;
    							}
    							//Save_in_buffer_setting();
    					        //bit_left_setting=1;
    					   break;
    	        case 251: Clock_tick_bit=!Clock_tick_bit;break;
    	  }
    	  Exit: EX1=0;
    }
    
    void init(){
    	 Colum=0;Time_on=0x0000;Run_Stand=1;Next=1;bit_disp  lay=1;
         n_left=0;byte_and=0x80;  
    	 EA=1;                            // for use interrupt
    	 IT0=1;                           // External interrupt 0 edge sesitive
    	 PX0=1;                           // External interrupt 0 high priority
    	 EX0=1;                           // External interrupt 0 enable
    	 EX1=0;			  // External interrupt 1 disable
    }
    void Timer_init(){
         TMOD = 0x11; //timer1 & timer0 in mode1  16 bit
         ET1=1;
    	 TL1  = 0x00;	//Lower Byte
         TH1  = 0x00;	//Upper Byte
         TR1=0;	//stop timer1
    }
    void Timer1() interrupt TF1_VECTOR{
         TR1=0;// stop timer1
    	 if(bit_display){
    	   if(bit_do){bit_do=0;
    	   P1=port_1;P0=port_0;}
    	 }//display on
    	 else if(bit_big){P0=0x7F;P1=0xFF;}// display off	 
    	 bit_display=!bit_display;
    	 TF1=0;// clear flag
    	 TH1=(unsigned char)(Time_on>>8);TL1=(unsigned char)(Time_on&0x00FF);
    	 if(Colum<COLUM)TR1=1; else {P1=0xFF;P0=0x7F;TR1=0;}	
    }
    void IR_active_0() interrupt IE0_VECTOR{
    	 if(!Start_tt){
    	   if(++Count>29){Start_tt=1;Count=0;
    				      EX1=1;//enable interrupt 1
    					  l_clock=COLUM/2;
    				} // start program
    	   if(Count==28)TR1=1;// count time a cycle
    	   if(Count==29){TR1=0;// get timer1
    	   	  Time_on=TH1;Time_on<<=8;Time_on|=TL1;
    		  Time_on=Time_on/COLUM;Time_on=65535-((Time_on*2)/3);
    	   }
    	 }
    	 else {
    		 if(!Start){ 
    		   Start=1;	  
    		   if(Time>55)Time_on--;
    		   if(Run_Stand)Speed++;
    		   if(!Run_Stand&&Menu!=0)Run_Stand=1;
    		   if(!EX1&&(Static_Menu==Menu||Menu==1||!Menu))EX1=1; // enable interrupt 1 affter resive device ok
    		   if(!Next)Next=1; // on for led on affter IR resive done and next a new cycle
    		   ok_next=1; // realdy for new cycle
    		   TR1=0;// stop timer1  		    
    		   TF1=0;// clear flag of timer1
    	       TH1=(unsigned char)(Time_on>>8);TL1=(unsigned char)(Time_on&0x00FF);
    		   bit_display=1; 	 
    		 } 		
    		 else if(ok_next){
    		       Time_on++;// up time on display
    			   ok_next=0;// not realdy for cycle new
    	     }
    		 else if(!ok_next&&Start)ok_next=1;
    		 Time=0; // clear time		 
    	     Colum=0; 
    	 }
    }
    void Save_Time(){
    	 unsigned char n;
    	 // save hour
    	 Matrix.Time_Save[0] = (hour>>4) -14 + Num_ASII/2;
    	     for(n=0;n<lengh_font;n++)Matrix.hour_ten[n]=code_tab[Matrix.Time_Save[0]][n];
    	 Matrix.Time_Save[1] = (hour&0x0F) -14 + Num_ASII/2;
    		 for(n=0;n<lengh_font;n++)Matrix.hour_isl[n]=code_tab[Matrix.Time_Save[1]][n];
    	 // space
    	 //Matrix.Time_Save[2] = ':'; Matrix.Time_Save[2]-=(Num_ASII+14);
    	 Matrix.Time_Save[2] = 12;
    	 // save min
    	 Matrix.Time_Save[3] = (min>>4) -14 + Num_ASII/2;
    	 	 for(n=0;n<lengh_font;n++)Matrix.min_ten[n]=code_tab[Matrix.Time_Save[3]][n];
    	 Matrix.Time_Save[4] = (min&0x0F) -14 + Num_ASII/2;
    		 for(n=0;n<lengh_font;n++)Matrix.min_isl[n]=code_tab[Matrix.Time_Save[4]][n];
    	 // space
    	 //Matrix.Time_Save[5] = ':'; Matrix.Time_Save[5]-=(Num_ASII+14);
    	 Matrix.Time_Save[5] = 12;
    	 // save sec
    	 Matrix.Time_Save[6] = (sec>>4) -14 + Num_ASII/2;
    	 	 for(n=0;n<lengh_font;n++)Matrix.sec_ten[n]=code_tab[Matrix.Time_Save[6]][n];
    	 Matrix.Time_Save[7] = (sec&0x0F) -14 + Num_ASII/2;
    	     for(n=0;n<lengh_font;n++)Matrix.sec_isl[n]=code_tab[Matrix.Time_Save[7]][n];
    }
    void Save_date(){	 
    	 // save new date   
    		Matrix.Date_Save[0]=code_date[date-1][0];Matrix.Date_Save[0]-=(Num_ASII+20);
    		Matrix.Date_Save[1]=code_date[date-1][1];Matrix.Date_Save[1]-=(Num_ASII+20);
    		Matrix.Date_Save[2]=code_date[date-1][2];Matrix.Date_Save[2]-=(Num_ASII+20);
         // space
    	    //Matrix.Date_Save[3] = '-'; Matrix.Date_Save[3]-=Num_ASII;
    		Matrix.Date_Save[3] = 1;
    	 // save new day
    		Matrix.Date_Save[4]	= (day>>4) -14+ Num_ASII/2;
    		Matrix.Date_Save[5]	= (day&0x0F) -14+ Num_ASII/2;
    	 // space
    	    //Matrix.Date_Save[6] = '-'; Matrix.Date_Save[6]-=Num_ASII;
    		Matrix.Date_Save[6]=1;
    	 // save new month
    	    Matrix.Date_Save[7]=code_month[month-1][0];Matrix.Date_Save[7]-=(Num_ASII+20);
    		Matrix.Date_Save[8]=code_month[month-1][1];Matrix.Date_Save[8]-=(Num_ASII+20);
    		Matrix.Date_Save[9]=code_month[month-1][2];Matrix.Date_Save[9]-=(Num_ASII+20);
    	 // space
    	    //Matrix.Date_Save[10] = '-'; Matrix.Date_Save[10]-=Num_ASII;
    		Matrix.Date_Save[10] = 1;
    	 // save new year
    		Matrix.Date_Save[11] = 2 -14+ Num_ASII/2;
    		Matrix.Date_Save[12] = 0 -14+ Num_ASII/2;
    		Matrix.Date_Save[13] = (year>>4) -14+ Num_ASII/2;
    	    Matrix.Date_Save[14] = (year&0x0F) -14+ Num_ASII/2;
    }
    void Clock(){       
    	 unsigned int  n;
         unsigned char COLUM_on,byte,byte_0,num=0,i=0; 	 
    	 char _num_,_i_=0;
    	 COLUM_on = (COLUM/2)- ((lengh_font/2)*8);
    	 COLUM_on/=2;
    	 if(l_clock>(COLUM/2)+1)_i_ = num_i_clock;
         _num_ = num_clock;
    			if(bit_menu){ bit_menu=0;Save_Time();
    			  n_left=0;byte_and=0x80;bit_left=0;// reset value 
    			}
    			Update_time();// update hour-min-sec form ds1307
    			TR1=1;
    	 for(n=0;n<COLUM;n++){
    		//////// 
    	    if(n>=COLUM_on&&num<8){	
    
    			if((num==7&&(((sec&0x0F)-14+Num_ASII/2)!=Matrix.Time_Save[num]))||
    			    (num==6&&(((sec>>4)-14+Num_ASII/2)!=Matrix.Time_Save[num]))||
    			     (num==4&&(((min&0x0F)-14+Num_ASII/2)!=Matrix.Time_Save[num]))||
    				  (num==3&&(((min>>4)-14+Num_ASII/2)!=Matrix.Time_Save[num]))||
    				   (num==1&&(((hour&0x0F)-14+Num_ASII/2)!=Matrix.Time_Save[num]))||
    				    (num==0&&(((hour>>4)-14+Num_ASII/2)!=Matrix.Time_Save[num]))){
    				            bit_left=1;																		    
    				            if(num==7){
    							   if(n_left<8){
    							      shiftleftbyte(Matrix.sec_isl[i],Matrix.sec_isl[i+1],0x80);
    								  shiftleftbyte(Matrix.sec_isl[i+1],(code_tab[(sec&0x0F)-14+Num_ASII/2][i]),byte_and);
    							   }
    							   else {
    								  shiftleftbyte(Matrix.sec_isl[i],Matrix.sec_isl[i+1],0x80);
    								  shiftleftbyte(Matrix.sec_isl[i+1],(code_tab[(sec&0x0F)-14+Num_ASII/2][i+1]),byte_and);
    							   }
    							   //byte_0=Matrix.sec_isl[i];byte=Matrix.sec_isl[i+1];
    							}
    					   else if(num==6){
    							   if(n_left<8){
    							      shiftleftbyte(Matrix.sec_ten[i],Matrix.sec_ten[i+1],0x80);
    								  shiftleftbyte(Matrix.sec_ten[i+1],(code_tab[(sec>>4)-14+Num_ASII/2][i]),byte_and);
    							   }
    							   else {
    							      shiftleftbyte(Matrix.sec_ten[i],Matrix.sec_ten[i+1],0x80);
    								  shiftleftbyte(Matrix.sec_ten[i+1],(code_tab[(sec>>4)-14+Num_ASII/2][i+1]),byte_and);							      
    							  }
    							   //byte_0=Matrix.sec_ten[i];byte=Matrix.sec_ten[i+1];
    							}
    					   else if(num==4){
    							   if(n_left<8){
    							      shiftleftbyte(Matrix.min_isl[i],Matrix.min_isl[i+1],0x80);
    								  shiftleftbyte(Matrix.min_isl[i+1],(code_tab[(min&0x0F)-14+Num_ASII/2][i]),byte_and);							      
    							   }
    							   else {
    							   	  shiftleftbyte(Matrix.min_isl[i],Matrix.min_isl[i+1],0x80);
    								  shiftleftbyte(Matrix.min_isl[i+1],(code_tab[(min&0x0F)-14+Num_ASII/2][i+1]),byte_and);							      
    							   }
    							   //byte_0=Matrix.min_isl[i];byte=Matrix.min_isl[i+1];
    							}
    					   else if(num==3){
    					           if(n_left<8){
    							      shiftleftbyte(Matrix.min_ten[i],Matrix.min_ten[i+1],0x80);
    								  shiftleftbyte(Matrix.min_ten[i+1],(code_tab[(min>>4)-14+Num_ASII/2][i]),byte_and);							      
    							    }
    							   else {
    							   	  shiftleftbyte(Matrix.min_ten[i],Matrix.min_ten[i+1],0x80);
    								  shiftleftbyte(Matrix.min_ten[i+1],(code_tab[(min>>4)-14+Num_ASII/2][i+1]),byte_and);							      
    							    }
    							   //byte_0=Matrix.min_ten[i];byte=Matrix.min_ten[i+1];
    							 }
    					   else if(num==1){
    					           if(n_left<8){
    							      shiftleftbyte(Matrix.hour_isl[i],Matrix.hour_isl[i+1],0x80);
    								  shiftleftbyte(Matrix.hour_isl[i+1],(code_tab[(hour&0x0F)-14+Num_ASII/2][i]),byte_and);							      
    							    }
    							   else {
    							   	  shiftleftbyte(Matrix.hour_isl[i],Matrix.hour_isl[i+1],0x80);
    								  shiftleftbyte(Matrix.hour_isl[i+1],(code_tab[(hour&0x0F)-14+Num_ASII/2][i+1]),byte_and);							      
    							    }
    							   //byte_0=Matrix.hour_isl[i];byte=Matrix.hour_isl[i+1];
    							 }
    					   else if(num==0){
    					           if(n_left<8){
                                      shiftleftbyte(Matrix.hour_ten[i],Matrix.hour_ten[i+1],0x80);
    								  shiftleftbyte(Matrix.hour_ten[i+1],(code_tab[(hour>>4)-14+Num_ASII/2][i]),byte_and);							      
    							   }
    							   else {
    								  shiftleftbyte(Matrix.hour_ten[i],Matrix.hour_ten[i+1],0x80);
    								  shiftleftbyte(Matrix.hour_ten[i+1],(code_tab[(hour>>4)-14+Num_ASII/2][i+1]),byte_and);							      
    							   }
    							 }
    
    					 if(n_left==15&&(i+2>=lengh_font)){
    					        if(num==7)Matrix.Time_Save[num] = (sec&0x0F)-14 + Num_ASII/2;
    					   else if(num==6)Matrix.Time_Save[num] = (sec>>4) -14+ Num_ASII/2;
    					   else if(num==4)Matrix.Time_Save[num] = (min&0x0F)-14 + Num_ASII/2;
    					   else if(num==3)Matrix.Time_Save[num] = (min>>4) -14+ Num_ASII/2;
    					   else if(num==1)Matrix.Time_Save[num] = (hour&0x0F)-14 + Num_ASII/2;
    					   else if(num==0)Matrix.Time_Save[num] = (hour>>4)-14 + Num_ASII/2;
    					 }
    				   }  					   		
    		           if(num==0){byte= Matrix.hour_ten[i+1];byte_0=Matrix.hour_ten[i];}
    			  else if(num==1){byte= Matrix.hour_isl[i+1];byte_0=Matrix.hour_isl[i];}
    			  else if(num==2||num==5){byte=code_tab[Matrix.Time_Save[num]][i+1];byte_0=code_tab[Matrix.Time_Save[num]][i];}
    			  else if(num==3){byte= Matrix.min_ten[i+1];byte_0=Matrix.min_ten[i];}
    			  else if(num==4){byte= Matrix.min_isl[i+1];byte_0=Matrix.min_isl[i];}	
    			  else if(num==6){byte= Matrix.sec_ten[i+1];byte_0=Matrix.sec_ten[i];}
    			  else if(num==7){byte= Matrix.sec_isl[i+1];byte_0=Matrix.sec_isl[i];}
    
    		  ///////////////////////////////////////// on half up//////////////////
    		  //P1_0=0;
    		  //P1_1=0;
    		  if(!Next)byte=byte_0=0xFF;
    		  port_0=0x00;port_1=0x00;//clear data
    		  port_1 = 0x03;// off two led in side
    		  if(byte&0x01)port_1|=0x04;
    		  if(byte&0x02)port_1|=0x08;
    		  if(byte&0x04)port_1|=0x10;
    		  if(byte&0x08)port_1|=0x20;
    		  if(byte&0x10)port_1|=0x40;
    		  if(byte&0x20)port_1|=0x80;
    		  if(byte&0x40)port_0|=0x01;
    		  if(byte&0x80)port_0|=0x02;
    		  if(byte_0&0x01)port_0|=0x04; 
    		  if(byte_0&0x02)port_0|=0x08;
    		  if(byte_0&0x04)port_0|=0x10;
    		  if(byte_0&0x08)port_0|=0x20;
    		  if(byte_0&0x10)port_0|=0x40;
    		  port_0&=0x7F;
    		  ///////////////////////////////////////////////////////////////////		
    		  i+=2;if(i>=lengh_font){i=0;num++;}
    		}
    		else if((n>=COLUM/2)&&(n<l_clock)){
    		  if(_num_>=0&&_num_<15){
    			 byte= code_tab[Matrix.Date_Save[_num_]][_i_-1];
                 
    			 if(!Next)byte=0xFF;
    			 port_0=0x00;port_1=0x00;//clear data
    			 port_1 = 0x07;	//off three in side		
    			 if(byte&0x80)port_1|=0x08;
    			 if(byte&0x40)port_1|=0x10;
    			 if(byte&0x20)port_1|=0x20;
    			 if(byte&0x10)port_1|=0x40;	 
    			 if(byte&0x08)port_1|=0x80;
    			 if(byte&0x04)port_0|=0x01;
    			 if(byte&0x02)port_0|=0x02;
    			 if(byte&0x01)port_0|=0x04;
    
    			 byte= code_tab[Matrix.Date_Save[_num_]][_i_];
    			 if(!Next)byte=0xFF;
    
    			 if(byte&0x80)port_0|=0x08;
    			 if(byte&0x40)port_0|=0x10; 
    			 if(byte&0x20)port_0|=0x20;
    			 if(byte&0x10)port_0|=0x40;
    			 port_0&=0x7F;
    		  }
    		  else {port_0=0x7F;port_1=0xFF;}
    		  _i_-=2;if(_i_<0){_i_=lengh_font-1;_num_--;} 		  
    		}
    		else {port_0=0x7F;port_1=0xFF;}
    	     bit_do=1;
    		while(bit_do);// wait for timer2 display
    	    Colum++;
    	 }	 
    	   Colum=COLUM;// for off display timer1
    
    	   if(bit_left){
    	     bit_left=0;byte_and>>=1;if(byte_and==0)byte_and=0x80;
    		 if(++n_left>=16){n_left=0;byte_and=0x80;}
    	   }
    	   // SPEDD
    	   if(Speed>=SPEED){Speed=0; 
    	   if(l_clock<COLUM)l_clock++;
    	   if(l_clock>(COLUM/2)+1)num_i_clock+=2;
    	   if(num_i_clock>=lengh_font){num_i_clock=1;num_clock++;}
    	   if(num_clock>13+lengh_font){num_clock=0;l_clock=COLUM/2;num_i_clock=-1;}
    	}
    }
    void Setting(){
    	 unsigned char byte,byte_0,COLUM_on,COLUM_off;
    	 unsigned char COLUM_on_down,COLUM_off_down;
    	 unsigned char i,i_0,i_2,i_1_1=0;
    	 unsigned int n,i_1;
    	 char i_3=lengh_font-1;
    
    	 i_0=static_i_0;
    	 i_2=static_i_2;
    	 i_1=static_i_1;
    	 if(Menu==4)i=2;
    	 else if(Menu==6)i=9;
    	 
    	 COLUM_on = (COLUM/2)- ((lengh_font/2)*7);
    	 COLUM_on/=2;
    	 COLUM_off=COLUM_on+((lengh_font/2)*7);
    	 COLUM_on_down = (COLUM/2)-((lengh_font/2)*3);
    	 COLUM_on_down/=2;
    	 COLUM_off_down= COLUM_on_down+((lengh_font/2)*3);
    	 TR1=1;
    	 for(n=0;n<COLUM;n++){
    	    if(n>=COLUM_on&&n<COLUM_off){	
    		  if(n<COLUM_on+(lengh_font/2)){
    		     byte = code_rr[i_0+1];byte_0= code_rr[i_0];
    			 i_0+=2;
    		  }
    		  else if(n>=COLUM_on+(lengh_font/2)&&n<COLUM_on+((lengh_font/2)*6)){
    		     if(i_1<490){byte= code_setting[i_1+1];byte_0= code_setting[i_1]; 
    			    i_1+=2;			 
    			 }
    			 else {byte= code_setting[i_1_1+1];byte_0= code_setting[i_1_1];
    			 	i_1_1+=2;
    			 }
    		  }
    		  else {
    		     byte = code_ll[i_2+1];byte_0= code_ll[i_2];
    			 i_2+=2;
    		  } 
    		  if(!Next)byte=byte_0=0xFF;
    		  port_0=0x00;port_1=0x00;//clear data
    		  port_1 = 0x03;// off two led in side
    		  if(byte&0x01)port_1|=0x04;
    		  if(byte&0x02)port_1|=0x08;
    		  if(byte&0x04)port_1|=0x10;
    		  if(byte&0x08)port_1|=0x20;
    		  if(byte&0x10)port_1|=0x40;
    		  if(byte&0x20)port_1|=0x80;
    
    		  if(byte&0x40)port_0|=0x01;
    		  if(byte&0x80)port_0|=0x02;
    		  if(byte_0&0x01)port_0|=0x04;
    		  if(byte_0&0x02)port_0|=0x08;
    		  if(byte_0&0x04)port_0|=0x10;
    		  if(byte_0&0x08)port_0|=0x20;
    		  if(byte_0&0x10)port_0|=0x40;
    
    		}
    		else if(n>=COLUM/2){
    		  if(n>=(COLUM/2)+COLUM_on_down&&n<(COLUM/2)+COLUM_off_down){
    		     if(Menu<4||Menu==5||Menu==7||Menu==8){ 
    			   if(n<(COLUM/2)+COLUM_on_down+3){byte=0xFF;byte_0=0xFF;} //off
    			   else if(n<(COLUM/2)+COLUM_on_down+3+(lengh_font/2)){
    			          if(Menu==1||Menu==8){byte  = code_tab[(hour&0x0F)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(hour&0x0F)-14+Num_ASII/2][i_3];
    					  }
    					  else if(Menu==2){byte  = code_tab[(min&0x0F)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(min&0x0F)-14+Num_ASII/2][i_3];
    					  }
    					  else if(Menu==3){byte  = code_tab[(sec&0x0F)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(sec&0x0F)-14+Num_ASII/2][i_3];
    					  }
    					  else if(Menu==5){byte  = code_tab[(day&0x0F)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(day&0x0F)-14+Num_ASII/2][i_3];
    					  }
    					  else {byte  = code_tab[(year&0x0F)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(year&0x0F)-14+Num_ASII/2][i_3];
    					  }
    			          i_3-=2;if(i_3<0)i_3=lengh_font-1;
    					}
    			   else if(n<(COLUM/2)+COLUM_on_down+3+((lengh_font/2)*2)){ 
    			          if(Menu==1||Menu==8){byte  = code_tab[(hour>>4)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(hour>>4)-14+Num_ASII/2][i_3];
    			          }
    					  else if(Menu==2){byte  = code_tab[(min>>4)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(min>>4)-14+Num_ASII/2][i_3];
    			          }
    					  else if(Menu==3){byte  = code_tab[(sec>>4)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(sec>>4)-14+Num_ASII/2][i_3];
    					  }
    					  else if(Menu==5){byte  = code_tab[(day>>4)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(day>>4)-14+Num_ASII/2][i_3];
    					  }
    					  else {byte  = code_tab[(year>>4)-14+Num_ASII/2][i_3-1];
    			               byte_0= code_tab[(year>>4)-14+Num_ASII/2][i_3];
    					  }
    					  i_3-=2;if(i_3<0)i_3=lengh_font-1;			   
    			   }
    			   else {byte=0xFF;byte_0=0xFF;} //off
    			 }
    			 else {
    			 	   if(Menu==4||Menu==6){
    				   	 byte  = code_tab[Matrix.Date_Save[i]][i_3-1];
    			         byte_0= code_tab[Matrix.Date_Save[i]][i_3];
    					 i_3-=2;if(i_3<0){i_3=lengh_font-1;i--;}
    				   }
    				   else {byte=0xFF;byte_0=0xFF;} //off
    			 }
    			 if(!Next)byte=byte_0=0xFF;
    			 
    			 port_0=0x00;port_1=0x00;//clear data
    			 port_1 = 0x07;	//off three in side
    
    			 if(byte&0x80)port_1|=0x08;
    			 if(byte&0x40)port_1|=0x10;
    			 if(byte&0x20)port_1|=0x20;
    			 if(byte&0x10)port_1|=0x40; 
    			 if(byte&0x08)port_1|=0x80;
    			 if(byte&0x04)port_0|=0x01;
    			 if(byte&0x02)port_0|=0x02;
    			 if(byte&0x01)port_0|=0x04;
    
    			 if(byte_0&0x80)port_0|=0x08;
    			 if(byte_0&0x40)port_0|=0x10;
    			 if(byte_0&0x20)port_0|=0x20;
    			 if(byte_0&0x10)port_0|=0x40;
    			 port_0&=0x7F;
    
    		  }
    		  else {port_0=0x7F;port_1=0xFF;} //off 
    		}
    		else {port_0=0x7F;port_1=0xFF;} //off
    		bit_do=1;
    		while(bit_do);// wait for timer2 display   	 	
    	    Colum++;
    	 }	Colum=COLUM;// for off display timer1
    	 // SPEDD
    	 if(Speed>=SPEED&&Next){
    	   if(Static_Menu!=Menu){
    	   	 static_i_1+=2;
    		 if(static_i_1==70||
    		    static_i_1==140||
    			 static_i_1==210||
    			  static_i_1==280||
    			   static_i_1==350||
    			    static_i_1==420|| 
    			     static_i_1==490){Static_Menu=Menu;if(Static_Menu>=8){Static_Menu=1;Menu=1;static_i_1=0;}
    				                 EX1=1;	//enable interrupt 1
    		 }
    		           
    	   }
    	 }
    	 // SPEDD +1
    	 if(Speed>=SPEED+1){Speed=0;
    	   static_i_0+=lengh_font;if(static_i_0>=sizeof(code_rr))static_i_0=0;
    	   static_i_2+=lengh_font;if(static_i_2>=sizeof(code_ll))static_i_2=0;
    	 } 
    }
    void Clock_tick(){
    	 unsigned char COLUM_tick,COLUM_tick_0=0,COLUM_tick_1=0;
    	 unsigned char num,byte,byte_0,tick=45,c;
    	 unsigned int n;
    	 unsigned char num_more=0;    
    	 
    	 Update_time();// update hour-min-sec form ds1307
    	 COLUM_tick = COLUM/60;
    	 TR1=1;
    	 for(n=0;n<COLUM;n++){
    	    if(COLUM_tick_0==0){
    		  if(COLUM_tick_1==0){byte=0x1F;byte_0=0xFF;
    		  	     if(tick==0){byte=0x0F;byte_0=0xFF;}
    		  }
    	      else {byte=0x3F;byte_0=0xFF;
    		  		if(tick==59||tick==1){byte=0x1F;byte_0=0xFF;}
    		  }
    		  if(++COLUM_tick_1>4)COLUM_tick_1=0;
    		}
    		else {byte=0x7F;byte_0=0xFF;}
    		// move tick
    		if(COLUM_tick_0==0){
              ///move hour tick /////////////////
    		   num = ((hour>>4)*10)+(hour&0x0F);
    		   if(num==0)num=12;
    		   if(num>12) num-=12;
    		   num*=5;if(num==60)num=0;
    		   
    		   num_more=(((((min>>4)*10)+(min&0x0F))*10)/12);
    		   if(num_more<=10&&num_more>0)num+=1;
    		   else if(num_more<=20&&num_more>10)num+=2;
    		   else if(num_more<=30&&num_more>20)num+=3;
    		   else if(num_more<=40&&num_more>30)num+=4;
    		   if((tick+2)>=60)c=(tick+2)-60;else c=tick+2;
    		        if(c==num){byte&=Tick_hour[0];byte_0&=Tick_hour[1];}
    		    if((tick+1)>=60)c=(tick+1)-60;else c=tick+1;
    		        if(c==num){byte&=Tick_hour[2];byte_0&=Tick_hour[3];}
    		    if(tick==num){byte&=Tick_hour[4];byte_0&=Tick_hour[5];}
    				if((num+1)>=60)c=(num+1)-60;else c=num+1;
    			if(tick==c){byte&=Tick_hour[6];byte_0&=Tick_hour[7];}
    		    	if((num+2)>=60)c=(num+2)-60;else c=num+2;
    			if(tick==c){byte&=Tick_hour[8];byte_0&=Tick_hour[9];}
    		  //////////////////////////////////
    		  ///move min tick /////////////////
    		   num = ((min>>4)*10)+(min&0x0F);
    		   if((tick+2)>=60)c=(tick+2)-60;else c=tick+2;
    		        if(c==num){byte&=Tick_min[0];byte_0&=Tick_min[1];}
    		   if((tick+1)>=60)c=(tick+1)-60;else c=tick+1;
    		        if(c==num){byte&=Tick_min[2];byte_0&=Tick_min[3];}
    		    if(tick==num){byte&=Tick_min[4];byte_0&=Tick_min[5];}
    		        if((num+1)>=60)c=(num+1)-60;else c=num+1;
    			if(tick==c){byte&=Tick_min[6];byte_0&=Tick_min[7];}
    			    if((num+2)>=60)c=(num+2)-60;else c=num+2;
    		    if(tick==c){byte&=Tick_min[8];byte_0&=Tick_min[9];}
    		  //////////////////////////////////
    		  ///move sec tick /////////////////
    		   num = ((sec>>4)*10)+(sec&0x0F);
    		   if(tick==num){byte&=0xF0;byte_0&=0x00;}
    		  //////////////////////////////////
    
    		   tick++;if(tick>59)tick=0;
    		}
    	    if(++COLUM_tick_0>=COLUM_tick)COLUM_tick_0=0;  	
    		port_0=byte;port_1=byte_0;
    		 bit_do=1;
    		while(bit_do);// wait for timer2 display    	 	
    	    Colum++;	 
    	 }
    }
    Tiếp theo là file Font.H

    Code:
    #ifndef __FONT_H__
    #define __FONT_H__
    #define lengh_font 14
    #define num_font   39 //95
    code unsigned char code_tab[num_font][lengh_font]={
    0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// space	 0
    //0xFF,0xFF,0xF7,0xFF,0xF1,0x9F,0xF0,0x9F,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// !		 1
    //0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xE7,0xFF,0xFB,0xFF,  0xE7,0xFF,0xFF,0xFF,// "		 2
    //0xFF,0xFF,0xFE,0xBF,0xF0,0x1F,0xFD,0x7F,0xFD,0x7F,  0xF0,0x1F,0xFA,0xFF,// #		 3
    //0xF9,0xBF,0xF6,0xCF,0xF6,0x1F,0xF0,0xDF,0xE6,0xDF,  0xFB,0x3F,0xFF,0xFF,// $		 4
    //0xFB,0xDF,0xF5,0xBF,0xFB,0x7F,0xFE,0xFF,0xFD,0xBF,  0xFB,0x5F,0xF7,0xBF,// %		 5
    //0xFF,0x3F,0xFA,0x1F,0xF4,0xDF,0xF4,0xDF,0xF3,0x3F,  0xFE,0x1F,0xFE,0xDF,// &		 6
    //0xFF,0xFF,0xFF,0xFF,0xFB,0xFF,0xE3,0xFF,0xE7,0xFF,  0xFF,0xFF,0xFF,0xFF,// '		 7
    //0xFF,0xFF,0xFC,0x7F,0xF8,0x3F,0xF3,0x9F,0xF7,0xDF,  0xF7,0xDF,0xFF,0xFF,// (		 8
    //0xFF,0xFF,0xF7,0xDF,0xF7,0xDF,0xF3,0x9F,0xF8,0x3F,  0xFC,0x7F,0xFF,0xFF,// )		 9
    //0xFF,0xFF,0xED,0xFF,0xF3,0xFF,0xE1,0xFF,0xF3,0xFF,  0xED,0xFF,0xFF,0xFF,// *		 10
    //0xFE,0x7F,0xFE,0x7F,0xF8,0x1F,0xF8,0x1F,0xFE,0x7F,  0xFE,0x7F,0xFF,0xFF,// +		 11
    //0xFF,0xFF,0xFF,0xFF,0xFF,0x77,0xFF,0x0F,0xFF,0x9F,  0xFF,0xFF,0xFF,0xFF,// ,		 12
    0xFF,0xFF,0xFC,0xFF,0xFC,0xFF,0xFC,0xFF,0xFC,0xFF,  0xFF,0xFF,0xFF,0xFF,// -		 13
    //0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0xFF,0x9F,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// .		 14
    //0xFF,0xCF,0xFF,0x9F,0xFF,0x3F,0xFE,0x7F,0xFC,0xFF,  0xF9,0xFF,0xFF,0xFF,// /	 	 15
    0xF0,0x3F,0xE0,0x1F,0xE7,0x9F,0xE7,0x9F,0xE0,0x1F,  0xF0,0x3F,0xFF,0xFF,//0		 16
    0xFF,0xFF,0xF7,0x9F,0xE0,0x1F,0xE0,0x1F,0xFF,0x9F,  0xFF,0xFF,0xFF,0xFF,//1		 17
    0xF3,0x9F,0xE3,0x1F,0xE6,0x1F,0xE4,0x9F,0xE1,0x9F,  0xF3,0x9F,0xFF,0xFF,//2		 18
    0xF3,0x3F,0xE3,0x1F,0xE7,0x9F,0xE4,0x9F,0xE0,0x1F,  0xF3,0x3F,0xFF,0xFF,//3		 19
    0xFC,0x3F,0xF8,0x3F,0xF7,0x3F,0xE0,0x1F,0xE0,0x1F,  0xFF,0x3F,0xFF,0xFF,//4		 20
    0xE1,0x3F,0xE1,0x1F,0xE5,0x9F,0xE5,0x9F,0xE4,0x1F,  0xE6,0x3F,0xFF,0xFF,//5		 21
    0xF0,0x3F,0xE0,0x1F,0xE6,0x9F,0xE6,0x9F,0xE2,0x9F,  0xF3,0x3F,0xFF,0xFF,//6		 22
    0xE3,0xFF,0xE7,0xFF,0xE6,0x1F,0xE4,0x1F,0xE1,0xFF,  0xE3,0xFF,0xFF,0xFF,//7		 23
    0xF2,0x3F,0xE0,0x1F,0xE5,0x9F,0xE5,0x9F,0xE0,0x1F,  0xF2,0x3F,0xFF,0xFF,//8		 24
    0xF1,0x3F,0xE1,0x1F,0xE5,0x9F,0xE5,0x9F,0xE0,0x1F,  0xF0,0x3F,0xFF,0xFF,//9		 25
    0xFF,0xFF,0xFF,0xFF,0xF9,0x3F,0xF9,0x3F,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,//:		 26
    //0xFF,0xFF,0xFF,0xDF,0xFC,0x9F,0xFC,0xBF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,//;		 27
    //0xFE,0xFF,0xF8,0x3F,0xF1,0x1F,0xE7,0xCF,0xEF,0xEF,  0xFF,0xFF,0xFF,0xFF,//<		 28
    //0xFF,0xFF,0xF9,0x3F,0xF9,0x3F,0xF9,0x3F,0xF9,0x3F,  0xFF,0xFF,0xFF,0xFF,//=		 29
    //0xEF,0xEF,0xE7,0xCF,0xF1,0x1F,0xF8,0x3F,0xFE,0xFF,  0xFF,0xFF,0xFF,0xFF,//>		 30
    //0xE7,0xFF,0xC7,0xFF,0xCE,0x9F,0xCC,0x9F,0xC9,0xFF,  0xC3,0xFF,0xE7,0xFF,//?		 31
    //0xF0,0x3F,0xEC,0xDF,0xDB,0x5F,0xDB,0x5F,0xD8,0x5F,  0xDE,0x5F,0xE1,0xBF,//@ 		 32
    0xFC,0x1F,0xF8,0x1F,0xF6,0xFF,0xF6,0xFF,0xF8,0x1F,  0xFC,0x1F,0xFF,0xFF,// A		 33
    0xF0,0x1F,0xF0,0x1F,0xF6,0xDF,0xF6,0xDF,0xF0,0x1F,  0xF9,0x3F,0xFF,0xFF,// B		 34
    0xF8,0x3F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,0xF7,0xDF,  0xFB,0xBF,0xFF,0xFF,// C		 35
    0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,0xF8,0x3F,  0xFC,0x7F,0xFF,0xFF,// D		 36
    0xF0,0x1F,0xF0,0x1F,0xF2,0x9F,0xF2,0x9F,0xF3,0x9F,  0xF3,0x9F,0xFF,0xFF,// E		 37
    0xF0,0x1F,0xF0,0x1F,0xF2,0xFF,0xF2,0xFF,0xF2,0xFF,  0xF3,0xFF,0xFF,0xFF,// F		 38
    0xF8,0x3F,0xF0,0x1F,0xF3,0xDF,0xF3,0x5F,0xF1,0x1F,  0xF9,0x3F,0xFF,0xFF,// G		 39
    0xF0,0x1F,0xF0,0x1F,0xFE,0xFF,0xFE,0xFF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// H		 40
    0xFF,0xFF,0xF7,0xDF,0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,  0xFF,0xFF,0xFF,0xFF,// I		 41
    0xFF,0xBF,0xF7,0xDF,0xF0,0x1F,0xF0,0x3F,0xF7,0xFF,  0xFF,0xFF,0xFF,0xFF,// J		 42
    0xF0,0x1F,0xF0,0x1F,0xFC,0x7F,0xF9,0x3F,0xF3,0x9F,  0xF7,0xDF,0xFF,0xFF,// K		 43
    0xF0,0x1F,0xF0,0x1F,0xFF,0x9F,0xFF,0x9F,0xFF,0x9F,  0xFF,0x9F,0xFF,0xFF,// L		 44
    0xF0,0x1F,0xF1,0xFF,0xF8,0x1F,0xF8,0x1F,0xF1,0xFF,  0xF0,0x1F,0xFF,0xFF,// M		 45
    0xF0,0x1F,0xF0,0x1F,0xF9,0xFF,0xFC,0xFF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// N		 46
    0xF8,0x3F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,0xF0,0x1F,  0xF8,0x3F,0xFF,0xFF,// O		 47
    0xF0,0x1F,0xF0,0x1F,0xF6,0xDF,0xF6,0xFF,0xF0,0xFF,  0xF9,0xFF,0xFF,0xFF,// P		 48
    0xF8,0x3F,0xF0,0x1F,0xF7,0xDF,0xF7,0x5F,0xF8,0x3F,  0xF8,0x5F,0xFF,0xFF,// Q		 49
    0xF0,0x1F,0xF0,0x1F,0xF6,0x7F,0xF6,0x3F,0xF0,0x9F,  0xF9,0xDF,0xFF,0xFF,// R		 50
    0xF9,0xBF,0xF0,0x9F,0xF6,0xDF,0xF6,0x5F,0xF3,0x1F,  0xFB,0xBF,0xFF,0xFF,// S		 51
    0xF3,0xFF,0xF7,0xDF,0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,  0xF3,0xFF,0xFF,0xFF,// T		 52
    0xF0,0x3F,0xF0,0x1F,0xFF,0xDF,0xFF,0xDF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// U		 53
    0xF1,0xFF,0xF0,0x3F,0xFF,0x9F,0xFF,0x9F,0xF0,0x3F,  0xF1,0xFF,0xFF,0xFF,// V		 54
    0xF0,0x7F,0xFF,0x3F,0xFC,0x1F,0xFC,0x1F,0xFF,0x3F,  0xF0,0x7F,0xFF,0xFF,// W		 55
    0xF3,0xDF,0xF9,0x9F,0xFC,0x3F,0xFE,0x7F,0xFC,0x3F,  0xF9,0x9F,0xF3,0xDF,// X		 56
    0xF3,0xFF,0xF9,0x9F,0xFC,0x1F,0xFC,0x3F,0xF9,0xFF,  0xF3,0xFF,0xFF,0xFF,// Y		 57
    0xF3,0x9F,0xF7,0x1F,0xF6,0x5F,0xF4,0xDF,0xF1,0xDF,  0xF3,0x9F,0xFF,0xFF,// Z		 58	
    /*
    0xFF,0xFF,0xF0,0x1F,0xF0,0x1F,0xF7,0xDF,0xF7,0xDF,  0xF3,0x9F,0xFF,0xFF,// [		 59
    0xF9,0xFF,0xFC,0xFF,0xFE,0x7F,0xFF,0x3F,0xFF,0x9F,  0xFF,0xDF,0xFF,0xFF,//\		 60
    0xFF,0xFF,0xF3,0x9F,0xF7,0xDF,0xF7,0xDF,0xF0,0x1F,  0xF0,0x1F,0xFF,0xFF,// ]		 61
    0xFD,0xFF,0xF9,0xFF,0xF3,0xFF,0xE7,0xFF,0xF3,0xFF,  0xF9,0xFF,0xFD,0xFF,// ^		 62
    0xFF,0xFF,0xFF,0x9F,0xFF,0x9F,0xFF,0x9F,0xFF,0x9F,  0xFF,0x9F,0xFF,0xFF,// _		 63
    0xFF,0xFF,0xFF,0xFF,0xED,0xFF,0xE3,0xFF,0xF3,0xFF,  0xFF,0xFF,0xFF,0xFF,// `		 64
    0xFF,0xFF,0xFE,0x3F,0xFC,0x1F,0xFD,0xDF,0xFC,0x3F,  0xFE,0x1F,0xFF,0xDF,// a		 65
    0xFF,0xFF,0xF8,0x1F,0xF8,0x1F,0xFE,0xDF,0xFE,0x1F,  0xFF,0x3F,0xFF,0xFF,// b		 66
    0xFC,0x3F,0xF8,0x1F,0xFB,0xDF,0xFB,0xDF,0xFD,0xBF,  0xFF,0xFF,0xFF,0xFF,// c		 67
    0xFF,0x3F,0xFE,0x1F,0xFE,0xDF,0xF8,0x3F,0xF8,0x1F,  0xFF,0xDF,0xFF,0xFF,// d		 68
    0xFF,0xBF,0xFE,0x3F,0xFD,0x9F,0xFD,0x5F,0xFE,0xDF,  0xFF,0xBF,0xFF,0xFF,// e		 69
    0xFF,0xFF,0xFF,0x7F,0xFC,0x1F,0xFB,0x7F,0xFA,0xFF,  0xFF,0xFF,0xFF,0xFF,// f		 70
    0xFC,0xFF,0xFB,0x5F,0xFB,0x2F,0xFC,0x1F,0xFE,0xFF,  0xFF,0xFF,0xFF,0xFF,// g		 71
    0xFF,0xFF,0xFF,0x7F,0xFC,0x1F,0xFA,0x7F,0xF9,0x1F,  0xFF,0xDF,0xFF,0xFF,// h		 72
    0xFF,0xFF,0xFF,0xFF,0xFA,0x3F,0xFF,0xDF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// i		 73
    0xFF,0xFF,0xFF,0xBF,0xFE,0xDF,0xFA,0x3F,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// j		 74
    0xFF,0xFF,0xF8,0x1F,0xFE,0x7F,0xFD,0xBF,0xFB,0xDF,  0xFF,0xFF,0xFF,0xFF,// k		 75
    0xFF,0x7F,0xF8,0x3F,0xF6,0xDF,0xF9,0xDF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// l		 76
    0xFC,0x1F,0xFD,0xFF,0xFC,0x1F,0xFD,0xFF,0xFE,0x1F,  0xFF,0xFF,0xFF,0xFF,// m		 77
    0xFF,0xFF,0xFC,0x1F,0xFD,0xFF,0xFD,0xFF,0xFE,0x1F,  0xFF,0xFF,0xFF,0xFF,// n		 78
    0xFF,0xFF,0xFE,0x3F,0xFD,0xDF,0xFD,0xDF,0xFE,0x3F,  0xFF,0xFF,0xFF,0xFF,// o		 79
    0xFF,0xFF,0xFC,0x0F,0xFD,0xBF,0xFD,0xBF,0xFE,0x7F,  0xFF,0xFF,0xFF,0xFF,// p		 80
    0xFF,0xFF,0xFE,0x7F,0xFD,0xBF,0xFD,0xBF,0xFC,0x0F,  0xFF,0xFF,0xFF,0xFF,// q		 81
    0xFF,0xFF,0xFC,0x1F,0xFE,0xFF,0xFE,0x7F,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// r		 82
    0xFF,0xFF,0xFD,0xBF,0xFA,0xDF,0xFB,0x5F,0xFD,0xBF,  0xFF,0xFF,0xFF,0xFF,// s		 83
    0xFF,0xFF,0xFD,0xFF,0xF8,0x3F,0xFD,0xDF,0xFF,0xBF,  0xFF,0xFF,0xFF,0xFF,// t		 84
    0xFD,0xFF,0xFC,0x3F,0xFF,0xDF,0xFF,0xDF,0xFC,0x3F,  0xFF,0xDF,0xFF,0xFF,// u		 85
    0xFF,0xFF,0xFC,0x7F,0xFF,0xBF,0xFF,0xDF,0xFF,0xBF,  0xFC,0x7F,0xFF,0xFF,// v		 86
    0xFF,0xFF,0xFC,0x7F,0xFF,0xBF,0xFE,0x1F,0xFF,0xBF,  0xFC,0x7F,0xFF,0xFF,// w		 87
    0xFF,0xFF,0xFD,0xDF,0xFE,0xBF,0xFF,0x7F,0xFE,0xBF,  0xFD,0xDF,0xFF,0xFF,// x		 88
    0xFF,0xFF,0xFC,0xFF,0xFF,0x4F,0xFF,0x2F,0xFC,0x1F,  0xFF,0x7F,0xFF,0xFF,// y		 89
    0xFF,0xFF,0xFD,0x9F,0xFD,0x9F,0xFD,0x5F,0xFC,0xDF,  0xFC,0xDF,0xFF,0xFF,// z		 90
    0xFE,0xFF,0xF8,0x3F,0xF1,0x1F,0xEF,0xEF,0xEF,0xEF,  0xFF,0xFF,0xFF,0xFF,// {		 91
    0xFF,0xFF,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xFF,0xFF,  0xFF,0xFF,0xFF,0xFF,// |		 92
    0xFF,0xFF,0xEF,0xEF,0xEF,0xEF,0xF1,0x1F,0xF8,0x3F,  0xFE,0xFF,0xFF,0xFF,// }		 93
    0xFE,0xFF,0xFD,0xFF,0xFC,0x7F,0xFE,0x3F,0xFF,0xBF,  0xFF,0x7F,0xFF,0xFF// ~		 94
    */};
    #endif
    File ds1307.H
    Code:
    #ifndef __DS1307_H__
    #define __DS1307_H__
    
    extern void I2c_start(void);
    extern void I2c_stop(void);
    extern unsigned char I2c_read(bit ack);
    extern bit I2c_write(unsigned char value);
    extern bit Ext_I2c_ready() ;
    extern void DS_Init();
    extern void Update_time();
    extern void Update_date();
    extern void Save_Newtime();
    
    #endif
    Và cuối cùng là file hổ trợ giao tiếp chuẩn I2C DS1307.C
    Code:
    #include "AT89x52.H"
    unsigned char  hour,min,sec,date,day,month,year;
    
    //**************************************
    //   i2c programer 
    //   Date : 11/03/2013 LY DUY TIN 
    //**************************************
    
    ///////////////// this program will for ds1307 run in mode 24h per day.
    
    //define address of ds
    #define SCK P2_2
    #define SDA P2_1
    
    #define ADD_Ds1307 0xD0
    #define Add_sec         0x00
    #define Add_min         0x01
    #define Add_hour        0x02
    #define Add_date        0x03
    #define Add_day         0x04
    #define Add_month       0x05
    #define Add_year        0x06
    
    //define address of Ram if use this
    
    #define Add_timer_1     0x08
    #define Add_timer_2     0x0C
    #define Add_timer_3     0x10
    #define Add_timer_4     0x14
    #define Add_timer_5     0x18
    #define Add_timer_6     0x1C
    #define Add_timer_7     0x20
    #define Add_timer_8     0x24
    #define Add_timer_9     0x28
    #define Add_timer_10    0x2C 
    #define Add_End_Of_Ram  0x3F
    
    void I2c_start(void){
    	SDA = 1;
    	SCK = 1;
    	SDA = 0;
    	SCK = 0;
    }
    void I2c_stop(void){
    	SCK = 0;
    	SDA = 0;
    	SCK = 1;
    	SDA = 1;
    }
    unsigned char I2c_read(bit ack){
    	unsigned char i, result;
    
    	result = 0;
    	SDA = 1; //select input direction
    	SCK = 0;
    	for(i = 0; i < 8; i++)
    	{		
    		SCK = 1;
    		result <<= 1;
    		if(SDA == 1) result++;
    		SCK = 0;
    	}
    	if(ack)SDA=0;else SDA=1;
    	SCK = 1;
    	SCK = 0;
    	return result;
    }
    bit I2c_write(unsigned char value){
    	unsigned char i, temp;
    	bit ack;
    	
    	temp = value;
    	SCK = 0;
    	SCK = 0;
    	for(i = 0; i < 8; i++)
    	{			
    		temp <<= 1;
    		SDA = CY;
    		SCK = 1;
    		SCK = 0;
    	}
    	SDA = 1;	// read ACK
    	SCK = 1;
    	ack = SDA;
    	SCK = 0;
    	return ack;
    } 
    bit Ext_I2c_ready() {
       bit ack;
       I2c_start();            // If the write command is acknowledged,
       ack = I2c_write(ADD_Ds1307);  // then the device is ready.
       I2c_stop();
       return !ack;
    }
    void DS_Init(){
         unsigned char Test=0;
    	 while(Test!=0x88){
    	 while(!Ext_I2c_ready());    
    	 I2c_start();
         I2c_write(ADD_Ds1307);
    	 I2c_write(Add_End_Of_Ram); 
    	 I2c_stop();
    	 I2c_start();
         I2c_write(ADD_Ds1307|1);		  
    	 Test=I2c_read(0);
    	 I2c_stop();
    
         if(Test!=0x88){
    	     //set byte test 
    		 I2c_start();
    	     I2c_write(ADD_Ds1307);
    		 I2c_write(Add_End_Of_Ram);
    		 I2c_write(0x88);
    		 I2c_stop();
    		 //set time first
    		 I2c_start();
    	     I2c_write(ADD_Ds1307);
    		 I2c_write(Add_sec);
    		 I2c_write(0x00);
    		 I2c_write(0x00);
    		 I2c_write(0x00);
    		 I2c_write(0x03);
    		 I2c_write(0x03);
    		 I2c_write(0x03);
    		 I2c_write(0x13);
    		 I2c_stop();
    		 //set time fo
    	 }
    	 // freguency 1 hz
    		 I2c_start();
    		 I2c_write(ADD_Ds1307);
    		 I2c_write(0x07);
    		 I2c_write(0x10);
    		 I2c_stop();
         }
    }
    void Update_time(){
         while(!Ext_I2c_ready());    
    	 I2c_start();
         I2c_write(ADD_Ds1307);
    	 I2c_write(Add_sec); 
    	 I2c_stop();
    	 I2c_start();
         I2c_write(ADD_Ds1307|1);
    	 sec=I2c_read(1);
    	 min=I2c_read(1);		  
    	 hour=I2c_read(0);
    	 I2c_stop(); 
    } 
    void Update_date(){	
    	 while(!Ext_I2c_ready());    
    	 I2c_start();
         I2c_write(ADD_Ds1307);
    	 I2c_write(Add_date); 
    	 I2c_stop();
    	 I2c_start();
         I2c_write(ADD_Ds1307|1);
    	 date=I2c_read(1);
    	 day=I2c_read(1);
    	 month=I2c_read(1);
    	 year=I2c_read(0);
    	 I2c_stop(); 
    }
    void Save_Newtime(){
    		 //set new time 
    		 I2c_start();
    	     I2c_write(ADD_Ds1307);
    		 I2c_write(Add_sec);
    		 I2c_write(sec);
    		 I2c_write(min);
    		 I2c_write(hour);
    		 I2c_write(date);
    		 I2c_write(day);
    		 I2c_write(month);
    		 I2c_write(year);
    		 I2c_stop();
    }
    Và đây là sản phẩm mới hoàn thành đây.


    File mạch in đây.
    hardware vs 00.PDF
    Last edited by thientanvt; 13-04-2013, 19:48.

  • #2
    rất tuyệt ,cho em hỏi thuật toán để hiển thị ra kim đồng hồ chạy chạy như bác như thế nào nhỉ?

    Comment


    • #3
      cái này b có thể hướng dẫn về nguồn ko,quan trọng là làm nguồn ổn định mà ko gây tiếng ồn

      Comment


      • #4
        Bạn cấp nguồn bằng chổi than phải ko?
        - Mạch nạp vdk 8051, AVR, PIC, EEPROM
        - Linh kiện điện tử cho sinh viên


        Comment


        • #5
          chất lượng ghê ^_^
          Website chính thức đổi địa chỉ website thành
          Mời các bạn ghé thăm !!!

          Comment


          • #6
            bạn tô màu code những chỗ code và mã led tạo hiện ứng chuyển số cho mình thao khảo với hihihi
            |

            Comment


            • #7
              bạn có thể cho sơ đồ nguyên lý dc ko?

              Comment


              • #8
                Nguyên văn bởi tranvanlac Xem bài viết
                rất tuyệt ,cho em hỏi thuật toán để hiển thị ra kim đồng hồ chạy chạy như bác như thế nào nhỉ?
                Hì có hết trong hàm con Clock_tick đó xem từ từ đi.

                Nguyên văn bởi daaa Xem bài viết
                cái này b có thể hướng dẫn về nguồn ko,quan trọng là làm nguồn ổn định mà ko gây tiếng ồn
                Hi kêu thì có kêu rồi , nhưng phần cấp nguồn thì mình làm theo kiểu đơn giản lắm, trục đc làm cực âm còn cực dương thì mình
                làm một sợi dây đồng nhỏ day kẽm cũng đc miển sao nhỏ gọn độ bền cao là đc rồi cho nó tì vô cái mạch hình tròn nhỏ đó có trong
                PCB của mình up lên đấy.

                Nguyên văn bởi nguyen24 Xem bài viết
                Bạn cấp nguồn bằng chổi than phải ko?
                K mình đã Trl ở trên rồi đó.

                Nguyên văn bởi quangminh Xem bài viết
                bạn tô màu code những chỗ code và mã led tạo hiện ứng chuyển số cho mình thao khảo với hihihi
                Hi hi , cơm đã dọn sẵn rồi chỉ còn chịu khó ngồi sơi thôi mà cứ từ từ ngâm cứu đi nhé.

                Nguyên văn bởi vanlamhaui Xem bài viết
                bạn có thể cho sơ đồ nguyên lý dc ko?
                Hi hi cái này do phải vẽ theo kiễu tự sắp xếp sao cho gọn nhất nên chỉ có file mạch in thôi nhưng nếu bạn có kinh nghiệm về 89 thì
                phần cứng nhìn vào là hiểu liền thôi.

                Comment


                • #9
                  người ta xin ghi chú thì ghi chú dùm người ta đi, bạn viết code bạn cũng biết code do bạn viết để 1 tháng sau đọc lại chưa chắc bạn nhớ hết có chạy thế nào mà. Đã share rồi thì giúp dùm người mới.

                  Comment


                  • #10
                    dùng thêm mach cấp điện bằng biến áp lõi ko khí ,thiết kế hôp mica nua là tuyệt
                    không thể làm những gì bạn muốn,hãy làm những gì bạn có thể làm .Đời không như mơ

                    Comment


                    • #11
                      Nguyên văn bởi fantasy Xem bài viết
                      dùng thêm mach cấp điện bằng biến áp lõi ko khí ,thiết kế hôp mica nua là tuyệt
                      Biến áp lỗi không khí thì mình có từng nghỉ tới nhưng chưa thấy ai trên dd chỉ dẫn cả , số vong dây , tiết diện, kích thước lõi dây,... mấy cái thông số cụ thể nữa mà không thấy đâu có cả nên đành làm với cách cổ điển thôi.

                      Comment


                      • #12
                        thì bạn tham khảo web nước ngoài
                        http://www.roelhermus.nl/frame/page....ventilatorklok
                        Tjaco's design graveyard

                        Comment


                        • #13
                          Nguyên văn bởi thientanvt Xem bài viết
                          Biến áp lỗi không khí thì mình có từng nghỉ tới nhưng chưa thấy ai trên dd chỉ dẫn cả , số vong dây , tiết diện, kích thước lõi dây,... mấy cái thông số cụ thể nữa mà không thấy đâu có cả nên đành làm với cách cổ điển thôi.
                          bác ở đâu em đến học hỏi phát.

                          Comment


                          • #14
                            Nguyên văn bởi phamennho Xem bài viết
                            bác ở đâu em đến học hỏi phát.
                            Hì Tôi ở miền tây , tại tp Sóc Trăng . Không biết có gần chổ của bạn k nhỉ.

                            Comment


                            • #15
                              ôi thôi chịu rồi.thích cái trên quá mà tơ mơ quá bác ạ.

                              Comment

                              Về tác giả

                              Collapse

                              thientanvt Tìm hiểu thêm về thientanvt

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X