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

📄 main.i

📁 和泰公司的实时时钟RTC IC HT1381的读写程序,使用的是AVR 的M16.
💻 I
📖 第 1 页 / 共 2 页
字号:
	HT1381_write_byte(HT1381_year_add,time_buf[1]);		//年 
	HT1381_write_byte(HT1381_month_add,time_buf[2]);	//月 
	HT1381_write_byte(HT1381_date_add,time_buf[3]);		//日 
	HT1381_write_byte(HT1381_hr_add,time_buf[4]);		//时 
	HT1381_write_byte(HT1381_min_add,time_buf[5]);		//分
	HT1381_write_byte(HT1381_sec_add,time_buf[6]);		//秒
	HT1381_write_byte(HT1381_day_add,time_buf[7]);		//周
        HT1381_write_byte(HT1381_sec_add,0x00);			//使能振荡
	HT1381_write_byte(HT1381_control_add,0x80);		//打开写保护 
}   */

/*从HT1381读出时钟数据*/
void HT1381_read_time(void)  
{ 
	time_buf[0]=HT1381_read_byte(0x8c		);		//年 
	time_buf[1]=HT1381_read_byte(0x88		);		//月 
	time_buf[2]=HT1381_read_byte(0x86		);		//日 
	time_buf[3]=HT1381_read_byte(0x84		);		//时 
	time_buf[4]=HT1381_read_byte(0x82		);		//分 
	time_buf[5]=(HT1381_read_byte(0x80		))&0x7F;    //秒 
	time_buf[6]=HT1381_read_byte(0x8a		);		//周 
}

/*HT1381初始化函数*/
void HT1381_init(void) 
{
	PORTD &= ~((1 << (0)))  ;			/*RST脚置低*/
	PORTD &= ~((1 << (2)))  ;			/*SCK脚置低*/
	DDRD |= (1 << (0))      ;			/*RST脚设置为输出*/
	DDRD |= (1 << (2))      ;			/*SCK脚设置为输出*/ 
}
//set_bit ,功能选择键,用以改变set_bit_flag的值
//set_bit_flag=0,正常状态.set_bit_flag=1,设置状态.
//key_set_move,按键,移动选择
//key_add,按键,加.
//key_subtract,按键,减.
//key_set_ok,按键,设置确定键,设置好年月日,时分秒按此键方能确定送出显示
//time_temp[0]-time_temp[5]分别对应年月日,时分秒,用以暂存

unsigned char time_temp[6];
unsigned char time_temp[6];
unsigned char set_bit_move; 
//bit display_flag=0;
bit set_bit_flag=0;



void tone(unsigned int Buzzer_time)  //X定义为报警时间的长短
{
unsigned int i;
  for(i=0;i<Buzzer_time;i++)
   {      
     PORTB.6               =~PORTB.6               ;
     delay_us(250);
     }
}

unsigned char BCD_Convert(unsigned char x_data)
{ 
  unsigned char x_temp;
  x_temp=((x_data/10)<<4)|(x_data%10);
  return x_temp;
} 

void settime_writteninto1381(void)
{

	HT1381_write_byte(0x8e		,0x00);		//关闭写保护 
	HT1381_write_byte(0x80		,0x80);			//暂停 

	HT1381_write_byte(0x8c		,BCD_Convert(time_temp[0]));	//年 
	HT1381_write_byte(0x88		,BCD_Convert(time_temp[1]));	//月 
	HT1381_write_byte(0x86		,BCD_Convert(time_temp[2]));	//日 

	HT1381_write_byte(0x84		,BCD_Convert(time_temp[3]));		//时 
	HT1381_write_byte(0x82		,BCD_Convert(time_temp[4]));		//分
	HT1381_write_byte(0x80		,BCD_Convert(time_temp[5]));		//秒
	//HT1381_write_byte(HT1381_day_add,time_temp[6]);	//周

        HT1381_write_byte(0x80		,0x00);			//使能振荡
	HT1381_write_byte(0x8e		,0x80);		//打开写保护 
    
   //   display_flag=0;          //清显示标志位,以返回到正常显示状态   
      set_bit_flag=0;
      tone(400);               //嘀一声长报警
}
   
