📄 main.i
字号:
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 + -