程序范例:
1.外部中断LED 方向控制
2.计时中断LED 方向控制
3.计时加外部中断LED 方向控制
4.计时中断时钟 ─ 分:秒(使用七段显示器)
5.计时中断 ─ 改写8led22.asm 程序
外部中断LED 方向控制
范例一:int1.*
LIST P=16F877,R=DEC
#INCLUDE <P16F877.INC>
;
CBLOCK 0X20
R0,USRFLAG
ENDC
;
ORG 0
NOP
GOTO MAIN
ORG 4
BTFSS USRFLAG,0
GOTO INT1
BCF USRFLAG,0
GOTO INT2
INT1: BSF USRFLAG,0
INT2: BTFSS PORTB,0
GOTO INT2
BCF INTCON,INTF
RETFIE
;
MAIN:
BANKSEL TRISD
MOVLW 0
MOVWF TRISD
BANKSEL PORTD
BSF INTCON,GIE
BSF INTCON,INTE
MOVLW B'11111110'
MOVWF R0
BCF USRFLAG,0
MLOOP: MOVF R0,0
MOVWF PORTD
CALL DELAY250
BTFSC USRFLAG,0
GOTO RIGHT
LEFT: CLRC
BTFSC R0,7
SETC
RLF R0,1 |
GOTO MLOOP
RIGHT: CLRC
BTFSC R0,0
SETC
RRF R0,1
GOTO MLOOP
;
#INCLUDE <DELAY250.INC>
;
END |
|
计时中断LED 方向控制
范例一:int2.*
LIST P=16F877,R=DEC
#INCLUDE <P16F877.INC>
;
CBLOCK 0X20
R0,WBAK,SBAK,USRFLAG
DCONT
ENDC
;
TBUF EQU 256-250
;
ORG 0
NOP
GOTO MAIN
ORG 4
MOVWF WBAK
SWAPF STATUS,0
MOVWF SBAK
MOVLW TBUF
ADDWF TMR0
DECF DCONT
MOVF DCONT,1
SKPZ
GOTO T2INT
MOVLW .200
MOVWF DCONT
BTFSS USRFLAG,0
GOTO T1INT
BCF USRFLAG,0
GOTO T2INT
T1INT: BSF USRFLAG,0
T2INT: BCF INTCON,T0IF
SWAPF SBAK,0
MOVWF STATUS
SWAPF WBAK,1
SWAPF WBAK,0
RETFIE
;
MAIN:
BANKSEL OPTION_REG |
MOVLW B'00000111'
MOVWF OPTION_REG
MOVLW 0
MOVWF TRISD
BANKSEL TMR0
MOVLW TBUF
MOVWF TMR0
BSF INTCON,GIE
BSF INTCON,T0IE
MOVLW .200
MOVWF DCONT
MOVLW B'11111110'
MOVWF R0
BCF USRFLAG,0
MLOOP: MOVF R0,0
MOVWF PORTD
CALL DELAY250
BTFSC USRFLAG,0
GOTO RIGHT
LEFT: CLRC
BTFSC R0,7
SETC
RLF R0,1
GOTO MLOOP
RIGHT: CLRC
BTFSC R0,0
SETC
RRF R0,1
GOTO MLOOP
;
#INCLUDE <DELAY250.INC>
;
END |
|
计时加外部中断LED方向控制 |
范例一:int3.*
LIST P=16F877,R=DEC
#INCLUDE <P16F877.INC>
;
CBLOCK 0X20
R0,WBAK,SBAK,USRFLAG
DCONT
ENDC
;
TBUF EQU 256-250
;
ORG 0
NOP
GOTO MAIN
ORG 4
BTFSS INTCON,T0IF
GOTO INT0
BCF INTCON,INTE
MOVWF WBAK
SWAPF STATUS,0
MOVWF SBAK
MOVLW TBUF
ADDWF TMR0
DECF DCONT
MOVF DCONT,1
SKPZ
GOTO T2INT
MOVLW .200
MOVWF DCONT
BTFSS USRFLAG,0
GOTO T1INT
BCF USRFLAG,0
GOTO T2INT
T1INT: BSF USRFLAG,0
T2INT: BCF INTCON,T0IF
BSF INTCON,INTE
SWAPF SBAK,0
MOVWF STATUS
SWAPF WBAK,1
SWAPF WBAK,0
GOTO RIGHT
LEFT: CLRC
BTFSC R0,7
SETC
RLF R0,1
GOTO MLOOP
RIGHT: CLRC
BTFSC R0,0
SETC
RRF R0,1
GOTO MLOOP
;
#INCLUDE <DELAY250.INC>
;
END |
RETFIE
;
INT0: BCF INTCON,T0IE
BTFSS USRFLAG,0
GOTO INT01
BCF USRFLAG,0
GOTO INT02
INT01: BSF USRFLAG,0
INT02: BTFSS PORTB,0
GOTO INT02
BCF INTCON,INTF
MOVLW TBUF
MOVWF TMR0
MOVLW .200
MOVWF DCONT
BSF INTCON,T0IE
RETFIE
;
MAIN:
BANKSEL OPTION_REG
MOVLW B'00000111'
MOVWF OPTION_REG
MOVLW 0
MOVWF TRISD
BANKSEL TMR0
MOVLW TBUF
MOVWF TMR0
BSF INTCON,GIE
BSF INTCON,T0IE
BSF INTCON,INTE
MOVLW .200
MOVWF DCONT
MOVLW B'11111110'
MOVWF R0
BCF USRFLAG,0
MLOOP: MOVF R0,0
MOVWF PORTD
CALL DELAY250
BTFSC USRFLAG,0 |
|
计时中断时钟 ─ 分:秒(使用七段显示器) |
范例一:intclock.*
LIST P=16F877,R=DEC
#INCLUDE <P16F877.INC>
;
CBLOCK 0X20
DB0,DB1,WBAK,SBAK,DCONT
C1,C2,TIMS,TIMM
ENDC
;
TBUF EQU 256-250
;
ORG 0
NOP
GOTO MAIN
ORG 4
MOVWF WBAK
SWAPF STATUS,0
MOVWF SBAK
MOVLW TBUF
ADDWF TMR0
DECF DCONT
MOVF DCONT,1
SKPZ
GOTO T2INT
MOVLW .125
MOVWF DCONT
CALL TEST1
CALL TEST2
T2INT: BCF INTCON,T0IF
SWAPF SBAK,0
MOVWF STATUS
SWAPF WBAK,1
SWAPF WBAK,0
RETFIE
;
MAIN:
BANKSEL OPTION_REG
MOVLW B'00000110'
MOVWF OPTION_REG
MOVLW 0
;
SWAPF TIMM,0
CALL TABLE
MOVWF PORTD
MOVLW H'F7'
MOVWF PORTB
CALL DELAY25
BSF PORTB,3
GOTO MLOOP
;
TABLE: ANDLW H'0F'
ADDWF PCL
T1: RETLW H'C0' ;'0'
RETLW H'F9' ;'1'
RETLW H'A4' ;'2'
RETLW H'B0' ;'3'
RETLW H'99' ;'4'
RETLW H'92' ;'5'
RETLW H'82' ;'6'
RETLW H'F8' ;'7'
RETLW H'80' ;'8'
RETLW H'90' ;'9'
RETLW H'88' ;'A'
RETLW H'83' ;'B'
RETLW H'C6' ;'C'
RETLW H'A1' ;'D'
RETLW H'86' ;'E'
RETLW H'8E' ;'F'
;
TEST1: INCF DB0
MOVF DB0,0
SUBLW .60
SKPZ
RETURN
MOVLW 0
MOVWF DB0
INCF DB1
MOVF DB1,0
SUBLW .60
SKPZ
RETURN
MOVLW
|
MOVWF TRISD
MOVWF TRISB
BANKSEL TMR0
MOVLW TBUF
MOVWF TMR0
BSF INTCON,GIE
BSF INTCON,T0IE
MOVLW .125
MOVWF DCONT
MOVLW H'FF'
MOVWF PORTB
MOVLW 0
MOVWF DB0
MOVWF DB1
MOVWF TIMS
MOVWF TIMM
MLOOP: MOVF TIMS,0
CALL TABLE
MOVWF PORTD
MOVLW H'FE'
MOVWF PORTB
CALL DELAY25
BSF PORTB,0
;
SWAPF TIMS,0
CALL TABLE
MOVWF PORTD
MOVLW H'FD'
MOVWF PORTB
CALL DELAY25
BSF PORTB,1
;
MOVF TIMM,0
CALL TABLE
MOVWF PORTD
MOVLW H'FB'
MOVWF PORTB
CALL DELAY25
BSF PORTB,2
MOVWF DB1
RETURN
;
TEST2: CLRF C1
CLRF C2
MOVF DB0,0
MOVWF TIMS
MOVF DB1,0
MOVWF TIMM
TA: MOVLW .10
SUBWF TIMS,0
SKPC
GOTO TB
MOVWF TIMS
INCF C1
GOTO TA
TB: SWAPF C1,0
IORWF TIMS,0
MOVWF TIMS
TC: MOVLW .10
SUBWF TIMM,0
SKPC
GOTO TD
MOVWF TIMM
INCF C2
GOTO TC
TD: SWAPF C2,0
IORWF TIMM,0
MOVWF TIMM
RETURN
;
#INCLUDE <DELAY25.INC>
;
END
|
|
计时中断 ─ 改写8led22.asm 程序 |
范例一:int4.*
LIST P=16F877,R=DEC
#INCLUDE <P16F877.INC>
;
CBLOCK H'20'
WBAK,SBAK,DCONT,PORT_REG
ENDC
;
ORG 0
NOP
GOTO MAIN
ORG 4
MOVWF WBAK
SWAPF STATUS,0
MOVWF SBAK
MOVLW 6
ADDWF TMR0
DECF DCONT
MOVF DCONT,1
SKPZ
GOTO T2INT
MOVLW 125
MOVWF DCONT
BTFSC PORT_REG,7
GOTO T1INT
MOVLW B'11111110'
MOVWF PORT_REG
GOTO T2INT
T1INT: SETC
RLF PORT_REG,1
T2INT: BCF INTCON,T0IF
SWAPF SBAK,0
MOVWF STATUS
SWAPF WBAK,1
SWAPF WBAK,0
RETFIE
;
MAIN:
BANKSEL OPTION_REG
MOVLW B'00000110' |
MOVWF OPTION_REG
MOVLW 0
MOVWF TRISD
BANKSEL TMR0
MOVLW 6
MOVWF TMR0
BSF INTCON,GIE
BSF INTCON,T0IE
MOVLW 125
MOVWF DCONT
MOVLW B'11111110'
MOVWF PORT_REG
AGAIN: MOVF PORT_REG,0
MOVWF PORTD
GOTO AGAIN
END
※ 移位时间设为1 秒钟 ※ |
|
|