void key_scan(void)
{
if(PIND.3==0)
  {
    delay_ms(50);
    if(PIND.3==0)
      {
        tone(70);
        display_clear(); //先清屏,再转换状态,以免LCD上字符显示重复/叠加
        set_bit_flag=!set_bit_flag; 
       }
   } 
   
if(set_bit_flag==1)
  {
      if(PIND.4==0)
         {
           delay_ms(50);
           if(PIND.4==0)
             {
              tone(70);
              set_bit_move+=1;
              if(set_bit_move>5) set_bit_move=0;
              }
          }

    switch(set_bit_move)
      {
       case 0:
            {
             if(PIND.5==0)
               {
                delay_ms(50);
                 if(PIND.5==0)
                   {
                  tone(70);
                  time_temp[0]+=1;
                  if(time_temp[0]>99) time_temp[0]=0;
                   }
                }
             if(PIND.6==0)
               {
                delay_ms(50);
                if(PIND.6==0)
                  {
                 tone(70);
                 time_temp[0]-=1;
                 if(time_temp[0]==0) time_temp[0]=0;
                 }
               }
             } break;       //年


       case 1:
            {
             if(PIND.5==0)
               {
                delay_ms(50);
                 if(PIND.5==0)
                   {
                  tone(70);
                  time_temp[1]+=1;
                  if(time_temp[1]>12) time_temp[1]=0;
                   }
                }
             if(PIND.6==0)
               {
                delay_ms(50);
                if(PIND.6==0)
                  {
                 tone(70);
                 time_temp[1]-=1;
                 if(time_temp[1]==0) time_temp[1]=0;
                }
               }
             } break;         //月

       case 2:
            {
             if(PIND.5==0)
               {
                delay_ms(50);
                 if(PIND.5==0)
                   {
                  tone(70);
                  time_temp[2]+=1;
                  if(time_temp[2]>31) time_temp[2]=0;
                   }
                }
             if(PIND.6==0)
               {
                delay_ms(50);
                if(PIND.6==0)
                  {
                 tone(70);
                 time_temp[2]-=1;
                 if(time_temp[2]==0) time_temp[2]=0;
                  }
               }
             } break;         //日

       case 3:
            {
             if(PIND.5==0)
               {
                delay_ms(50);
                 if(PIND.5==0)
                   {
                  tone(70);
                  time_temp[3]+=1;
                  if(time_temp[3]>23) time_temp[3]=0;
                   }
                }
             if(PIND.6==0)
               {
                delay_ms(50);
                if(PIND.6==0)
                  {
                 tone(70);
                 time_temp[3]-=1;
                 if(time_temp[3]==0) time_temp[3]=0;
                }
               }
             } break;           //时

       case 4:
            {
             if(PIND.5==0)
               {
                delay_ms(50);
                 if(PIND.5==0)
                   {
                  tone(70);
                  time_temp[4]+=1;
                  if(time_temp[4]>60) time_temp[4]=0;
                   }
                }
             if(PIND.6==0)
               {
                delay_ms(50);
                if(PIND.6==0)
                  {
                 tone(70);
                 time_temp[0]-=1;
                 if(time_temp[4]==0) time_temp[4]=0;
                  }
                }                  
             } break;          //分

       case 5:
            {
             if(PIND.5==0)
               {
                delay_ms(50);
                 if(PIND.5==0)
                   {
                  tone(70);
                  time_temp[5]+=1;
                  if(time_temp[5]>59) time_temp[5]=0;
                   }
                }
             if(PIND.6==0)
               {
                delay_ms(50);
                if(PIND.6==0)
                  {
                 tone(70);
                 time_temp[5]-=1;
                 if(time_temp[5]==0) time_temp[5]=0;
                  }             //秒
                }
             } break;
       }
//key_set_ok,设置确定键,设置好年月日,时分秒按此键方能确定送出显示
if(PIND.7==0)
   {
   delay_ms(50);
   if(PIND.7==0)
     {
       tone(70);
       display_clear();
       settime_writteninto1381();
     }             
   }
 }
}

