大家好:DS12C887时钟芯片,设置成12小时制,上午 和下午,怎么设置和读取。
有缘 刚好我也要实现这个功能!以下是我给的思路和方法:
第一步:设置12小时制
将DS12C887的寄存器B的第1位(即Bit 1)设置为1,即可将时钟芯片设置为12小时制。
// 设置为12小时制
void set12HourFormat() {
byte value = readRegister(REG_B);
writeRegister(REG_B, value | 0x02);
}
其中,readRegister和writeRegister函数用于读写DS12C887的寄存器,具体实现可以参考你的DS12C887的数据手册。
第二步:设置上午和下午
在12小时制下,DS12C887会自动识别上午和下午。如果要设置时钟芯片的时间,只需将小时的值设置为1到12之间的整数即可。例如,如果要将时间设置为下午2点,只需将小时的值设置为14即可。
第三步:读取时间
在12小时制下,DS12C887的小时值范围为1到12。如果小时值大于12,则表示当前时间是下午,并且小时值需要减去12才是实际的小时值。
void readTime() {
byte second = readRegister(REG_SEC);
byte minute = readRegister(REG_MIN);
byte hour = readRegister(REG_HOUR);
byte ampm = hour & 0x80;
hour &= 0x7F;
if (hour == 0) {
hour = 12;
}
if (ampm) {
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.print(second);
Serial.println(" PM");
} else {
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.print(second);
Serial.println(" AM");
}
}
void readTime() {
byte second = readRegister(REG_SEC);
byte minute = readRegister(REG_MIN);
byte hour = readRegister(REG_HOUR);
byte ampm = hour & 0x80;
hour &= 0x7F;
if (hour == 0) {
hour = 12;
}
if (ampm) {
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.print(second);
Serial.println(" PM");
} else {
Serial.print(hour);
Serial.print(":");
Serial.print(minute);
Serial.print(":");
Serial.print(second);
Serial.println(" AM");
}
}
其中,ampm变量用于保存小时值的最高位,如果最高位为1,则表示当前时间是下午;否则表示当前时间是上午。hour &= 0x7F用于将最高位清零,获取实际的小时值。最后,根据小时值和ampm变量的值,可以打印出当前的时间。
其实直接设置成24小时制,显示的时候转换成12小时制也很简单的的吧,小学生都知道怎么算
不知道你这个问题是否已经解决, 如果还没有解决的话:DS1302.c
:该函数主要实现把数据写入DS1302中从而实现时间初始化和时间写入,以及从时钟芯片中读取时间。Timer0Init.c
:实现定时器T0的初始化,此处定时器用于调整时间时,调整位闪烁。Key.c
:扫描按键,在主函数中体现在:当按键K1按下时,时钟暂停,此时接着按键K2按下进入时钟调节函数(同时LCD1602屏幕上“年”开始以1s为周期闪烁),调节完成后再按下按键K1,则时钟继续运行。当时钟运行时按下按键K1没有反应,想要调整时钟则必须先暂停。(此处时钟暂停并不是真正的暂停,只是显示在LCD1602显示屏上是静止状态,但其实只是没有读取DS1302芯片的寄存器而已)Clock_Adjust.c
:时钟调整函数,当进入时钟调整函数后再次按下按键K2,则LCD1602显示屏上从“年”闪烁变为“月”闪烁,再次按下按键K2,“月”闪烁变为“日”闪烁,以此类推,往复。在次函数中若按下按键K1,则break
跳出此函数,时钟继续运行。在此函数中若按下按键K3,则所闪烁位数值加一,若按下按键K4,则所闪烁位数值减一。从而实现时钟调节功能。LCD1602
:显示函数,将从DS1302芯片中读取到的时间显示在屏幕上。main
:主函数,通过调用上面函数模块以及相应逻辑,从而实现时钟显示以及可调性。