|
/*該程序?qū)崿F(xiàn)PIC18F458的休眠狀態(tài)工作方式,并由實(shí)驗(yàn)板上的按鍵產(chǎn)生"電平變化中斷"將其從休眠狀態(tài)中激活。休眠與激活的狀態(tài)由與D口相連的8個(gè)LED顯示。休眠時(shí)高4個(gè) LED發(fā)光,低4個(gè)LED熄滅; 激活以后高4個(gè)LED熄滅,低4個(gè)LED發(fā)光*/
#include "p18f458.h"
unsigned long i;
/*系統(tǒng)初始化子程序*/ void initial() { INTCON=0x08; /*全局中斷禁止,"電平變化中斷"只執(zhí)行喚醒功能*/ /*清除B口電平變化中斷標(biāo)志*/ TRISA=0x00; /*A口設(shè)置為輸出*/ TRISB=0XF0; /*RB1輸出,RB4輸入*/ TRISD=0X00; /*D口為輸出*/ TRISE=0x00; /*E口設(shè)置為輸出*/ PORTBbits.RB1=0; PORTAbits.RA3=0; PORTE=0; /*將K1,K2,K3,K4四條列線置0*/ PORTB=PORTB; /*讀PORTB的值,鎖存舊值,也為“電平變化 中斷”作準(zhǔn)備*/ }
void SLEEP() { _asm SLEEP /*進(jìn)入休眠狀態(tài)*/ _endasm }
/*主程序*/ main () { initial(); /*初始化*/ PORTD=0X0F; /*高4個(gè)LED燈亮*/ SLEEP(); /*單片機(jī)開始進(jìn)入休眠狀態(tài)*/ PORTD=0XF0; /*激活后,低4個(gè)LED燈亮*/ while(1) { ; }
} 完畢! -----------匯編語(yǔ)言編寫的PIC18F458單片機(jī)休眠狀態(tài)工作方式與激活----------------------- ;該程序?qū)崿F(xiàn)PIC18F458的休眠工作方式, ;
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 ;詳細(xì)程序語(yǔ)句請(qǐng)參考3. 1. 3節(jié) RETURN
;**********初始化子程序************* INITIAL BCF INTCON,GIE ;全局中斷禁止,"電平變化中斷"只執(zhí)行喚醒功能 BSF INTCON,RBIE ;PORTB口電平變化中斷允許 BCF INTCON,RBIF ;清除B口電平變化中斷標(biāo)志 BCF TRISA,5 ;置RA5為輸出方式,以輸出鎖存信號(hào) BCF TRISB,1 BCF TRISA,3 BCF TRISE,0 BCF TRISE,1 BSF TRISB,4 ;設(shè)置與鍵盤有關(guān)的各口的輸入輸出方式 BCF TRISC,5 BCF TRISC,3 ;設(shè)置SCK與SDO為輸出方式 MOVLW 0XC0 MOVWF SSPSTAT ;設(shè)置SSPSTAT寄存器 MOVLW 0X30 MOVWF SSPCON1 ;設(shè)置SPI的控制方式,允許SSP方式,并且時(shí)鐘下降沿 ;發(fā)送,與"74HC595當(dāng)其SCLK從低到高平跳變時(shí),串行 ;輸入數(shù)據(jù)(DI)移入寄存器"的特點(diǎn)相對(duì)應(yīng) BCF PORTB,1 BCF PORTA,3 BCF PORTE,0 BCF PORTE,1 ;K1,K2,K3,K4四條列線置0, 為電平變化中斷的產(chǎn)生 ;創(chuàng)造初始條件 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進(jìn)入"休眠工作方式" NOP MOVLW 0X08 MOVWF COUNT MOVLW 0X90 ;"90"為"9"的顯示段碼 NEXT CALL DISPLAY ;休眠喚醒之后顯示8個(gè)字符"9" DECF COUNT,1 BTFSS STATUS,Z GOTO NEXT NOP END |