Files
stc32g128k/App/system.c

510 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "system.h"
#include "rgb.h"
#include "ui.h"
#include "clock.h"
#include "../Drivers/lcd.h"
#include "../Drivers/rf.h"
#include "../Drivers/adc.h"
#include "../Drivers/pcf8563.h"
#include "intrins.h"
// 撘閧鍂 main.c 銝<><E98A9D><EFBFBD><EFBFBD><EFBFBD>銝舘<E98A9D>銵𣬚𠶖<F0A3AC9A><F0A0B696><EFBFBD><EFBFBD>
extern volatile u8 p0_wakeup_flag;
extern volatile u8 p2_wakeup_flag;
extern volatile u8 p3_wakeup_flag;
extern volatile u8 rf_wakeup_flag;
/**
* @brief 蝟餌<E89D9F> GPIO 蝡<><E89DA1>芋撘誩<E69298>憪见<E686AA>
* @details <20>滨蔭<E6BBA8><E894AD><EFBFBD><EFBFBD>𡁶<EFBFBD><F0A181B6>冽蕟颲枏枂<E69E8F><E69E82><EFBFBD><EFBFBD><EFBFBD><E9A489><EFBFBD><E4BA99><EFBFBD><EFBFBD><EFBFBD>烐芋撘𧶏<E69298>撱箇<E692B1>蝟餌<E89D9F><E9A48C>嘥讠㩞瘞𠉛㴓憓<E3B493>
*/
void GPIO_Init(void)
{
// 雿輯<E99BBF>霈輸䔮<E8BCB8><EFBFBD><E68B99><EFBFBD><E5AF9E><EFBFBD><EFBFBD><E69296><EFBFBD> XSFR
EAXFR = 1;
// 1. <20>滨蔭 PWR_HOLD (P0.0) 銝箸綫<E7AEB8><EFBFBD><E8B3AA>箸芋撘 (P0M1 bit0=0, P0M0 bit0=1)
P0M1 &= ~(1 << 0);
P0M0 |= (1 << 0);
PWR_HOLD = 1; // 銝羓㩞蝚銝<E89D9A>園𡢿<E59C92><EFBFBD>嚗屸<E59A97>摮条㩞皞𣂷<E79A9E><F0A382B7><EFBFBD><EFBFBD><EFBFBD>
// 2. <20>滨蔭 KEY_UP (P0.1), KEY_CONFIRM (P0.2) 銝粹<E98A9D><E7B2B9><EFBFBD><E9A489>/撣虫<E692A3><E899AB><EFBFBD><E58CA7><EFBFBD><EFBFBD>
P0M1 &= ~((1 << 1) | (1 << 2));
P0M0 &= ~((1 << 1) | (1 << 2));
KEY_UP = 1;
KEY_CONFIRM = 1;
// 3. <20>嘥见<E598A5> STC32G 蝖隞 ADC 璅<E79285> (<28>嗡葉<E597A1><E89189><EFBFBD>蝵 P0.3 <20> P1.3 銝粹<E98A9D><E7B2B9><EFBFBD><E9A489>交芋撘)
ADC_Init();
// 4. <20>滨蔭 PCF8563 I2C 蝞∟<E89D9E> P3.2 (SCL) 銝 P3.3 (SDA) 銝箏<E98A9D><E7AE8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>芋撘𧶏<E69298>撟嗅<E6929F>銝𦠜<E98A9D>
P3M1 &= ~((1 << 2) | (1 << 3));
P3M0 &= ~((1 << 2) | (1 << 3));
P3PU |= (1 << 2) | (1 << 3); // 撘<> P3.2 銝 P3.3 <20><><EFBFBD><EFBFBD> 4.7K 銝𦠜<E98A9D><F0A6A09C>菟獈
RTC_SCL = 1;
RTC_SDA = 1;
// 5. <20>滨蔭<E6BBA8>冽蕟颲枏枂撘閗<E69298>:
// MOTOR (P2.5), RGB_DIN (P2.3) -> P2M1 bit5,3=0; P2M0 bit5,3=1
P2M1 &= ~((1 << 5) | (1 << 3));
P2M0 |= ((1 << 5) | (1 << 3));
MOTOR = 0;
RGB_DIN = 0; // P2.3 <20>嘥𧢲<E598A5>雿𠬍<E99BBF><F0A0AC8D>脫銝羓㩞<E7BE93>罸𡢿 WS2812B 霂閫血<E996AB>
// <20>滨蔭 KEY_SOS (P2.6) 銝箏蒂銝𦠜<E98A9D><F0A6A09C><EFBFBD><EFBFBD><EFBFBD>穃藁璅<E79285>隞亦靽肽<E99DBD><E882BD>亦迅摰
P2M1 &= ~(1 << 6);
P2M0 &= ~(1 << 6);
KEY_SOS = 1;
(*(unsigned char volatile xdata *)0xFE12) |= (1 << 6); // 雿輯<E99BBF> P2.6 <20><><EFBFBD><E692A9><EFBFBD>銝𦠜<E98A9D><F0A6A09C>菟獈 (P2PU = 0xFE12)
// SGM_CTRL (P1.7), LCD <20><EFBFBD>蝞∟<E89D9E> (P1.0, P1.1, P1.4, P1.5, P1.6) 蝵銝箸綫<E7AEB8><EFBFBD><E8B3AA>
P1M1 &= ~((1 << 7) | (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 6));
P1M0 |= ((1 << 7) | (1 << 0) | (1 << 1) | (1 << 4) | (1 << 5) | (1 << 6));
// SHUT (P3.5) 撠<>/憭𤥁曉<F0A4A581><E69B89>雿輯<E99BBF><E8BCAF>𡁶蔭銝箸綫<E7AEB8><EFBFBD><E8B3AA>
P3M1 &= ~(1 << 5);
P3M0 |= (1 << 5);
SHUT = 0; // 雿𡒊㩞撟喳<E6929F><E596B3>撌乩<E6928C>
// 7. <20>滨蔭 CHRG_DET (P1.2) 銝粹<E98A9D><E7B2B9><EFBFBD><E9A489>交芋撘𧶏<E69298><F0A7B68F><EFBFBD><EFBFBD> DET 璅⊥<E79285> ADC <20>𡁻<EFBFBD> 2
// <20><EFBFBD><E69BB9>蝎曉<E89D8E>璅⊥<E79285><E28AA5>萄像璉瘚页<E7989A><E9A1B5><EFBFBD>嚉撘<E59A89>撘閗<E69298><E99697><EFBFBD><EFBFBD>銝𦠜<E98A9D><F0A6A09C>菟獈
P1M1 |= (1 << 2);
P1M0 &= ~(1 << 2);
// P1PU <20><EFBFBD>撅 XSFR 蝛粹𡢿銝瘝⊥<E7989D>鋡摰帋<E691B0><E5B88B><EFBFBD><EFBFBD><EFBFBD>隞亦鍂 P1 蝡<><E89DA1><EFBFBD>摮睃膥<E79D83>𤥁<EFBFBD><EFBFBD>喲𡡒銝𦠜<E98A9D>
// STC32G 銝蝡<E98A9D><E89DA1><EFBFBD><EFBFBD><EFBFBD>摮睃膥<E79D83> P1PU (FE11H)嚗<><E59A97>銝箸糓 XSFR <20>睲賑<E79DB2> config.h <20><EFBFBD> extern <20>𣇉凒<F0A38789><EFBFBD>
// <20><EFBFBD> XSFR P1PU <20><EFBFBD>銝 0xFE11
(*(unsigned char volatile xdata *)0xFE11) &= ~(1 << 2);
}
/**
* @brief <20>嘥见<E598A5> UART1 銝脣藁<E884A3>帋縑
* @details 霈曉<E99C88><EFBCB9> 115200 (雿輻鍂 Timer2 雿靝蛹<E99D9D>𤑳<EFBFBD><F0A491B3>嚗24.0MHz <20>嗆𥲤)
*/
void Uart1_Init(void)
{
SCON = 0x50; // 8 雿齿㺭<E9BDBF>, <20><>䀹郭<E480B9><EFBFBD>
AUXR |= 0x01; // 銝脣藁 1 <20>㗇𥋘 Timer2 <20>𡁏郭<F0A1818F><EFBFBD><E5AFA7>𤑳<EFBFBD><F0A491B3>
AUXR |= 0x04; // Timer2 <20><EFBFBD>銝 1T 璅<E79285>
T2L = 0xCC; // 24MHz / 115200 = 208 (0xD0), 撖孵<E69296> reload <20> 65536 - 52 = 0xFFCC
T2H = 0xFF;
AUXR |= 0x10; // <20><> Timer2 餈鞱
}
/**
* @brief 銝脣藁 1 <20><EFBFBD><E785BE>摮𡑒<E691AE><F0A19192>唳旿
* @param dat 敺<><E695BA><EFBFBD><EFBFBD><EFBFBD>摮𡑒<E691AE>
*/
void Uart_SendByte(u8 dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}
/**
* @brief 銝脣藁 1 <20><EFBFBD><E785BE>蝚虫葡
* @param s 摮㛖虫葡<E899AB><E891A1><EFBFBD>
*/
void Uart_SendString(char *s)
{
while (*s) {
Uart_SendByte(*s++);
}
}
/**
* @brief 銝脣藁 1 <20>鮋獈憛墧𦻖<E5A2A7><EFBFBD>
* @return char <20>交𤣰<E4BAA4><EFBFBD>摮㛖佗<E39B96><E4BD97><EFBFBD><E4BAA4>交𤣰<E4BAA4>唳旿<E594B3><EFBFBD><E8BAB0> '\0'
*/
char Uart_RxChar(void)
{
if (RI) {
RI = 0;
return SBUF;
}
return '\0';
}
/**
* @brief <20>餃墧蝘鍦辣<E98DA6>
* @param ms 瘥蝘埝㺭
*/
void Delay_ms(u16 ms)
{
u16 i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 2000; j++) {
_nop_();
}
}
}
/**
* @brief <20>餃𧼮凝蝘鍦辣<E98DA6>
* @param us 敺蝘埝㺭
*/
void Delay_us(u16 us)
{
u16 i;
for (i = 0; i < us; i++) {
_nop_(); _nop_(); _nop_(); _nop_();
}
}
/**
* @brief 蝟餌<E89D9F><EFBFBD><EFBFBD><E7AE94>隞嗉䌊璉<E48C8A>賣㺭
* @details 璉瘚 PWR_HOLD <20><><EFBFBD><EFBFBD><EFBFBD><E59786>DC <20><><EFBFBD><EFBFBD>銝𦒘葡<F0A69298><E891A1>朞嚗諹<E59A97><E8ABB9><EFBFBD><E7AE8F>渲䌊璉 report
*/
void Self_Test(void)
{
u16 key_down_adc;
u16 vbat_mv;
u16 batt_adc_raw;
u8 percent;
Uart_SendString("\r\n========================================\r\n");
Uart_SendString("[SELF-TEST] System Power-On Self Test...\r\n");
// <20>扯 I2C <20>餌瑪<E9A48C>其辣<E585B6><E8BEA3>𧶏<EFBFBD><F0A7B68F>交𪄳 RTC <20><><EFBFBD><E8A1A3><EFBFBD><EFBFBD>
PCF8563_ScanDiagnostic();
// 0. I2C 蝖隞嗉<E99A9E><E59789>萄像霂𦠜鱏瘚贝<E7989A> (撉諹<E69289>撘閗<E69298><E99697><EFBFBD>扳找<E689B3><E689BE>頝)
Uart_SendString("[I2C-DIAG] Pin Level Test Starting...\r\n");
// <20> 1 瘚贝<E7989A> (<28><><EFBFBD><EFBFBD>+銝𦠜<E98A9D>)
P3M1 &= ~((1 << 2) | (1 << 3));
P3M0 &= ~((1 << 2) | (1 << 3));
P3PU |= (1 << 2) | (1 << 3);
RTC_SCL = 1;
RTC_SDA = 1;
Delay_ms(10);
Uart_SendString("[I2C-DIAG] Write SCL=1, SDA=1 -> Real Level: SCL=");
Uart_SendByte((u8)(RTC_SCL ? '1' : '0'));
Uart_SendString(", SDA=");
Uart_SendByte((u8)(RTC_SDA ? '1' : '0'));
Uart_SendString("\r\n");
// <20> 0 瘚贝<E7989A>
RTC_SCL = 0;
RTC_SDA = 0;
Delay_ms(10);
Uart_SendString("[I2C-DIAG] Write SCL=0, SDA=0 -> Real Level: SCL=");
Uart_SendByte((u8)(RTC_SCL ? '1' : '0'));
Uart_SendString(", SDA=");
Uart_SendByte((u8)(RTC_SDA ? '1' : '0'));
Uart_SendString("\r\n");
// 0.2 <20>扯 RTC 摨訫<E691A8><E8A8AB>閧𡠺霂閗餅<E99697>
PCF8563_TryReadDiagnostic();
// 1. 撉諹<E69289> PWR_HOLD <20><><EFBFBD><EFBFBD>
if (PWR_HOLD == 1) {
Uart_SendString("[SELF-TEST] PWR_HOLD Pin State: HIGH [OK]\r\n");
} else {
Uart_SendString("[SELF-TEST] PWR_HOLD Pin State: LOW [FAIL]\r\n");
}
// 2. 璉<> P0.3 ADC <20>厰睸<E58EB0><EFBFBD>撣豢<E692A3><EFBFBD>
key_down_adc = ADC_ReadFiltered(ADC_CHANNEL_KEY_DOWN);
Uart_SendString("[SELF-TEST] KEY_DOWN (P0.3) ADC Raw Value: ");
Uart_SendByte((u8)('0' + (key_down_adc / 1000) % 10));
Uart_SendByte((u8)('0' + (key_down_adc / 100) % 10));
Uart_SendByte((u8)('0' + (key_down_adc / 10) % 10));
Uart_SendByte((u8)('0' + (key_down_adc % 10)));
Uart_SendString(" [OK]\r\n");
// 2.2 璉瘚 KEY_SOS (P2.6) <20><EFBFBD><E68B8D>萄像撣豢
Uart_SendString("[SELF-TEST] KEY_SOS (P2.6) Pin Level: ");
Uart_SendByte((u8)(KEY_SOS ? '1' : '0'));
Uart_SendString("\r\n");
// 3. 璉<> P1.3 <20><EFBFBD><E88F9C><EFBFBD>璉瘚衤<E7989A><E8A1A4><EFBFBD>
vbat_mv = ADC_GetBatteryVoltage_mV();
percent = ADC_GetBatteryPercent();
batt_adc_raw = ADC_ReadFiltered(ADC_CHANNEL_BATTERY);
Uart_SendString("[SELF-TEST] Battery Raw ADC: ");
Uart_SendByte((u8)('0' + (batt_adc_raw / 1000) % 10));
Uart_SendByte((u8)('0' + (batt_adc_raw / 100) % 10));
Uart_SendByte((u8)('0' + (batt_adc_raw / 10) % 10));
Uart_SendByte((u8)('0' + (batt_adc_raw % 10)));
Uart_SendString(" -> Voltage: ");
Uart_SendByte((u8)('0' + (vbat_mv / 1000) % 10));
Uart_SendByte('.');
Uart_SendByte((u8)('0' + (vbat_mv / 100) % 10));
Uart_SendByte((u8)('0' + (vbat_mv / 10) % 10));
Uart_SendString(" V, Capacity: ");
Uart_SendByte((u8)('0' + (percent / 100) % 10));
Uart_SendByte((u8)('0' + (percent / 10) % 10));
Uart_SendByte((u8)('0' + (percent % 10)));
Uart_SendString("% [OK]\r\n");
// 4. 璉<><EFBFBD><E4BA99>萇𠶖<E89087>
{
u16 det_adc = ADC_ReadFiltered(ADC_CHANNEL_CHRG_DET);
u16 det_mv = (det_adc * 3300UL) / 4095UL;
Uart_SendString("[SELF-TEST] CHRG_DET (P1.2) ADC: ");
Uart_SendByte((u8)('0' + (det_adc / 1000) % 10));
Uart_SendByte((u8)('0' + (det_adc / 100) % 10));
Uart_SendByte((u8)('0' + (det_adc / 10) % 10));
Uart_SendByte((u8)('0' + (det_adc % 10)));
Uart_SendString(" -> Voltage: ");
Uart_SendByte((u8)('0' + (det_mv / 1000) % 10));
Uart_SendByte('.');
Uart_SendByte((u8)('0' + (det_mv / 100) % 10));
Uart_SendByte((u8)('0' + (det_mv / 10) % 10));
Uart_SendString(" V -> ");
if (det_mv >= 800 && det_mv <= 1800) {
Uart_SendString("CHARGING [OK]\r\n");
} else if (det_mv >= 2200 && det_mv <= 2800) {
Uart_SendString("FULLY CHARGED [OK]\r\n");
} else {
Uart_SendString("NOT CHARGING [OK]\r\n");
}
}
Uart_SendString("[SELF-TEST] Self Test Completed Successfully!\r\n");
Uart_SendString("========================================\r\n\r\n");
}
/**
* @brief <20><EFBFBD><E689AF><EFBFBD>箸鱏<E7AEB8><EFBFBD>
* @details <20>單鱏憭𤥁整<F0A4A581><E695B4><EFBFBD><EFBFBD>蝷箏僎<E7AE8F><EFBFBD> PWR_HOLD 撘閗<E69298><E99697><EFBFBD><EFBFBD>餌㩞皞
*/
void Power_Off(void)
{
Uart_SendString("[SYS] Executing Power Off sequence...\r\n");
// 撽颲暸<E9A2B2><E69AB8><EFBFBD>擐 100ms
MOTOR = 1;
Delay_ms(100);
MOTOR = 0;
// <20>單鱏撅誩<E69285><E8AAA9><EFBFBD><EFBFBD>銝 RGB <20><>
SGM_CTRL = 1; // 擃条㩞撟單鱏<E596AE><EFBFBD><E89B9B>喲𡡒<E596B2><F0A1A192><EFBFBD><EFBFBD>
RGB_Send(0, 0, 0, 0, 0, 0);
// <20><EFBFBD> PWR_HOLD <20><><EFBFBD><EFBFBD><E88F9C><EFBFBD><EFBFBD>雿踵餌㩞皞𣂼<E79A9E><F0A382BC>
PWR_HOLD = 0;
// 餈𥕦<E9A488>甇餃儐<E9A483>蝑匧<E89D91><E58CA7><EFBFBD><E88F9C><EFBFBD><E68B8D><EFBFBD>
while (1) {
PWR_HOLD = 0;
}
}
/**
* @brief 蝟餌<E89D9F><E9A48C><EFBFBD><EFBFBD>雿𤾸<E99BBF><F0A4BEB8><EFBFBD><E5A092><EFBFBD><E7AE94>䭾芋撘
*/
void Enter_Low_Power_Sleep(void)
{
Uart_SendString("[SYS] Entering low power sleep...\r\n");
// 1. <20>喲𡡒/<2F><><EFBFBD> RGB <20>
RGB_Send(0, 0, 0, 0, 0, 0);
// 2. <20> LCD <20><><EFBFBD><EFBFBD><EFBFBD> Display OFF <20><>誘 (0x28) <20>單遬蝷
WriteComm(0x28);
Delay_ms(20);
// 3. <20> LCD <20><><EFBFBD><EFBFBD><EFBFBD> Sleep In <20><>誘 (0x10) <20><EFBFBD><E596B3>函㩞<E587BD>瑟陬
WriteComm(0x10);
Delay_ms(20);
// 4. <20>喲𡡒<E596B2><F0A1A192><EFBFBD><EFBFBD><E59A97><EFBFBD>萄像<E89084><E5838F><EFBFBD><E89B9B>喲𡡒<E596B2><F0A1A192><EFBFBD><EFBFBD>撅𧶏<E69285>
SGM_CTRL = 1;
// 5. 撅誩<E69285><E8AAA9>亙藁<E4BA99><EFBFBD><E884AB><EFBFBD><E89084>
LCD_CS = 1;
LCD_RST = 1;
LCD_DCX = 0;
LCD_SCL = 0;
LCD_SDI = 0;
// 6. 撠<>𤏸曄蔭銝箏<E98A9D><E7AE8F><EFBFBD>交𤣰璅<E79285><EFBFBD><E59A97><EFBFBD>蠘梹<E8A098>SHUT=0, RF_SetMode(0)嚗
RF_SetMode(0);
// 雿輯<E99BBF>霈輸䔮<E8BCB8><EFBFBD><E68B99><EFBFBD><E5AF9E><EFBFBD><EFBFBD><E69296><EFBFBD>
P_SW2 |= 0x80;
// 7. <20>滨蔭 Port0 銝<><E98A9D><EFBFBD>皞 (KEY_UP=P0.1, KEY_CONFIRM=P0.2, KEY_DOWN=P0.3)
P0IM1 |= 0x0E;
P0IM0 &= ~0x0E; // 銝钅<E98A9D>瘝輯圻<E8BCAF>
P0INTF = 0x00; // 皜<><EFBFBD><E88684><EFBFBD><E7B5B2><EFBFBD><E89189><EFBFBD><EFBFBD>
P0INTE |= 0x0E; // 撘<> P0.1, P0.2, P0.3 銝<><E98A9D><EFBFBD>
P0WKUE |= 0x0E; // 雿輯<E99BBF> P0.1, P0.2, P0.3 <20>厩㩞<E58EA9><EFBFBD>
// 8. <20>滨蔭 Port2 銝<><E98A9D><EFBFBD>皞 (SOS=P2.6)
P2IM1 |= 0x40;
P2IM0 &= ~0x40; // 銝钅<E98A9D>瘝輯圻<E8BCAF>
P2INTF = 0x00; // 皜<><EFBFBD><E88684><EFBFBD><E7B5B2><EFBFBD>
P2INTE |= 0x40; // 撘<> P2.6 銝<><E98A9D><EFBFBD>
P2WKUE |= 0x40; // 雿輯<E99BBF> P2.6 <20>厩㩞<E58EA9><EFBFBD>
// 9. <20>滨蔭 Port3 銝<><E98A9D><EFBFBD>皞 (RF_RX_DATA=P3.6)
P3IM1 |= 0x40;
P3IM0 |= 0x40; // <20>諹器瘝輯圻<E8BCAF>
P3INTF = 0x00; // 皜<><EFBFBD><E88684><EFBFBD><E7B5B2><EFBFBD>
P3INTE |= 0x40; // 撘<> P3.6 銝<><E98A9D><EFBFBD>
P3WKUE |= 0x40; // 雿輯<E99BBF> P3.6 <20>厩㩞<E58EA9><EFBFBD>
// 蝖靽嘥<E99DBD><E598A5><EFBFBD><E5B88B><EFBFBD>颲枏<E9A2B2>雿輯<E99BBF>嚗屸俈甇<E79487>瘚蝛箔漣<E7AE94><EFBFBD><E6AFBA>蠘埈<E8A098>
P2PU |= 0x40;
P2IE |= 0x40;
P3PU &= ~0x40;
P3IE |= 0x40;
// 皜<><EFBFBD><E5A69F><EFBFBD><EFBFBD>璉瘚𧢲<E7989A>敹𦯀<E695B9>
P0INTF = 0x00;
P2INTF = 0x00;
P3INTF = 0x00;
p0_wakeup_flag = 0;
p2_wakeup_flag = 0;
p3_wakeup_flag = 0;
rf_wakeup_flag = 0;
// 10. <20>喲𡡒蝟餌<E89D9F>皛渡<E79A9B>摰𡁏𧒄<F0A1818F> Timer1 銝<>嚗屸俈甇隡𤑳<E99AA1><F0A491B3>嗉摰𡁏𧒄<F0A1818F><EFBFBD><EFBFBD>
ET1 = 0;
EA = 1; // 撘<><E69298><EFBFBD><EFBFBD>
// <20>滨蔭 PCON <20><><EFBFBD><EFBFBD><E996A7><EFBFBD><E7B6BD><EFBFBD><EFBFBD><EFBFBD>𨀣㦤 (Power Down) 璅<E79285>
PCON |= 0x02; // PD = 1
_nop_(); _nop_(); _nop_(); _nop_();
// ====== 鋡憭㚚<E686AD><EFBFBD><E98A9D><EFBFBD><E697A5>𠬍<EFBFBD><F0A0AC8D>冽文<E586BD>誧蝏餈鞱 ======
Wakeup_Restore();
}
/**
* @brief 隡𤑳<E99AA1><F0A491B3><EFBFBD><E697A5>
*/
void Wakeup_Restore(void)
{
// 竘蚚甜ラ錨偌瑩秏順袨怓儂數杅ㄛ滅奻萇/遢倳侘怓竘お昫黍絳祡酗偌壽儂
extern volatile u16 key_up_hold;
extern volatile u16 key_down_hold;
extern volatile u16 key_confirm_hold;
extern volatile u16 key_sos_hold;
extern volatile u16 comb_hold;
key_up_hold = 0;
key_down_hold = 0;
key_confirm_hold = 0;
key_sos_hold = 0;
comb_hold = 0;
EAXFR = 1;
// 1. 蝡见朖<E8A781>喲𡡒<E596B2><F0A1A192><EFBFBD><E39787>萄㚚<E89084><EFBFBD><E98A9D><EFBFBD><EFBFBD><E8A8BE><EFBFBD><E697A5><EFBFBD><EFBFBD><E8B382><E884AB><EFBD81>
P0INTE = 0x00;
P2INTE = 0x00;
P3INTE = 0x00;
P0WKUE = 0x00;
P2WKUE = 0x00;
P3WKUE = 0x00;
P0INTF = 0x00;
P2INTF = 0x00;
P3INTF = 0x00;
// 2. 皜<><EFBFBD>厩㩞<E58EA9><EFBFBD>摰𡁏𧒄<F0A1818F>
WKTCH = 0x00;
WKTCL = 0x00;
// 3. 撘<><E69298><EFBFBD><EFBFBD>撟園<E6929F><E59C92>蝟餌<E89D9F>皛渡<E79A9B>摰𡁏𧒄<F0A1818F>
// 3. 笢剿羲ぎ袨怓芢喧祫亅躉場宎趙眳綴羲ぎ
// 4. <20><EFBCB7>憸𤏸塳<F0A48FB8><E5A1B3>極雿𨀣芋撘
RF_SetMode(1);
// <20>枏㫲<E69E8F><EFBFBD><EFBFBD><E99D9A><EFBFBD><EFBFBD>
if ((p0_wakeup_flag & 0x0E) || (p2_wakeup_flag & 0x40)) {
Uart_SendString("[WR] Woken by KEY (P0=");
Uart_SendHex8(p0_wakeup_flag);
Uart_SendString(", P2=");
Uart_SendHex8(p2_wakeup_flag);
Uart_SendString(")\r\n");
} else if ((p3_wakeup_flag & 0x40) || rf_wakeup_flag) {
rf_wakeup_flag = 1;
Uart_SendString("[WR] Woken by RF (P3.6)!\r\n");
} else {
Uart_SendString("[WR] Woken by TIMER/Other\r\n");
}
// 5. <20><EFBCB7>撟蓥<E6929F><E893A5><EFBFBD><E8908E><EFBFBD><EFBFBD><EFBFBD><E59A97><EFBFBD>萄像銝羓㩞嚗峕<E59A97>憭滩<E686AD><E6BBA9>劐漁撅𧶏<E69285>
SGM_CTRL = 0;
// 6. 撱嗆𧒄 200ms 蝑匧<E89D91>瘨脫榊蝔喳<E89D94><E596B3><EFBFBD><E8B982>萇迅摰𡁜<E691B0>嚗屸<E59A97><E5B1B8>啣 LCD 撖<><E69296><EFBFBD><EFBFBD>憪见<E686AA>
Delay_ms(200);
LCD_Init();
// 笭陔羲ぎ<E7BEB2>擁笢剿迵 Timer1 舒湘隅奀け笢剿ㄛ眕<E3849B>悵婓萇揤恛隅綴符羲宎偌瑩粒欴
EA = 1;
ET1 = 1;
// 7. <20><><EFBFBD>脩蔭霈⊥𧒄<E28AA5>
inactivity_timer = 0;
}
/**
* @brief 摰匧<E691B0><E58CA7><EFBFBD> Timer0 霈⊥㺭<E28AA5>典 (<28><EFBFBD>摮𡑒<E691AE>皛𡁜𢆡頝喳<E9A09D>)
*/
u16 GetTimer0_Safe(void)
{
u8 high1, high2, low;
do {
high1 = TH0;
low = TL0;
high2 = TH0;
} while (high1 != high2);
return (((u16)high1 << 8) | low);
}
/**
* @brief 銝脣藁 1 <20>煾 4 雿滚<E99BBF><E6BB9A>餈𥕦<E9A488>摮㛖 (0x0~0xF)
*/
void Uart_SendHex4(u8 val)
{
val &= 0x0F;
if (val < 10) {
Uart_SendByte('0' + val);
} else {
Uart_SendByte('A' + (val - 10));
}
}
/**
* @brief 銝脣藁 1 <20>煾 8 雿滚<E99BBF><E6BB9A>餈𥕦<E9A488> (0x00~0xFF)
*/
void Uart_SendHex8(u8 val)
{
Uart_SendHex4(val >> 4);
Uart_SendHex4(val);
}
/**
* @brief 銝脣藁 1 <20>煾 16 雿滚<E99BBF><E6BB9A>餈𥕦<E9A488> (0x0000~0xFFFF)
*/
void Uart_SendHex16(u16 val)
{
Uart_SendHex8((u8)(val >> 8));
Uart_SendHex8((u8)val);
}
/**
* @brief 銝脣藁 1 <20>煾 20 雿滚<E99BBF><E6BB9A>餈𥕦<E9A488> (<28><EFBFBD><EFBFBD> 5 雿 ID <20>枏㫲)
*/
void Uart_SendHex20(u32 val)
{
Uart_SendHex4((u8)(val >> 16));
Uart_SendHex16((u16)val);
}
/**
* @brief 銝脣藁 1 <20>煾 32 雿滚<E99BBF><E6BB9A>餈𥕦<E9A488>
*/
void Uart_SendHex32(u32 val)
{
Uart_SendHex16((u16)(val >> 16));
Uart_SendHex16((u16)val);
}