|
/*******************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();
}
}
|
|