510 lines
14 KiB
C
510 lines
14 KiB
C
#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>瘜Y鸌<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>嚗屸俈甇W<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>W
|
||
*/
|
||
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>脫a<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>W滚<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>W滚<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);
|
||
}
|