/*該程序實現PIC18F458的休眠狀態工作方式,并由實驗板上的按鍵產生"電平變化中斷"將其從休眠狀態中激活。休眠與激活的狀態由與D口相連的8個LED顯示。休眠時高4個
LED發光,低4個LED熄滅; 激活以后高4個LED熄滅,低4個LED發光*/
#include "p18f458.h"
unsigned long i;
/*系統初始化子程序*/
void initial()
{
INTCON=0x08; /*全局中斷禁止,"電平變化中斷"只執行喚醒功能*/
/*清除B口電平變化中斷標志*/
TRISA=0x00; /*A口設置為輸出*/
TRISB=0XF0; /*RB1輸出,RB4輸入*/
TRISD=0X00; /*D口為輸出*/
TRISE=0x00; /*E口設置為輸出*/
PORTBbits.RB1=0;
PORTAbits.RA3=0;
PORTE=0; /*將K1,K2,K3,K4四條列線置0*/
PORTB=PORTB; /*讀PORTB的值,鎖存舊值,也為“電平變化
中斷”作準備*/
}
void SLEEP()
{
_asm
SLEEP /*進入休眠狀態*/
_endasm
}
/*主程序*/
main ()
{
initial(); /*初始化*/
PORTD=0X0F; /*高4個LED燈亮*/
SLEEP(); /*單片機開始進入休眠狀態*/
PORTD=0XF0; /*激活后,低4個LED燈亮*/
while(1)
{
;
}
}
完畢!
-----------匯編語言編寫的PIC18F458單片機休眠狀態工作方式與激活-----------------------
;該程序實現PIC18F458的休眠工作方式,
;http://www.zg4o1577.cn已用本站單片機實驗板測試通過本程序
;并由實驗板上的按鍵產生"電平變化中斷"將其從休眠狀態中激活.
LIST P=18F458
INCLUDE "P18F458.INC"
COUNT EQU 0X20
ORG 0X00
GOTO MAIN
ORG 0X30
;************顯示子程序***************
DISPLAY
CLRF PORTA
MOVWF SSPBUF
LOOP NOP
BTFSS PIR1,SSPIF
GOTO LOOP
NOP
BCF PIR1,SSPIF
BSF PORTA,5 ;詳細程序語句請參考3. 1. 3節
RETURN
;**********初始化子程序*************
INITIAL
BCF INTCON,GIE ;全局中斷禁止,"電平變化中斷"只執行喚醒功能
BSF INTCON,RBIE ;PORTB口電平變化中斷允許
BCF INTCON,RBIF ;清除B口電平變化中斷標志
BCF TRISA,5 ;置RA5為輸出方式,以輸出鎖存信號
BCF TRISB,1
BCF TRISA,3
BCF TRISE,0
BCF TRISE,1
BSF TRISB,4 ;設置與鍵盤有關的各口的輸入輸出方式
BCF TRISC,5
BCF TRISC,3 ;設置SCK與SDO為輸出方式
MOVLW 0XC0
MOVWF SSPSTAT ;設置SSPSTAT寄存器
MOVLW 0X30
MOVWF SSPCON1 ;設置SPI的控制方式,允許SSP方式,并且時鐘下降沿
;發送,與"74HC595當其SCLK從低到高平跳變時,串行
;輸入數據(DI)移入寄存器"的特點相對應
BCF PORTB,1
BCF PORTA,3
BCF PORTE,0
BCF PORTE,1 ;K1,K2,K3,K4四條列線置0, 為電平變化中斷的產生
;創造初始條件
RETURN ;返回
;****************************************
MAIN NOP
CALL INITIAL ;初始化
MOVLW 0X08
MOVWF COUNT
MOVLW 0XFF ;"FF"為"DARK"字符的顯示段碼
NEXT1
CALL DISPLAY ;在休眠之前使8各LED全顯示"DARK"
DECF COUNT,1
BTFSS STATUS,Z
GOTO NEXT1
SLEEP ;PIC16F877進入"休眠工作方式"
NOP
MOVLW 0X08
MOVWF COUNT
MOVLW 0X90 ;"90"為"9"的顯示段碼
NEXT
CALL DISPLAY ;休眠喚醒之后顯示8個字符"9"
DECF COUNT,1
BTFSS STATUS,Z
GOTO NEXT
NOP
END