Files
stc32g128k/App/system.c

379 lines
9.5 KiB
C
Raw Normal View History

#include "system.h"
#include "rgb.h"
#include "ui.h"
#include "clock.h"
#include "../Drivers/lcd.h"
#include "../Drivers/rf.h"
#include "intrins.h"
// <20><><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> main.c <20>еĵ<D0B5><C4B5><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>״̬<D7B4>ݴ<EFBFBD><DDB4><EFBFBD>־
extern volatile u8 p0_wakeup_flag; // P0 <20>˿ڰ<CBBF><DAB0><EFBFBD><EFBFBD>жϻ<D0B6><CFBB>ѱ<EFBFBD>־
extern volatile u8 p2_wakeup_flag; // P2 <20>˿ڰ<CBBF><DAB0><EFBFBD><EFBFBD>жϻ<D0B6><CFBB>ѱ<EFBFBD>־
extern volatile u8 p3_wakeup_flag; // P3 <20>˿<EFBFBD><CBBF><EFBFBD>Ƶ<EFBFBD>жϻ<D0B6><CFBB>ѱ<EFBFBD>־
extern volatile u8 rf_wakeup_flag; // <20><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD>жϻ<D0B6><CFBB>ѱ<EFBFBD>־
/**
* @brief ϵͳ GPIO <EFBFBD>˿ڹ<EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void GPIO_Init(void)
{
// EAXFR = 1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>ܼĴ<DCBC><C4B4><EFBFBD> (XSFR)
EAXFR = 1;
// 1. <20><><EFBFBD><EFBFBD> P0.1 (KEY_UP), P0.2 (KEY_CONFIRM), P0.3 (KEY_DOWN) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ׼˫<D7BC><CBAB><EFBFBD><EFBFBD>ģʽ (M1=0, M0=0)
P0M1 &= ~0x0E;
P0M0 &= ~0x0E;
KEY_UP = 1;
KEY_CONFIRM = 1;
KEY_DOWN = 1;
// 2. <20><><EFBFBD><EFBFBD> P1.3 (BAT_ADC) <20><><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=1, M0=0)
P1M1 |= (1 << 3);
P1M0 &= ~(1 << 3);
// 3. <20><><EFBFBD><EFBFBD> P5.4 (DET) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=1, M0=0)
P5M1 |= (1 << 4);
P5M0 &= ~(1 << 4);
// 4. <20><><EFBFBD><EFBFBD> P2.5 (MOTOR) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=0, M0=1)
P2M1 &= ~(1 << 5);
P2M0 |= (1 << 5);
MOTOR = 0; // Ĭ<>Ͼ<EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 5. <20><><EFBFBD><EFBFBD> P2.6 (KEY_SOS) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ׼˫<D7BC><CBAB><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> 1 (M1=0, M0=0)
P2M1 &= ~(1 << 6);
P2M0 &= ~(1 << 6);
KEY_SOS = 1;
// 6. <20><><EFBFBD><EFBFBD> P3.5 (SHUT) <20><>ƵоƬʹ<C6AC><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=0, M0=1)
P3M1 &= ~(1 << 5);
P3M0 |= (1 << 5);
SHUT = 1; // Ĭ<><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>оƬ<D0BE><C6AC><EFBFBD><EFBFBD>
// 7. <20><><EFBFBD><EFBFBD> P1.7 (SGM_CTRL / LEDA) Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ (M1=0, M0=1)
// PMOS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3>͵<EFBFBD>ƽ (0) <20><>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ߵ<EFBFBD>ƽ (1) <20><>ֹϨ<D6B9><CFA8>
P1M1 &= ~(1 << 7);
P1M0 |= (1 << 7);
SGM_CTRL = 1; // <20><>ʼ<EFBFBD><CABC>Ϊ<EFBFBD>ߵ<EFBFBD>ƽ (<28>رձ<D8B1><D5B1><EFBFBD>)<29><><EFBFBD><EFBFBD> LCD_Init <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>
// 8. <20><><EFBFBD><EFBFBD> P0.1, P0.2, P0.3 <20><> P2.6 <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8>ն<EFBFBD><D5B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P0PU |= 0x0E; // <20><><EFBFBD><EFBFBD> P0.1/P0.2/P0.3 <20><><EFBFBD><EFBFBD>
P2PU |= 0x40; // <20><><EFBFBD><EFBFBD> P2.6 <20><><EFBFBD><EFBFBD>
// 9. <20><><EFBFBD><EFBFBD> P3.0 (UART1_RXD - <20><><EFBFBD><EFBFBD>) <20><> P3.1 (UART1_TXD - <20><><EFBFBD><EFBFBD>) Ϊ<><CEAA>Ӧģʽ
P3M1 &= ~((1 << 0) | (1 << 1));
P3M0 &= ~(1 << 0); // RXD <20><>Ϊ׼˫<D7BC><CBAB>
P3M0 |= (1 << 1); // TXD <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> CPU Ƶ<EFBFBD>ʹ<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
* @param ms <EFBFBD>ӳٺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Delay_ms(u16 ms)
{
u16 i, j;
for (i = 0; i < ms; i++)
// 24MHz <20><><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>˫<EFBFBD><CBAB>ѭ<EFBFBD><D1AD>ʵ<EFBFBD><CAB5>Լ 1ms <20>ӳ<EFBFBD>
for (j = 12000; j > 0; j--);
}
/**
* @brief <EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD> 10 ΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8051 ָ<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>)
*/
void Delay10us(void)
{
unsigned char data i;
_nop_();
i = 30; // ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (--i);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ΢<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param us <EFBFBD>ӳ<EFBFBD>΢<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Delay_us(u16 us)
{
u16 i;
for(i = 0; i < us; i++)
{
_nop_(); _nop_(); _nop_(); _nop_();
}
}
/**
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD> Timer0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*/
u16 GetTimer0_Safe(void)
{
u8 th, tl;
do {
th = TH0;
tl = TL0;
} while (th != TH0); // <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return ((u16)th << 8) | tl;
}
/**
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> UART1 (<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1) <EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart1_Init(void)
{
SCON = 0x50; // 8λ<38><CEBB><EFBFBD><EFBFBD>, <20>ɱ䲨<C9B1><E4B2A8><EFBFBD><EFBFBD>
T2L = 0xCC; // 1Tģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 115200 <20><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>λ (24MHz)
T2H = 0xFF; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>λ
AUXR |= 0x14; // <20><>ʱ<EFBFBD><CAB1> 2 <20><>Ϊ 1T ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> 2
AUXR |= 0x01; // <20><><EFBFBD><EFBFBD> 1 ѡ<><D1A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> 2 <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD>
ES = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SendByte(u8 dat)
{
SBUF = dat;
while (!TI); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE>λ
TI = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD>־
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> '' <EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SendString(char *s)
{
while (*s)
{
Uart_SendByte(*s++);
}
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
* @return char <EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򷵻<EFBFBD> ''
*/
char Uart_RxChar(void)
{
if (RI)
{
char c = SBUF;
RI = 0;
return c;
}
return '\0';
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 4 λʮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SendHex4(u8 val)
{
val &= 0x0F;
if (val < 10)
Uart_SendByte('0' + val);
else
Uart_SendByte('A' + (val - 10));
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 λʮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SendHex8(u8 val)
{
Uart_SendHex4(val >> 4);
Uart_SendHex4(val);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 16 λʮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SendHex16(u16 val)
{
Uart_SendHex8((u8)(val >> 8));
Uart_SendHex8((u8)val);
}
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 32 λʮ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Uart_SendHex32(u32 val)
{
Uart_SendHex16((u16)(val >> 16));
Uart_SendHex16((u16)val);
}
/**
* @brief <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 20 λ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַΪ "ADDR: 0xXXXXX" <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
*/
void Format_Hex_Address(u32 val, char *buf)
{
u8 i;
buf[0] = 'A'; buf[1] = 'D'; buf[2] = 'D'; buf[3] = 'R'; buf[4] = ':';
buf[5] = ' '; buf[6] = '0'; buf[7] = 'x';
for (i = 0; i < 5; i++) {
u8 nibble = (val >> (4 * (4 - i))) & 0x0F;
if (nibble < 10)
buf[8 + i] = '0' + nibble;
else
buf[8 + i] = 'A' + (nibble - 10);
}
buf[13] = '\0';
}
/**
* @brief ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Power-Down) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void Enter_Low_Power_Sleep(void)
{
Uart_SendString("[SYS] Entering low power sleep...\r\n");
// 1. <20>ر<EFBFBD>/Ϩ<><CFA8> FCOB <20><><EFBFBD><EFBFBD>
RGB_Send(0, 0, 0, 0, 0, 0);
// 2. <20><> LCD <20><>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>оƬд<C6AC><D0B4> Display OFF ָ<><D6B8> (0x28)<29><><EFBFBD>رշ<D8B1><D5B7><EFBFBD>
WriteComm(0x28);
Delay_ms(20);
// 3. <20><>ĻоƬд<C6AC><D0B4> Sleep In ָ<><D6B8> (0x10)<29><>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>Ԫͣ<D4AA><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
WriteComm(0x10);
Delay_ms(20);
// 4. PMOS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD> P1.7 (SGM_CTRL) <20><><EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>ֹϨ<D6B9>𱳹⣬<F0B1B3B9>ž<EFBFBD>©<EFBFBD><C2A9>
SGM_CTRL = 1;
// 5. <20><><EFBFBD><EFBFBD>Ļ<EFBFBD>ӿڷ<D3BF>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD>á<EFBFBD><C3A1><EFBFBD>
// SCL, SDA <20><><EFBFBD>ͣ<EFBFBD>CS, RST <20><><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>ͨ·<CDA8><C2B7><EFBFBD><EFBFBD>
LCD_CS = 1;
LCD_RST = 1;
LCD_DCX = 0;
LCD_SCL = 0;
LCD_SDI = 0;
// 6. <20><><EFBFBD><EFBFBD>ģʽ<C4A3>¹ر<C2B9><D8B1><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD>״̬ (SHUT=0, RF_RX=1)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
RF_SetMode(0);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ SFR <20><><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8> (EAXFR = 1)
P_SW2 |= 0x80;
// 7. <20><><EFBFBD><EFBFBD> P0.1, P0.2, P0.3 (KEY_UP/CONFIRM/DOWN) <20>˿<EFBFBD><CBBF>½<EFBFBD><C2BD>ص͵<D8B5>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
P0IM1 |= 0x0E;
P0IM0 &= ~0x0E;
P0INTE |= 0x0E; // <20><><EFBFBD><EFBFBD> P0 <20>˿ڵ<CBBF><DAB5>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
// 8. <20><><EFBFBD><EFBFBD> P2.6 (KEY_SOS) Ϊ<>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>Դ
P2IM1 |= 0x40;
P2IM0 &= ~0x40;
P2INTE |= 0x40; // <20><><EFBFBD><EFBFBD> P2 <20>˿<EFBFBD><CBBF>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
// 9. <20><><EFBFBD><EFBFBD> P3.6 (RF_RX_DATA <20>¹ܽ<C2B9>) Ϊ˫<CEAA><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B4A5><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><E4BBBD> MCU
P3IM1 |= 0x40;
P3IM0 |= 0x40;
P3INTE |= 0x40; // <20><><EFBFBD><EFBFBD> P3 <20>˿<EFBFBD><CBBF>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
// 10. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD>á<EFBFBD><C3A1><EFBFBD>
P0WKUE |= 0x0E; // ʹ<><CAB9> P0.1/P0.2/P0.3 <20>ĵ<EFBFBD><C4B5><EFBFBD><E7BBBD>
P2WKUE |= 0x40; // ʹ<><CAB9> P2.6 <20>ĵ<EFBFBD><C4B5><EFBFBD><E7BBBD>
P3WKUE |= 0x40; // ʹ<><CAB9> P3.6 <20>ĵ<EFBFBD><C4B5><EFBFBD><E7BBBD>
// <20><>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD>ơ<EFBFBD><C6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> P2.6 (SOS) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD> P3.6 (RF_RX_DATA) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD>
P2PU |= 0x40;
P2IE |= 0x40; // ʹ<><CAB9> P2.6 <20>ڲ<EFBFBD>ͨ<EFBFBD><CDA8>
P3PU &= ~0x40; // <20><><EFBFBD><EFBFBD> P3.6 <20><><EFBFBD><EFBFBD>
P3IE |= 0x40; // ǿ<><C7BF>ʹ<EFBFBD><CAB9> P3.6 <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD>ܱ<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>׽
// 11. <20><><EFBFBD><EFBFBD> P0, P2, P3 <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ֹ˲<D6B9><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P0INTF = 0x00;
P2INTF = 0x00;
P3INTF = 0x00;
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ݴ<EFBFBD><DDB4>Ļ<EFBFBD><C4BB><EFBFBD>Դ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>־
p0_wakeup_flag = 0;
p2_wakeup_flag = 0;
p3_wakeup_flag = 0;
rf_wakeup_flag = 0;
// 12. <20>ر<EFBFBD> Timer1 (ϵͳ<CFB5>δ<EFBFBD>) <20>жϡ<D0B6>ȫ<EFBFBD><C8AB><EFBFBD>жϱ<D0B6><CFB1>ֿ<EFBFBD><D6BF><EFBFBD> (EA=1) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7BBBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ET1 = 0;
EA = 1;
// 13. <20><><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD> PCON д<><D0B4> 0x02<30><32>ʹ MCU <20><><EFBFBD><EFBFBD> Power-Down ģʽ<C4A3><CABD>CPU ֹͣ<CDA3><D6B9>ת
Uart_SendString("[SYS] Entering Power-Down mode...\r\n");
PCON |= 0x02; // <20>趨 PD λ<><CEBB>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߹<EFBFBD><DFB9><EFBFBD>
// <20><><EFBFBD>Ѻ<EFBFBD>ˢ<EFBFBD><CBA2>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ˮ<EFBFBD><CBAE>
_nop_();
_nop_();
_nop_();
_nop_();
// 14. <20><><EFBFBD>Ѻ<EFBFBD><D1BA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ŵӱ<C5B4><D3B1><EFBFBD>ִ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD> Wakeup_Restore() <20><><EFBFBD>ѻָ<D1BB><D6B8><EFBFBD><EFBFBD><EFBFBD>
Wakeup_Restore();
}
/**
* @brief ϵͳ<EFBFBD><EFBFBD><EFBFBD>жϻ<EFBFBD><EFBFBD>Ѻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>߼<EFBFBD>
*/
void Wakeup_Restore(void)
{
EAXFR = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
// 1. <20><><EFBFBD><EFBFBD><EFBFBD>رջ<D8B1><D5BB><EFBFBD>Դ<EFBFBD>Ͷ˿<CDB6><CBBF>жϣ<D0B6><CFA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>󴥷<EFBFBD>
P0INTE = 0x00;
P2INTE = 0x00;
P3INTE = 0x00;
P0WKUE = 0x00; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E7BBBD>Դʹ<D4B4><CAB9>
P2WKUE = 0x00;
P3WKUE = 0x00;
P0INTF = 0x00; // <20><><EFBFBD>ձ<EFBFBD>־λ
P2INTF = 0x00;
P3INTF = 0x00;
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ר<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
WKTCH = 0x00;
WKTCL = 0x00;
// 3. <20>ָ<EFBFBD> Timer1 <20><>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD><C2BF><EFBFBD>ϵͳ<CFB5><CDB3>׼ʱ<D7BC><CAB1><EFBFBD><EFBFBD>ѯ
EA = 1;
ET1 = 1;
// 4. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RF_SetMode(1);
// <20><>ӡ<EFBFBD><D3A1>־<EFBFBD><D6BE><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD>Դ<EFBFBD><D4B4>ھ<EFBFBD><DABE><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><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; // ȷ<>ϱ<EFBFBD><CFB1><EFBFBD>Ϊ<EFBFBD><CEAA>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Uart_SendString("[WR] Woken by RF (P3.6)!\r\n");
}
else
{
Uart_SendString("[WR] Woken by TIMER/Other\r\n");
}
// 5. <20><><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><E2BFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PMOS <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD> P1.7 (SGM_CTRL) <20><><EFBFBD>͵<EFBFBD>ƽ<EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SGM_CTRL = 0;
// 6. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ 200ms <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBB1B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD>ӿ
Delay_ms(200);
// 7. <20><><EFBFBD>µ<EFBFBD><C2B5><EFBFBD> LCD_Init() <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>á<EFBFBD>٤<EFBFBD><D9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LCD_Init();
// 8. <20><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>޲<EFBFBD><DEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>Ϊ<EFBFBD><CEAA>
inactivity_timer = 0;
// 9. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬Ϊ<CCAC><CEAA>ͨʱ<CDA8>ӣ<EFBFBD><D3A3><EFBFBD>ǿ<EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ʱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><E6BAAF>ˢ<EFBFBD><CBA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><D8B9><EFBFBD>״̬
current_state = STATE_NORMAL;
UI_ShowClockPage(current_state, current_hour, current_min);
Uart_SendString("[SYS] Wakeup restored!\r\n");
}