Đấy là chương trình quét 16 phím bấm hiển thị lên LED 7 đoạn các số từ 0 đến 9 và các chữ A,b,C,d,E,F.
Xem hình ở file đính kèm!
Code:
;========================================
;Auhor: NHH
;Date: 02/03/06
;Hardware: PIC16F877A connect PORTB by R220
;========================================
TITLE "Giai ma ban phim dung interrupt RB4...RB7"
PROCESSOR PIC16f877A
INCLUDE<P16f877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _CPD_OFF &_LVP_OFF
;========================================
COUNT EQU 0x20
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving
;=============================================================================
;CHUONG TRINH CHINH
;=============================================================================
ORG 0000h
GOTO MAIN
ORG 0004h
GOTO INTERRUPT
;==============================INTERRUPT PROGRAM===========================
INTERRUPT
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,w ; move pclath register into w register
movwf pclath_temp ; save off contents of PCLATH register
;******************************************************************************
BCF INTCON,RBIF
MOVLW b'00000001'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_1
MOVLW d'0' ;0
CALL TABLE
MOVWF PORTC
retfie
DIS_1
BTFSS PORTB,5
GOTO DIS_2
MOVLW d'1' ;1
CALL TABLE
MOVWF PORTC
retfie
DIS_2
BTFSS PORTB,6
GOTO DIS_3
MOVLW d'2' ;2
CALL TABLE
MOVWF PORTC
retfie
DIS_3
BTFSS PORTB,7
GOTO DIS_4
MOVLW d'3' ;3
CALL TABLE
MOVWF PORTC
retfie
DIS_4
MOVLW b'00000010'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_5
MOVLW d'4' ;4
CALL TABLE
MOVWF PORTC
retfie
DIS_5
BTFSS PORTB,5
GOTO DIS_6
MOVLW d'5' ;5
CALL TABLE
MOVWF PORTC
retfie
DIS_6
BTFSS PORTB,6
GOTO DIS_7
MOVLW d'6' ;6
CALL TABLE
MOVWF PORTC
retfie
DIS_7
BTFSS PORTB,7
GOTO DIS_8
MOVLW d'7' ;7
CALL TABLE
MOVWF PORTC
retfie
DIS_8
MOVLW b'00000100'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_9
MOVLW d'8' ;8
CALL TABLE
MOVWF PORTC
retfie
DIS_9
BTFSS PORTB,5
GOTO DIS_A
MOVLW d'9' ;9
CALL TABLE
MOVWF PORTC
retfie
DIS_A
BTFSS PORTB,6
GOTO DIS_b
MOVLW d'11' ;A
CALL TABLE
MOVWF PORTC
retfie
DIS_b
BTFSS PORTB,7
GOTO DIS_C
MOVLW d'12' ;b
CALL TABLE
MOVWF PORTC
retfie
DIS_C
MOVLW b'00001000'
MOVWF PORTB
BTFSS PORTB,4
GOTO DIS_d
MOVLW d'13' ;C
CALL TABLE
MOVWF PORTC
retfie
DIS_d
BTFSS PORTB,5
GOTO DIS_E
MOVLW d'14' ;d
CALL TABLE
MOVWF PORTC
retfie
DIS_E
BTFSS PORTB,6
GOTO DIS_F
MOVLW d'15' ;E
CALL TABLE
MOVWF PORTC
retfie
DIS_F
BTFSS PORTB,7
GOTO $+4
MOVLW d'16' ;F
CALL TABLE
MOVWF PORTC
retfie
;******************************************************************************
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;============== CHUONG TRINH CHINH===============
MAIN
BCF STATUS,RP1
BSF STATUS,RP0 ; chon BANK 1
MOVLW b'11110000' ;RB0=Input
MOVWF TRISB
CLRF TRISC
BCF STATUS,RP0 ; chon BANK 0
BSF INTCON,GIE
BSF INTCON,RBIE ;cho phep ngat RB4...RB7
MOVLW d'10'
CALL TABLE
MOVWF PORTC
LOOP
MOVLW b'00001111'
MOVWF PORTB
GOTO LOOP
;----------------------------------------------------------
; Bang tra ve Digital tu 0 den 9 va A....F
; Chi so dau truy cap la 0
; Bang o PAGE 0
ORG 0x90
TABLE
;----------------------------------------------------------
ADDWF PCL, F ; bat dau tai 0x80
RETLW b'00111111' ; 0
RETLW b'00000110' ; 1
RETLW b'01011011' ; 2
RETLW b'01001111' ; 3
RETLW b'01100110' ; 4
RETLW b'01101101' ; 5
RETLW b'01111101' ; 6
RETLW b'00000111' ; 7
RETLW b'01111111' ; 8
RETLW b'01101111' ; 9
RETLW b'00000000' ; NODISPLAY
RETLW b'01110111' ; A
RETLW b'01111100' ; B
RETLW b'00111001' ; C
RETLW b'01011110' ; d
RETLW b'01111001' ; E
RETLW b'01110001' ; F
END