上传文件至 /

This commit is contained in:
2025-07-05 07:57:10 +08:00
parent eb88894078
commit 0c9ccb115e
5 changed files with 1152 additions and 0 deletions

415
RTC.c Normal file
View File

@@ -0,0 +1,415 @@
#include "MAIN.H"
#include <stdio.h>
#include "RTC.H"
unsigned char bySta = 0;
// <20><>̬<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD>1~12<31><32>Ӧ1<D3A6><31>~12<31>£<EFBFBD>
ubyte days_in_month[12] = {
31, // 1<><31>
28, // 2<>£<EFBFBD>ƽ<EFBFBD>
31, // 3<><33>
30, // 4<><34>
31, // 5<><35>
30, // 6<><36>
31, // 7<><37>
31, // 8<><38>
30, // 9<><39>
31, // 10<31><30>
30, // 11<31><31>
31 // 12<31><32>
};
void SDAOut(bit c)
{
SFR_PAGE(_pp0, noSST); // switch to page 0
P0_DIR = P0_DIR | 0x08;//<2F>޸<EFBFBD>P0.3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P0_3 = c;
}
void SCLOut(bit c)
{
P0_2 = 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
P0_DIR = P0_DIR & 0xF7;//<2F>޸<EFBFBD>P4.3Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
somenop;
if(P0_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
P0_DIR = P0_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(P0_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><D0B6><EFBFBD><EFBFBD><EFBFBD>
ubyte leapYear(uword year) {
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}
/**
* @brief <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA>·ݵ<C2B7><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param year: <20><><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2024<32><34>
* @param month: <20>·ݣ<C2B7>1-12<31><32>
* @retval <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>
*/
ubyte getMonthDays(uword year, ubyte month) {
// <20><>̬<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD>1~12<31><32>Ӧ1<D3A6><31>~12<31>£<EFBFBD>
ubyte days_in_month[13] = {
0, 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31
};
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
if (month < 1 || month > 12) return 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32>
if (month == 2 && leapYear(year)) {
return 29;
}
// <20><><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return days_in_month[month];
}
/**
* @brief <20><><EFBFBD><EFBFBD><E9B1A8><EFBFBD><EFBFBD>־AF<41>Ƿ<EFBFBD><C7B7><EFBFBD>λ<EFBFBD><CEBB>Bit3<74><33>
* @retval true-<2D><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD><D1B4><EFBFBD><EFBFBD><EFBFBD>false-<2D>ޱ<EFBFBD><DEB1><EFBFBD>
*/
bool bm8563CheckAlarmFlag(void) {
ubyte reg_val = BM8563_ReadReg(BM8563_CSR2);
return (reg_val & BM8563_AF_BIT) != 0; // <20><><EFBFBD><EFBFBD>Bit3
}
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־AF<41><46>Bit3<74><33>
* @note <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Bit1 AIE<49><45>־<EFBFBD><D6BE>״̬
*/
void bm8563ClearAlarmFlag(void) {
ubyte reg_val = BM8563_ReadReg(BM8563_CSR2);
reg_val &= ~BM8563_AF_BIT; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit3
BM8563_WriteReg(BM8563_CSR2, reg_val);
}
/**
* @brief <20><><EFBFBD><EFBFBD>BM8563<36><33>ǰʱ<C7B0><EFBFBD><E4A3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>·ݼĴ<DDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>
* @param pTime: ʱ<><CAB1><EFBFBD><EFBFBD><E1B9B9>ָ<EFBFBD><EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1984<38><34>2024<32><34>
* @retval <20><>
*/
void bm8563SetTime(UnTimeOutput *pTime) {
ubyte century_bit = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ubyte reg_sec = 0;
ubyte month_bcd = 0;
if (pTime == NULL) return;
// --- <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ---
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>־<EFBFBD><D6BE>0:20<32><30><EFBFBD>ͼ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>1:19<31><39><EFBFBD>ͣ<EFBFBD>
// uint8_t century_bit = (pTime->bit_data.year >= 2000) ? 0 : 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// --- <20>Ĵ<EFBFBD><C4B4><EFBFBD>д<EFBFBD><EFBFBD><EBA3A8><EFBFBD><EFBFBD><EFBFBD>룩---
// <20><EFBFBD><EBA3A8>ַ0x02<30><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit7<74><37>CHʱ<48><CAB1>ֹͣλ<D6B9><CEBB>
reg_sec = BM8563_ReadReg(BM8563_SEC) & 0x80;
BM8563_WriteReg(BM8563_SEC, reg_sec | (DecToBcd(pTime->bit_data.second) & 0x7F));
// <20>֣<EFBFBD><D6A3><EFBFBD>ַ0x03<30><33>
BM8563_WriteReg(BM8563_MIN, DecToBcd(pTime->bit_data.minute) & 0x7F);
// Сʱ<D0A1><CAB1><EFBFBD><EFBFBD>ַ0x04<30><34><EFBFBD><EFBFBD>24Сʱ<D0A1><CAB1>
BM8563_WriteReg(BM8563_HOUR, DecToBcd(pTime->bit_data.hour) & 0x3F);
// <20>գ<EFBFBD><D5A3><EFBFBD>ַ0x05<30><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>λ
BM8563_WriteReg(BM8563_DAY, DecToBcd(pTime->bit_data.day) & 0x3F);
// <20>ܣ<EFBFBD><DCA3><EFBFBD>ַ0x06<30><36><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Χ1-7
BM8563_WriteReg(BM8563_WEEK, pTime->bit_data.week & 0x07);
// <20>£<EFBFBD><C2A3><EFBFBD>ַ0x07<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λд<CEBB><D0B4>Bit7<74><37><EFBFBD>·<EFBFBD>ռ<EFBFBD><D5BC>
month_bcd = DecToBcd(pTime->bit_data.month);
BM8563_WriteReg(BM8563_MONTH, (century_bit << 7) | (month_bcd & 0x1F));
// <20><EFBFBD><EAA3A8>ַ0x08<30><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>2024<32><34>0x24<32><34>
BM8563_WriteReg(BM8563_YEAR, DecToBcd(pTime->bit_data.year));
}
/**
* @brief <20><>ȡBM8563<36><33>ǰʱ<C7B0><EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pTime: UnTimeOutput<75><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3A8><EFBFBD>ڴ洢<DAB4><E6B4A2>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
* @retval <20><>
*/
void bm8563GetTime(UnTimeOutput *pTime) {
if (pTime == NULL) {
return; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ
}
// <20><>ȡ<EFBFBD><EFBFBD><EBA3A8>ַ0x02<30><32>
pTime->bit_data.second = BcdToDec(BM8563_ReadReg(BM8563_SEC) & 0x7F); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чλ
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ӣ<EFBFBD><D3A3><EFBFBD>ַ0x03<30><33>
pTime->bit_data.minute = BcdToDec(BM8563_ReadReg(BM8563_MIN) & 0x7F);
// <20><>ȡСʱ<D0A1><CAB1><EFBFBD><EFBFBD>ַ0x04<30><34>
pTime->bit_data.hour = BcdToDec(BM8563_ReadReg(BM8563_HOUR) & 0x3F); // 24Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bit6-7
// <20><>ȡ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD>ַ0x05<30><35>
pTime->bit_data.day = BcdToDec(BM8563_ReadReg(BM8563_DAY) & 0x3F); // <20><><EFBFBD>ο<EFBFBD><CEBF><EFBFBD>λ
// <20><>ȡ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ַ0x06<30><36>BM8563<36><33>ֵΪ0x01-0x07<30><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BCDת<44><D7AA><EFBFBD><EFBFBD>
pTime->bit_data.week = BM8563_ReadReg(BM8563_WEEK) & 0x07; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD>£<EFBFBD><C2A3><EFBFBD>ַ0x07<30><37>
pTime->bit_data.month = BcdToDec(BM8563_ReadReg(BM8563_MONTH) & 0x1F); // <20><><EFBFBD><EFBFBD>Bit5-7
// <20><>ȡ<EFBFBD><EFBFBD><EAA3A8>ַ0x08<30><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ2000+<2B>
pTime->bit_data.year = BcdToDec(BM8563_ReadReg(BM8563_YEAR));
}
/**
* @brief <20><><EFBFBD><EFBFBD>BM8563<36><33><EFBFBD>ӣ<EFBFBD><D3A3>ֶ<EFBFBD>Ϊ0ʱ<30><CAB1><EFBFBD>ö<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param pTime: UnTimeOutput<75><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @retval <20><>
*/
ubyte bm8563SetAlarm(UnTimeOutput *pTime) {
UnTimeOutput un_temp_output = {0};//<2F><><EFBFBD><EFBFBD><EFBFBD>趨ʱ<E8B6A8><CAB1>
ubyte carry_hour = 0;
ubyte carry_day = 0;
ubyte month_days = 0;
//-------------------------------------------------
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
if( (pTime == NULL) || ( (0 == pTime->bit_data.minute) && (0 == pTime->bit_data.hour) && (0 == pTime->bit_data.day) ) )//<2F><><EFBFBD>ݶ<EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ָ<EFBFBD>붼Ϊ0
{
// <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 1;
}
bm8563GetTime(&currenttime);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-59<35><39>
un_temp_output.bit_data.minute = currenttime.bit_data.minute + pTime->bit_data.minute;
if (un_temp_output.bit_data.minute >= 60) {
un_temp_output.bit_data.minute -= 60;
carry_hour = 1; // <20><>Сʱ<D0A1><CAB1>λ
}
// Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-23<32><33>
un_temp_output.bit_data.hour = currenttime.bit_data.hour + pTime->bit_data.hour + carry_hour;
if (un_temp_output.bit_data.hour >= 24) {
un_temp_output.bit_data.hour -= 24;
carry_day = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8BFBC><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
un_temp_output.bit_data.day = currenttime.bit_data.day + pTime->bit_data.day + carry_day;
//2<>¿<EFBFBD><C2BF><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
month_days = getMonthDays( (currenttime.bit_data.year+2000),currenttime.bit_data.month);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8BFBC><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (un_temp_output.bit_data.day > month_days)
{
un_temp_output.bit_data.day -= month_days;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>£<EFBFBD><C2A3><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>죬BM8563<36><33><EFBFBD><EFBFBD>ֻ֧<D6BB><D6A7><EFBFBD><EFBFBD>ô<EFBFBD><C3B4>
if(un_temp_output.bit_data.day == currenttime.bit_data.day)
{
un_temp_output.bit_data.day = (currenttime.bit_data.day - 1);
}
}
un_temp_output.bit_data.week = 0;//<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ַ0x09<30><39>
BM8563_WriteReg(BM8563_ALARM_MIN, DecToBcd(un_temp_output.bit_data.minute) & 0x7F); // AE_M=0<><30><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
// <20><><EFBFBD><EFBFBD>Сʱ<D0A1><CAB1><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ַ0x0A<30><41>
BM8563_WriteReg(BM8563_ALARM_HOUR, DecToBcd(un_temp_output.bit_data.hour) & 0x7F); // AE_H=0<><30><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>
// <20>ձ<EFBFBD><D5B1><EFBFBD>/<2F>ܱ<EFBFBD><DCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BM8563_WriteReg(BM8563_ALARM_DAY, DecToBcd(un_temp_output.bit_data.day) & 0x7F); // AE_D=0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD>
BM8563_WriteReg(BM8563_ALARM_WEEK, 0x80); // AE_W=1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD>
// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>ַ0x01<30><31>AIE=1<><31>AF=0<><30>
BM8563_WriteReg(BM8563_CSR2, 0x02);
return 0;
}
//// <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);
//}