4-16 SLEEP0 HT66F70A
操作選擇結構
SMOD 控制暫存器 Bit [7:5] : CKS[2:0] 系統時脈選擇位元 Bit [4] : FSTEN 快速喚醒功能控制位元 NAME CKS2 CKS1 CKS0 FSTEN LTO HTO IDLEN HLCLK Bit 7 6 5 4 3 2 1 Bit [7:5] : CKS[2:0] 系統時脈選擇位元 僅HLCLK=「0」時有效,此時系統時脈為 : 000 : fsys=fSUB(fLXT或fLIRC) 100 : fsys=fH/16 001 : fsys=fSUB(fLXT或fLIRC) 101 : fsys=fH/8 010 : fsys=fH/64 110 : fsys=fH/4 011 : fsys=fH/32 111 : fsys=fH/2 Bit [4] : FSTEN 快速喚醒功能控制位元 1 = 致能快速喚醒功能 0 = 禁能快速喚醒功能 Bit [3] : LTO 低頻系統震盪器狀態旗標 1 = 低頻系統震盪器已經備妥 0 = 低頻系統震盪器尚未備妥 Bit [2] : HTO 高頻系統震盪器狀態旗標 1 = 高頻系統震盪器已經備妥 0 = 高頻系統震盪器尚未備妥
SMOD 控制暫存器 Bit [1] : IDLEN 「IDLE」模式控制位元 Bit [0] : HLCLK 系統時脈選擇位元 NAME CKS2 CKS1 CKS0 FSTEN LTO HTO IDLEN HLCLK Bit 7 6 5 4 3 2 1 Bit [1] : IDLEN 「IDLE」模式控制位元 1 = 致能「IDLE」模式 0 = 禁能「IDLE」模式 Bit [0] : HLCLK 系統時脈選擇位元 1 : fsys = fH 0 : fsys = fL或fH/2~ fH/64
SLEEP0 IDLEN(SMOD暫存器) = 0 LVDEN位元(LVDC暫存器) = 0 執行「HALT」指令 進入後關閉CPU、停止fsub與fH供應、關閉WDT功能 喚醒省電模式 外部硬體重置 WDT計時溢位重置 中斷喚醒 PA 1-> 0位準變化
4-16 SLEEP0 #include <HT66F70A.h> #define SEG_Port _pc #define SEG_PortC _pcc #define wake_up _pa3 #define wake_upC _pac3 #define wake_upPU _papu3 #define SW0 _pa4 #define SW0C _pac4 #define SW0PU _papu4 //外部中斷INT0 PA.4 Wake-up 喚醒 CPU typedef unsigned char u8; typedef unsigned short u16; const u8 SEG_TAB[] = { //七段顯示器顯示碼(共陰) 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x67}; void Delay100us(u16); //函式原型宣告 u8 i=0,SLP_count=50; //將i與SLP_count設為全域並設定初值
主程式 void main() { _wdtc=0b10101111; //關閉看門狗計時器 SEG_PortC=0x00; //規劃SEG_Port為輸出模式 wake_upC=1; wake_upPU=1; //規劃wake_up為輸入模式並啟用內部提升電阻 SW0C=1; SW0PU=1; //規劃SW0為輸入模式並啟用內部提升電阻 _pawu4=1; //設定PA4快速喚醒功能 _integ=0b00000010; //設定INT0觸發條件 _ifs0=0b00000000; //設定INT0輸入腳位 _idlen=0; _lvden=0; _emi=1; //致能中斷致能位元 while(1) { SEG_Port=SEG_TAB[i]; //查表並遞增索引值 if(!SW0) { if(++i>9)i=0; SLP_count=50; } //重置計數 Delay100us(1000); //延遲0.1毫秒 if(--SLP_count==0) //當按鈕5秒後未按下即進入省電模式 { SEG_Port=0x00; _int0e=1; //致能INT0 GCC_HALT(); } //進入省電模式 }
副程式 void Delay100us(u16 del) //延遲del*200指令週期 { u16 k,j; //@fSYS=8MH,延遲del*100us for(k=0;k<del;k++) for(j=0;j<=25;j++) GCC_NOP(); } DEFINE_ISR(ISR_INT0,0x04) //外部中斷喚醒並使七段顯示器由a~g輪流點亮 { u8 j; u16 k; SEG_Port=0x80; for(j=0;j<7;j++) { SEG_Port=SEG_Port>>1; for(k=0;k<25000;k++)GCC_NOP();} _int0f=0; //清除INT0旗標 _int0e=0; //禁能INT0 SLP_count=50; //重置計數