|
/*******************DS1302功能区****************/
void DS1302_write_byte(uchar byte) //DS1302写入字节
{ uchar i;
for(i=0;i<8;i++)
{ DS1302_SCLK = 0;
DS1302_DATA=byte&0x01; //按位与
DS1302_SCLK = 1;
delay_us(2);
byte>>=1; //右移1位
}
}
void DS1302_write_data(uchar command,uchar DATA) //DS1302写入指令和数据
{ DS1302_REST = 0;
DS1302_SCLK = 0;
delay_us(2);
DS1302_REST = 1;
DS1302_write_byte(command);
DS1302_write_byte(DATA);
DS1302_REST = 0;
}
uchar DS1302_read(uchar command) //DS1302读数据
{ uchar i,dat;
DS1302_REST = 0;
DS1302_SCLK = 0;
delay_us(2);
DS1302_REST = 1;
DS1302_write_byte(command);
for(i=0;i<8;i++)
{ dat>>=1; //右移必需放在最前面,否则会在数据接收完成后多移一次
if(DS1302_DATA==1) dat|=0x80;
DS1302_SCLK = 0;
delay_us(2);
DS1302_SCLK = 1;
delay_us(2);
}
DS1302_REST = 0;
DS1302_SCLK = 1;
return dat;
}
void DS1302_read_second(void) //读回的数据转10进制
{ uchar temp;
temp=DS1302_read(0x81);
second=(temp/16*10)+(temp%16); //second 定义的全局变量
}
void LCD1602_time_display(void) //开启计时器后时间显示
{
LCD1602_write_word(13,1,shuzi[second/10]); //更新秒
LCD1602_write_word(14,1,shuzi[second%10]);
LCD1602_write_word(10,1,shuzi[minute/10]); //更新分钟
LCD1602_write_word(11,1,shuzi[minute%10]);
LCD1602_write_word(7,1,shuzi[hour/10]); //更新小时
LCD1602_write_word(8,1,shuzi[hour%10]);
}
void main(void)
{// DS1302_stop_work();
LCD1602_init();
delay_ms(5);
LCD1602_kaiji_display();
DS1302_read_second(); //读秒
while(1)
{
LCD1602_time_display(); //显示回读的时间
LCD1602_date_display();
Key_manual();
}
}
|
|