250K-T8S
This commit is contained in:
238
RTC.c
Normal file
238
RTC.c
Normal 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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user