void time_display(void)
{  
//display_clear();
// switch(display_flag)
switch(set_bit_flag)
  {
case 0:{ 
Written_char(0,2,(time_buf[0]>>4));
Written_char(0,3,(time_buf[0]&0x0f)); 
Written_char(0,4,63);
Written_char(0,5,(time_buf[1]>>4));
Written_char(0,6,(time_buf[1]&0x0f)); 
Written_char(0,7,63);
Written_char(0,8,(time_buf[2]>>4));
Written_char(0,9,(time_buf[2]&0x0f)); 
Written_char(1,2,(time_buf[3]>>4));
Written_char(1,3,(time_buf[3]&0x0f));
Written_char(1,4,63);
Written_char(1,5,(time_buf[4]>>4));
Written_char(1,6,(time_buf[4]&0x0f));
Written_char(1,7,63);
Written_char(1,8,(time_buf[5]>>4));
Written_char(1,9,(time_buf[5]&0x0f));
           } break;
case 1:{ 
 
Written_char(0,0,54); 
Written_char(0,1,14);
Written_char(0,2,29);

Written_char(1,1,set_bit_move); 

Written_char(0,3,(time_temp[0]/10));
Written_char(0,4,(time_temp[0]%10)); 
Written_char(0,5,63);
Written_char(0,6,(time_temp[1]/10));
Written_char(0,7,(time_temp[1]%10)); 
Written_char(0,8,63);
Written_char(0,9,(time_temp[2]/10));
Written_char(0,10,(time_temp[2]%10)); 

Written_char(1,3,(time_temp[3]/10));
Written_char(1,4,(time_temp[3]%10));
Written_char(1,5,63);
Written_char(1,6,(time_temp[4]/10));
Written_char(1,7,(time_temp[4]%10));
Written_char(1,8,63);
Written_char(1,9,(time_temp[5]/10));
Written_char(1,10,(time_temp[5]%10));
       } break;
  }
}
flash unsigned char joke_0[]={0x02,0x00,0x84,0x0F,0x8C,0x08,0x84,0x08,0x80,0x08,0x80,0x08,0x47,0x70,0xA4,0x1F,0x84,0x10,0x84,0x10,0x04,0x09,
flash unsigned char joke_0[]={0x02,0x00,0x84,0x0F,0x8C,0x08,0x84,0x08,0x80,0x08,0x80,0x08,0x47,0x70,0xA4,0x1F,0x84,0x10,0x84,0x10,0x04,0x09,
0x04,0x09,0x14,0x06,0x0C,0x09,0xC4,0x70,0x30,0x20}; /*"设"*/
flash unsigned char joke_1[]={0x02,0x04,0x04,0x04,0x0C,0x04,0x04,0x04,0x00,0x04,0xCF,0x7F,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,
0x48,0x04,0x28,0x04,0x18,0x04,0x08,0x04,0x00,0x04}; /*"计"*/
flash unsigned char joke_2[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x03,0xC0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xC0,0x03,0xC0,0x03,0x00,0x00,0x00,0x00}; /*":"*/
flash unsigned char joke_3[]={0x80,0x00,0x80,0x00,0xFE,0x3F,0xC0,0x01,0xA0,0x02,0x90,0x0C,0x8C,0x70,0xFB,0x27,0x00,0x01,0x80,0x00,0xFE,0x7F,
0x80,0x00,0x80,0x00,0x80,0x00,0xA0,0x00,0x40,0x00}; /*"李"*/
flash unsigned char joke_4[]={0x00,0x04,0x3C,0x04,0xA4,0x04,0xA4,0x04,0xBC,0x3F,0x64,0x04,0x24,0x04,0x24,0x04,0xBC,0x3F,0x24,0x04,0x24,0x04,
0x24,0x04,0x22,0x04,0xEA,0x7F,0x11,0x00,0x00,0x00}; /*"胜"*/
flash unsigned char joke_5[]={0x00,0x00,0xFC,0x7F,0x44,0x40,0xC2,0x20,0x22,0x08,0xFC,0x1F,0x20,0x00,0x90,0x00,0x90,0x08,0xF8,0x1F,0x80,0x00,
0x80,0x20,0xFE,0x7F,0x80,0x00,0x80,0x00,0x80,0x00}; /*"军"*/

void Display_joke(void)    //显示设计者名字
{  unsigned char i;
       for(i=0;i<16;i++)
       {written_add_data((unsigned int)i*16,joke_0[(unsigned int)i*2]);
        written(joke_0[(unsigned int)i*2+1]);}  
       for(i=0;i<16;i++)
       {written_add_data((unsigned int)i*16+2,joke_1[(unsigned int)i*2]);
        written(joke_1[(unsigned int)i*2+1]);} 
       for(i=0;i<16;i++)
       {written_add_data((unsigned int)i*16+4,joke_2[(unsigned int)i*2]);
       written(joke_2[(unsigned int)i*2+1]);} 
       for(i=0;i<16;i++)
       {written_add_data((unsigned int)i*16+256,joke_3[(unsigned int)i*2]);
        written(joke_3[(unsigned int)i*2+1]);}  
       for(i=0;i<16;i++)
       {written_add_data((unsigned int)i*16+258,joke_4[(unsigned int)i*2]);
        written(joke_4[(unsigned int)i*2+1]);}          
       for(i=0;i<16;i++)
       {written_add_data((unsigned int)i*16+260,joke_5[(unsigned int)i*2]);
        written(joke_5[(unsigned int)i*2+1]);}          
} 

void main()
{

//delay_ms(500);

DDRB=0xff; 
PORTB=0x10;

DDRC=0xff;
PORTC=0x00;

DDRD|=0x0;
PORTD|=0xf8;

tone(1000);      //开机报警

//POWER_EN=1;      //stand moudle,all output to gnd level
PORTB.3    =0;      //OPEN POWER FOR IC
PORTB.4    =1;         //LCD's light open   
Lcd_inint();     //LCD ininteally

display_clear();
Display_joke(); 
delay_ms(500);  
display_clear(); 
HT1381_init(); 

/*
if((HT1381_read_byte(HT1381_sec_add))&0x10)  //判断是否已写入过时间值,依据CH位的值来确定
  {                                          //CH=0,振荡使能过。CH=1,振荡没有使能过。
    HT1381_write_byte(HT1381_control_add,0x00);		//关闭写保护 
                              //  HT1381_write_byte(HT1381_sec_add,0x80);		  //暂停 
    HT1381_write_byte(HT1381_sec_add,0x00);		//使能振荡
    HT1381_write_byte(HT1381_control_add,0x80);		//打开写保护                        
  }
else
{   
    HT1381_read_time();     //读时间值(只读不写)
  }   
*/
  
                          while(1)
 { 
   HT1381_read_time();    //读时间值
   time_display();        //时间值送显示 
   key_scan();            //键盘扫描
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -