51——DS1302
1. DS1302介绍
ds1302是具有涓细电流充电能力的低功耗实时时钟芯片.
外接32.768khz石英晶振。
引脚定义:
命令字:
寄存器地址:
2. DS1302初始化
3. 指定寄存器写入一个字节
4. 读取一个寄存器的一个字节
5. 实时时钟时间写入与读取
main.c
#include <regx52.h>
#include "lcd1602.h"
#include "ds1302.h"
#include "key.h"
#include "timer0.h"
u8 key_value = 0;
u8 mode = 0;
u8 time_set_select = 0;
u8 TimeSetFlashFlag = 0;
void time_show(void)
{
ds1302_readtime();
//BCD码转十进制
LCD_ShowNum(1, 1, set_time->year, 2);
LCD_ShowNum(1, 4, set_time->month, 2);
LCD_ShowNum(1, 7, set_time->date, 2);
LCD_ShowNum(2, 1, set_time->hour, 2);
LCD_ShowNum(2, 4, set_time->minute, 2);
LCD_ShowNum(2, 7, set_time->second, 2);
LCD_ShowNum(1, 10, set_time->day, 2);
}
void time_set(void)
{
//选择设置某个时间
if (key_value == button_select_time)
{
time_set_select ++;
time_set_select %= 7;
}
//时间加1
if (key_value == button_time_add)
{
switch (time_set_select)
{
case 0: set_time->year ++; break;
case 1: set_time->month ++; break;
case 2: set_time->date ++; break;
case 3: set_time->hour ++; break;
case 4: set_time->minute ++; break;
case 5: set_time->second ++; break;
case 6: set_time->day ++; break;
}
if (set_time->year > 99) {set_time->year = 0;}
if (set_time->month > 12) {set_time->month = 1;}
if (set_time->month == 1 || set_time->month == 3 || set_time->month == 5
|| set_time->month == 7 || set_time->month == 8 || set_time->month == 10
|| set_time->month == 12)
{
if (set_time->date > 31) {set_time->date = 1;}
}
else if (set_time->month == 4 || set_time->month == 6 || set_time->month == 9
|| set_time->month == 11)
{
if (set_time->date > 30) {set_time->date = 1;}
}
else if (set_time->month == 2)
{
//闰年
if (set_time->year % 4 == 0) {if (set_time->date > 29) {set_time->date = 1;}}
//平年
else {if (set_time->date > 28) {set_time->date = 1;}}
}
if (set_time->hour > 23) {set_time->hour = 0;}
if (set_time->minute > 59) {set_time->minute = 0;}
if (set_time->second > 59) {set_time->second = 0;}
if (set_time->day > 7) {set_time->day = 0;}
}
//时间减1
if (key_value == button_time_sub)
{
switch (time_set_select)
{
case 0: set_time->year --; break;
case 1: set_time->month --; break;
case 2: set_time->date --; break;
case 3: set_time->hour --; break;
case 4: set_time->minute --; break;
case 5: set_time->second --; break;
case 6: set_time->day --; break;
}
if (set_time->year < 0) {set_time->year = 99;}
if (set_time->month < 1) {set_time->month = 12;}
if (set_time->month == 1 || set_time->month == 3 || set_time->month == 5
|| set_time->month == 7 || set_time->month == 8 || set_time->month == 10
|| set_time->month == 12)
{
if (set_time->date < 1) {set_time->date = 31;}
if (set_time->date > 31) {set_time->date = 1;}
}
else if (set_time->month == 4 || set_time->month == 6 || set_time->month == 9
|| set_time->month == 11)
{
if (set_time->date < 1) {set_time->date = 30;}
if (set_time->date > 30) {set_time->date = 1;}
}
else if (set_time->month == 2)
{
//闰年
if (set_time->year % 4 == 0) {if (set_time->date < 1) {set_time->date = 29;}
if (set_time->date > 29) {set_time->date = 1;}}
//平年
else {if (set_time->date < 1) {set_time->date = 28;}
if (set_time->date > 28) {set_time->date = 1;}}
}
if (set_time->hour < 0) {set_time->hour = 23;}
if (set_time->minute < 0) {set_time->minute = 59;}
if (set_time->second < 0) {set_time->second = 59;}
if (set_time->day < 0) {set_time->day = 7;}
}
if (time_set_select == 0 && TimeSetFlashFlag == 1) {LCD_ShowString(1, 1, " ");}
else {LCD_ShowNum(1, 1, set_time->year, 2);}
if (time_set_select == 1 && TimeSetFlashFlag == 1) {LCD_ShowString(1, 4, " ");}
else {LCD_ShowNum(1, 4, set_time->month, 2);}
if (time_set_select == 2 && TimeSetFlashFlag == 1) {LCD_ShowString(1, 7, " ");}
else {LCD_ShowNum(1, 7, set_time->date, 2);}
if (time_set_select == 3 && TimeSetFlashFlag == 1) {LCD_ShowString(2, 1, " ");}
else {LCD_ShowNum(2, 1, set_time->hour, 2);}
if (time_set_select == 4 && TimeSetFlashFlag == 1) {LCD_ShowString(2, 4, " ");}
else {LCD_ShowNum(2, 4, set_time->minute, 2);}
if (time_set_select == 5 && TimeSetFlashFlag == 1) {LCD_ShowString(2, 7, " ");}
else {LCD_ShowNum(2, 7, set_time->second, 2);}
if (time_set_select == 6 && TimeSetFlashFlag == 1) {LCD_ShowString(1, 10, " ");}
else {LCD_ShowNum(1, 10, set_time->day, 2);}
}
void main(void)
{
LCD_Init();
ds1302_init();
time_init();
timer0_init();
ds1302_settime(set_time);
LCD_ShowString(1, 1, " - -");
LCD_ShowString(2, 1, " : :");
while (1)
{
key_value = key_scan();
switch (mode)
{
case 0: time_show();break;
case 1: time_set();break;
}
//选择模式->显示时间/设置时间
if (key_value == button_select_mode)
{
if (mode == 0) {mode = 1;}
else if (mode == 1) {mode = 0;ds1302_settime(set_time);}
}
}
}
void timer0_routine(void) interrupt 1
{
static u16 count = 0;
TH0 = 0xFC;
TL0 = 0x66;
count ++;
if (count >= 500)
{
count = 0;
TimeSetFlashFlag =! TimeSetFlashFlag;
}
}