This commit is contained in:
2025-10-21 20:34:06 +08:00
commit c3f6375140
55 changed files with 34675 additions and 0 deletions

238
RTC.c Normal file
View File

@@ -0,0 +1,238 @@
#include "MAIN.H"
unsigned char bySta = 0;
void SDAOut(bit c)
{
SFR_PAGE(_pp0, noSST); // switch to page 0
P4_DIR = P4_DIR | 0x08;//<2F>޸<EFBFBD>P4.3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P4_3 = c;
}
void SCLOut(bit c)
{
P1_5 = c;
}
void iic_start(void)
{
SDAOut(1);
_nop_();
SCLOut(1);
somenop;
SDAOut(0);
somenop;
SCLOut(0);
}
void iic_stop(void)
{
SDAOut(0);
_nop_();
SCLOut(1);
somenop;
SDAOut(1);
}
void iic_ack(bit ackbit)
{
if(ackbit)
SDAOut(0);
else
SDAOut(1);
somenop;
SCLOut(1);
somenop;
SCLOut(0);
SDAOut(1);
somenop;
}
bit iic_waitack(void)
{
SDAOut(1);
somenop;
SCLOut(1);
SFR_PAGE(_pp0, noSST); // switch to page 0
P4_DIR = P4_DIR & 0xF7;//<2F>޸<EFBFBD>P4.3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
somenop;
if(P4_3)
{
SCLOut(0);
iic_stop();
return 0;
}
else
{
SCLOut(0);
return 1;
}
}
void iic_sendbyte(unsigned char byt)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(byt&0x80)
SDAOut(1);
else
SDAOut(0);
somenop;
SCLOut(1);
byt <<= 1;
somenop;
SCLOut(0);
}
}
unsigned char iic_recbyte(void)
{
unsigned char da;
unsigned char i;
SFR_PAGE(_pp0, noSST); // switch to page 0
P4_DIR = P4_DIR & 0xF7;//<2F>޸<EFBFBD>P4.3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(i=0;i<8;i++)
{
SCLOut(1);
somenop;
da <<= 1;
// P1_IOCR01 = 0x0020; // load port control register 1
if(P4_3)
da |= 0x01;
SCLOut(0);
somenop;
}
return da;
}
// ʮ<><CAAE><EFBFBD><EFBFBD>ת BCD <20><>
unsigned char DecToBcd(unsigned char dec)
{
return ((dec / 10) << 4) | (dec % 10);
}
// BCD <20><>תʮ<D7AA><CAAE><EFBFBD><EFBFBD>
unsigned char BcdToDec(unsigned char bcd)
{
return ((bcd >> 4) * 10) + (bcd & 0x0F);
}
// BM8563 д<>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void BM8563_WriteReg(unsigned char reg, unsigned char rdata)
{
iic_start();
iic_sendbyte(BM8563_ADDR); // <20><><EFBFBD><EFBFBD> BM8563 <20><> I2C <20><>ַ<EFBFBD><D6B7>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
iic_waitack();
iic_sendbyte(reg); // <20><><EFBFBD>ͼĴ<CDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
iic_waitack();
iic_sendbyte(rdata); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
iic_waitack();
iic_stop();
}
// BM8563 <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char BM8563_ReadReg(unsigned char reg)
{
unsigned char rdata;
iic_start();
iic_sendbyte(BM8563_ADDR); // <20><><EFBFBD><EFBFBD> BM8563 <20><> I2C <20><>ַ<EFBFBD><D6B7>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
iic_waitack();
iic_sendbyte(reg); // <20><><EFBFBD>ͼĴ<CDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
iic_waitack();
iic_start();
iic_sendbyte(BM8563_ADDR | 0x01); // <20><><EFBFBD><EFBFBD> BM8563 <20><> I2C <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
iic_waitack();
rdata = iic_recbyte();
iic_ack(0);
iic_stop();
return rdata;
}
// <20><>ʼ<EFBFBD><CABC> BM8563 <20><>ʱ<EFBFBD><CAB1>
void BM8563_InitTime()
{
BM8563_WriteReg(BM8563_SEC, 0x00); // <20><>
BM8563_WriteReg(BM8563_MIN, 0x00); // <20><>
BM8563_WriteReg(BM8563_HOUR, 0x00); // Сʱ
BM8563_WriteReg(BM8563_DAY, 0x01); // <20><>
BM8563_WriteReg(BM8563_WEEK, 0x01); // <20><>
BM8563_WriteReg(BM8563_MONTH, 0x01); // <20><>
BM8563_WriteReg(BM8563_YEAR, DecToBcd(0x25)); // <20><EFBFBD><EAA3AC><EFBFBD><EFBFBD>Ϊ 2025 <20><>
}
// <20><><EFBFBD><EFBFBD> BM8563 <20>Ķ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʵ<EFBFBD>ּ<EFBFBD><D6BC><EFBFBD> 4 Сʱ<D0A1>ĵ<EFBFBD><C4B5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
void BM8563_Set4HourCountdown()
{
// BM8563_WriteReg(BM8563_CONTROL, 0x01);
//
//
// bySta = BM8563_ReadReg(BM8563_CONTROL);
// 4 Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4 * 60 * 60 = 14400 <20><>
unsigned int fourHoursInSeconds = 5;
// ѡ<><D1A1>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>Ϊ 1/60 Hz
unsigned char timerControl = 0x02; // 11 for 1/60 Hz
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ֵ
unsigned char timerValue = fourHoursInSeconds * 10; // <20><>Ϊ 1/60 Hz <20><>ζ<EFBFBD><CEB6> 1 count per minute
// <20>Ƚ<EFBFBD><C8BD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ 0<><30>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1>
BM8563_WriteReg(BM8563_CONTROL, 0x00);
// д<>붨ʱ<EBB6A8><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
BM8563_WriteReg(BM8563_TIMER_VALUE, timerValue);
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܶ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ҷ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BM8563_WriteReg(BM8563_CONTROL, (timerControl | 0x80));
BM8563_WriteReg(BM8563_CSR2, 0x01);
}
// <20><><EFBFBD><EFBFBD> BM8563 <20><><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD>ʵ<EFBFBD>ּ<EFBFBD><D6BC><EFBFBD> 4 Сʱ<D0A1>Ļ<EFBFBD><C4BB><EFBFBD>
void BM8563_Set4HourAlarm()
{
unsigned char alarmMin = BcdToDec( BM8563_ReadReg(BM8563_MIN) );
unsigned char alarmMinBcd = 0;
//------------------------------------------------------------
alarmMin = (alarmMin + 2) % 60;//<2F><><EFBFBD><EFBFBD> 4 Сʱ<D0A1><CAB1><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1>
alarmMinBcd = DecToBcd(alarmMin);
BM8563_WriteReg(BM8563_ALARM_MIN,alarmMinBcd&0x7F);// <20><><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BM8563_WriteReg(BM8563_ALARM_HOUR, 0x80); // <20><>Ч
BM8563_WriteReg(BM8563_ALARM_DAY , 0x80); // <20><>Ч
BM8563_WriteReg(BM8563_ALARM_WEEK, 0x80); // <20><>Ч
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
BM8563_WriteReg(BM8563_CSR2, 0x02);
}