; p=pic16c71,xt=40000hz LIST P=16c71 ; Z EQU 2 RBPU EQU 7 TEMP EQU 10H OPTIONREG EQU 1H F EQU 1 PORT_B EQU 06H ; INCLUDE <P16c71.INC> LIST ; ORG 0 ;復(fù)位地址 GOTO START ; ORG 4 ;中斷向量 GOTO SERVICEINTERRUPT ; START CALL INITPORT_B ;初始化B口 LOOP SLEEP ;省電睡眠,等待被喚醒 NOP GOTO LOOP ; SERVICEINTERRUPT BTFSC INTCON,RBIF GOTO SERVICEWAKUP CLRF INTCON BSF INTCON,RBIE RETFIE ; ;檢查是哪個(gè)鍵被按下,并點(diǎn)亮相應(yīng)的LED直到按鍵釋放,再返回睡眠狀態(tài) ; SERVICEWAKUP BCF INTCON,RBIE COMF PORT_B,W BCF INTCON,RBIF CALL DELAY16 COMF PORT_B,W ANDLW B11110000 MOVWF TEMP SWAPF TEMP,W MOVWF PORT_B CALL KEYRELEASE RETFIE ; ;等待所有的按鍵都被釋放程序 ; KEYRELEASE CALL DELAY16 COMF PORT_B,W BCF INTCON,RBIF BCF INTCON,RBIE ANDLW B11110000 BTFSC STATUS,Z RETURN GOTO KEYRELEASE ; ;初始化 B口子程序 ; INITPORT_B BSF STATUS,RP0 MOVLW B11110000 MOVWF TRISB BCF OPTIONREG,RBPU BCF STATUS,RP0 CLRF PORT_B BCF INTCON,RBIE MOVF PORT_B,W BCF INTCON,RBIF BSF INTCON,RBIE BSF INTCON,GIE RETURN ; ;延時(shí)去抖動(dòng)子程序 DELAY16 BSF STATUS,RP0 MOVLW B00000111 MOVWF OPTIONREG BCF STATUS,RP0 CLRF TMR0 BCF INTCON,T0IF CHECKAGAIN BTFSS INTCON,T0IF GOTO CHECKAGAIN BCF INTCON,T0IF RETURN END
|
|