Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 136

TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_1

C1
D13
33p
X1 D15
CRYSTAL LED-RED
C2
U1 D14
VCC
13 33
R1 LED-RED
33p
14
OSC1/CLKIN RB0/INT
34
R2
1
OSC2/CLKOUT RB1
35
R3
100 D16
MCLR/Vpp/THV RB2
36
R4
100 LED-RED
RB3/PGM R5
100
R15 2
RA0/AN0 RB4
37 R6
100 D4
10K 3 38 R7 LED-RED
RA1/AN1 RB5 100
4 39 R8
RA2/AN2/VREF- RB6/PGC 100
5 40
6
RA3/AN3/VREF+ RB7/PGD 100 D6
RA4/T0CKI 100 LED-RED
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
8
RC1/T1OSI/CCP2
17
D5
RE0/AN5/RD RC2/CCP1 LED-RED
9 18
RE1/AN6/WR RC3/SCK/SCL
10 23
RE2/AN7/CS RC4/SDI/SDA
24
D7
RC5/SDO LED-RED
25
RC6/TX/CK
26
RC7/RX/DT
LED-RED
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

BÀI 1 : CHƯƠNG TRÌNH MỘT LED SÁNG DỊCH PORTB DÙNG LỆNH XOAY

CÁCH 1:

;==================== BEGIN ====================


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
;====================== =================================
COUNT_H EQU 0X20
COUNT_L EQU 0X21
COUNT_M EQU 0X22

ORG 0x000
GOTO MAIN
ORG 0x0005

MAIN
BANKSEL TRISB
CLRF TRISB
BANKSEL PORTB
LOOP
MOVLW B'10000000'
MOVWF PORTB

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_2 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

clrc
LAP
CALL DELAY
RRF PORTB,1
BTFSS STATUS,0
GOTO LAP
GOTO LOOP
;===========================================

DELAY
MOVLW D'10'
MOVWF COUNT_H
NAPLAI2
MOVLW D'100'
MOVWF COUNT_L
NAPLAI1
MOVLW D'100'
MOVWF COUNT_M
LOOP1
DECFSZ COUNT_M,1
GOTO $-1
DECFSZ COUNT_L,1
GOTO NAPLAI1
DECFSZ COUNT_H,1
GOTO NAPLAI2
RETURN

END
;*****************************************************************

CÁCH 2:

;CHUONG TRINH CHAY LED DON PORTB


;PHUONG PHAP DUNG LENH XOAY TRAI
TITLE "CHUONG TRINH DICH_LED.ASM"
PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC &
_LVP_OFF & _CPD_OFF
;======================================= ==========
COUNT_1 EQU 0X20
COUNT_2 EQU 0X21
;============================= ==================
;CHUONG TRINH CHINH
;========================== ================================

ORG 0x000
GOTO START
;=============================================
START
;================================================
;KHOI TAO PORTB
;===========================================
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_3

BCF STATUS,RP0
;============================================
;VONG LAP CHUONG TRINH
;===========================================
MAIN
MOVLW b'00000001'
MOVWF PORTB
clrc
LOOP
CALL DELAY
RLF PORTB,1
BTFSS STATUS,0
GOTO LOOP
GOTO MAIN
;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1
D2 CLRF COUNT_2
D1 DECFSZ COUNT_2
GOTO D1
DECFSZ COUNT_1
GOTO D1
RETURN

END
;********************************************************************

C1
RP1
33p 10K
X1
CRYSTAL
C2
1

2
3
4
5
6
7
8
9
VCC

VCC
33p

R15 U1
10K
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36 CATOED CHUNG
RB3/PGM
2 37 R15
RA0/AN0 RB4
3 38 A
4
RA1/AN1 RB5
39 B
R11
5
RA2/AN2/VREF- RB6/PGC
40 C
R13
220R
6
RA3/AN3/VREF+ RB7/PGD
D
R12
220R
7
RA4/T0CKI
15 E
R14
220R
RA5/AN4/SS RC0/T1OSO/T1CKI
16 A F
R9
220R
RC1/T1OSI/CCP2
B G
R10
220R
8 17 220R
RE0/AN5/RD RC2/CCP1
9 18 C
RE1/AN6/WR RC3/SCK/SCL 220R
10 23 D
RE2/AN7/CS RC4/SDI/SDA
24 E
RC5/SDO
25 F
RC6/TX/CK
26 G
RC7/RX/DT
R1
19 R2
RD0/PSP0
20 R3
100R
RD1/PSP1
21 R4
100R
RD2/PSP2
22 R5
100R
RD3/PSP3
27 R6
100R
RD4/PSP4
28 R7
100R
RD5/PSP5
29 R8
100R
RD6/PSP6
30 100R
RD7/PSP7
100R
PIC16F877
D8 D3 D1 D2 D12 D11 D9 D10
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_4 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

BÀI 2A : CHƯƠNG TRÌNH ĐIỂU KHIỂN 8 LED ĐƠN NỐI VỚI PORTD, MỘT NÚTNHẤN SW 1 (NỐI VỚI
CHÂN RB1) .(SƠ ĐỒ MẠCH HÌNH TRÊN). KHI SW MỞ THÌ CHẠY CHƯƠNG TRÌNH 1, KHI SW ĐÓNG
CHẠY CHƯƠNG TRÌNH 2. KIỂM TRA SW LIÊN TỤC

TITLE "1 SW_ 2 CHUONG TRINH"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;KHAI BAO BIEN
;--------------------------------------------------------------------------------------------------------------
STATUS EQU 03H
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
counta EQU 0x22
countb EQU 0x23
count1 EQU 0x24
;========================================

ORG 0x000
GOTO START
ORG 0x0005
START
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW b'11111111'
MOVWF TRISB
CLRF TRISD
BCF STATUS,RP0

MAIN
MOVLW b'00000000'
MOVWF PORTD
BTFSC PORTB,1
GOTO CTRINH1
GOTO CTRINH2
;=========================================
CTRINH1
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
LAP BSF STATUS,0
RRF PORTD,1
CALL delay_100ms
BTFSS PORTB,1
GOTO CTRINH2
BTFSS STATUS,0

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_5

GOTO LAP
GOTO CTRINH1
;=====================================
CTRINH2
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
BTFSC PORTB,1 ; KTRA SW MO
GOTO CTRINH1
MOVLW b'00011000'
MOVWF PORTD
CALL delay_100ms
BTFSC PORTB,1 ; KTRA SW MO
GOTO CTRINH1
MOVLW b'00111100'
MOVWF PORTD
CALL delay_100ms
BTFSC PORTB,1 ; KTRA SW MO
GOTO CTRINH1
MOVLW b'01111110'
MOVWF PORTD
CALL delay_100ms
BTFSC PORTB,1 ; KTRA SW MO
GOTO CTRINH1
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
CALL delay_100ms
BTFSC PORTB,1 ; KTRA SW MO
GOTO CTRINH1
GOTO CTRINH2

;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN
;=================================
delay_100ms
MOVLW d'100'
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_6 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

GOTO d2
RETURN

END
;******************************************************

BÀI 2B : MUỖI LẦN NHẤN NÚT Ở CHÂN RB0 THÌ LED SÁNG DỊCH TRÊN PORT D

CÁCH 1:

TITLE "XOAY LED MUOI KHI NHAN NUT.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;-------------------------------------- ------------------------------------------------
;Khai baùo haèng
;----------------------------------- -------------------------------------------------
SW1 EQU 0
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
COUNT_2 EQU 0x21
ORG 0x000
GOTO start
;=====================================
;KHAI BAO PORTB VÀ PORTD
;=====================================
start
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW b'00001111'
MOVWF TRISB
CLRF TRISD
BCF STATUS,RP0
CLRC
MAIN
MOVLW b'00000001'
MOVWF PORTD
clrc
LOOP
BTFSC PORTB,0
GOTO $-1 ;NHAY VE SAU 1 DONG LENH
CALL DELAY
BTFSS PORTB,0
GOTO $-1
CALL DELAY
RLF PORTD,1
BTFSS STATUS,0
GOTO LOOP

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_7

GOTO MAIN
;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN

END

;***************************************************

CÁCH 2:

TITLE "XOAY LED MUOI KHI NHAN NUT.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------- ------------------------------------------------------------
;Khai baùo haèng
;-------------------------- ------------------------------------------------------------------
SW1 EQU 0
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
COUNT_2 EQU 0x21
ORG 0x000
GOTO start
;=====================================
;KHAI BAO PORTB VÀ PORTD
;=====================================
start
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW b'00001111' ; THIET LAP I/O PORTB
MOVWF TRISB
CLRF TRISD ; PORTD OUTPUT
BCF STATUS,RP0
CLRC
MAIN
MOVLW b'10000000'
MOVWF PORTD
clrc
LOOP
C1 BTFSC PORTB,0
GOTO C1 ;NHAY VE SAU 1 DONG LENH

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_8 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

CALL DELAY
C2 BTFSS PORTB,0
GOTO C2
CALL DELAY
RRF PORTD,1 ; XOAY PHAI PORTD 1 LAN
BTFSS STATUS,0 ; KTRA BIT0 = 1 ? Y NHAY MAIN,
; N NHAY LOOP
GOTO LOOP
GOTO MAIN
;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN

END

;********************************************************

BÀI 3A : CHƯƠNG TRÌNH ĐIỂU KHIỂN 8 LED ĐƠN NỐI VỚI PORTD :
KHI NHẤN NÚT SW 1 (NỐI VỚI CHÂN RB1) RESET TẮT 8 LED
KHI NHẤN NÚT SW 2 (NỐI VỚI CHÂN RB2) TĂNG GIÁ TRỊ Ở PORTD,
HIỂN THỊ DƯỚI DẠNG NHỊ PHÂN RA 8 LED ĐƠN.(SƠ ĐỒ MẠCH HÌNH TRÊN)

TITLE "SW.ASM"
PROCESSOR 16F877 ; Define MCU type
__CONFIG 0x3733 ; Set config fuses
; Register Label Equates....................................
PORTB EQU 0x06 ; Port B Data Register
TRISB EQU 0x86
PORTD EQU 0x08 ; Port D Data Register
TRISD EQU 0x88 ; Port B Direction Register
Timer EQU 0x20 ; GPR used as delay counter
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Initialise Port B (Port A defaults to inputs).............
BANKSEL TRISD ; Select bank 1
MOVLW b'00000000' ; Port B Direction Code
MOVWF TRISD ; Load the DDR code into F86
MOVLW b'11111111' ; Port B Direction Code
MOVWF TRISB ; Load the DDR code into F86
BANKSEL PORTD ; Select bank 0
GOTO reset ; Jump to main loop
; 'delay' subroutine ........................................
delay
MOVWF Timer ; Copy W to timer register
down
DECFSZ Timer ; Decrement timer register
GOTO down ; and repeat until zero
RETURN ; Jump back to main program
; Start main loop ...........................................
reset
CLRF PORTD ; Clear LEDs

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_9

start
BTFSS PORTB,1 ; Reset?
GOTO reset ; Yes - clear LEDs
BTFSC PORTB,2 ; Step on?
GOTO start ; No - wait
MOVLW H'FF' ; Delay count literal
CALL delay ; Wait for count
BTFSS PORTB,2 ; Step on?
GOTO start ; Yes – wait
INCF PORTD ; Increment LEDs
GOTO start ; Repeat always
END ; Terminate source code

;***************************************************

BÀI 3B : CHƯƠNG TRÌNH 8 LED SÁNG DỒN Ở PORTB

title "8 LED SANG DON_Port_B.asm"


processor P16f877a
include <P16f877a.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF
&_BODEN_OFF
;==================================================================
;DAT BIEN
;=================================================================
CBLOCK 0x20
COUNT1
COUNTA
COUNTB
M
SCK
SLX
BTG
ENDC
;=====================================================
;KHAI BAO PORTB
;=====================================================
ORG 0x000

BANKSEL TRISB
CLRF TRISB
BANKSEL PORTB
;=====================================
;VONG LAP CHUONG TRINH CHINH
;========================================
MAIN2
CLRF PORTB
CALL DELAY
CLRF M
MOVLW D'8'
MOVWF SCK
X21
MOVF SCK,0
MOVWF SLX
MOVLW H'00'

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_10 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

MOVWF BTG
SETC
X11
RLF BTG
CLRC
MOVF BTG,0
IORWF M,0
MOVWF PORTB
CALL DELAY
DECFSZ SLX
GOTO X11
MOVF PORTB,0
MOVWF M
DECFSZ SCK
GOTO X21
GOTO MAIN2

;========================================
;CHUONG TRINH CON DELAY
;=========================================
DELAY
MOVLW D'225'
MOVWF COUNT1
D1
MOVLW 0xC7
MOVWF COUNTA
MOVLW 0x01
MOVWF COUNTB
DELAY_0
DECFSZ COUNTA,1
GOTO $+2
DECFSZ COUNTB,1
GOTO DELAY_0
DECFSZ COUNT1,1
GOTO D1
RETURN
END

:*************************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_11

R1R2R3R4
10k10k10k10k

U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36
RB3/PGM
2 37
RA0/AN0 RB4
3 38
4
RA1/AN1 RB5
39 D4
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
6
7
RA4/T0CKI
15 D6
RA5/AN4/SS RC0/T1OSO/T1CKI LED-RED
16
RC1/T1OSI/CCP2
8 17
9
RE0/AN5/RD RC2/CCP1
18
D5
RE1/AN6/WR RC3/SCK/SCL LED-RED
10 23
RE2/AN7/CS RC4/SDI/SDA
24
RC5/SDO
25
D7
RC6/TX/CK LED-RED
26
RC7/RX/DT
19 LED-RED
RD0/PSP0
20 U2
RD1/PSP1
21 7 13 QA
RD2/PSP2 A QA
22 1 12 QB
RD3/PSP3 B QB
27 2 11 QC
RD4/PSP4 C QC
28 6 10 QD
RD5/PSP5 D QD
29 9 QE
RD6/PSP6 QE
30 3 15 QF
RD7/PSP7 LT QF
4 14 QG
BI QG
PIC16F877 5
LE/STB
4511

BÀI 4 : CHƯƠNG TRÌNH MỖI LẦN NHẤN NÚT Ở PORTB BIT RB0, TĂNG BIẾN ĐẾM TỪ 0  9 VÀ
HIỂN THỊ RA LED 7 ĐOẠN NỐI VỚI PORTD QUA IC4511

TITLE "HT LED 7 DOAN.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;Khai bao hang
;--------------------------------------------------------------------------------------------------------------
SW1 EQU 0
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
COUNT_2 EQU 0x21

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_12 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

DEM EQU 22H


ORG 0x000
GOTO START
;=====================================
;KHAI BAO PORTB VÀ PORTD
;=====================================
START
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW b'00001111' ; THIET LAP I/O PORTB
MOVWF TRISB
CLRF TRISD ; PORTD OUTPUT
BCF STATUS,RP0
;===========================
MAIN
MOVLW 0x00
MOVWF DEM
LOOP
MOVF DEM,0
MOVWF PORTD
C1 BTFSC PORTB,0
GOTO C1 ;NHAY VE SAU 1 DONG LENH
CALL DELAY
C2 BTFSS PORTB,0
GOTO C2
CALL DELAY
INCF DEM,1
MOVF DEM,0
XORLW D'10'
BTFSS STATUS,Z ; KTRA DEM = 10 ?
; Y NHAY MAIN, N NHAY LOOP
GOTO LOOP
GOTO MAIN
;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN

END

;****************************************************

BÀI 5 : CHƯƠNG TRÌNH MỖI LẦN NHẤN NÚT Ở PORTB BIT RB0, GIẢM BIẾN ĐẾM TỪ 9  0 VÀ
HIỂN THỊ RA LED 7 ĐOẠN NỐI VỚI PORTD

TITLE "HT LED 7 DOAN.ASM"


processor p16f877a

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_13

include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;Khai bao hang
;--------------------------------------------------------------------------------------------------------------
SW1 EQU 0
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
COUNT_2 EQU 0x21
DEM EQU 22H

ORG 0x000
GOTO START
;=====================================
;KHAI BAO PORTB VÀ PORTD
;=====================================
START
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW b'00001111' ; THIET LAP I/O PORTB
MOVWF TRISB
CLRF TRISD ; PORTD OUTPUT
BCF STATUS,RP0
;===========================
MAIN
MOVLW D'9'
MOVWF DEM
LOOP
MOVF DEM,0
MOVWF PORTD
C1 BTFSC PORTB,0
GOTO C1 ;NHAY VE SAU 1 DONG LENH
CALL DELAY
C2 BTFSS PORTB,0
GOTO C2
CALL DELAY
MOVF DEM,0
XORLW D’0’
BTFSS STATUS,Z
GOTO GIAM_DEM
GOTO MAIN
GIAM_DEM
DECFSZ DEM,1
NOP
GOTO LOOP

;=============================================
;CHUONG TRINH DELAY
;===========================================

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_14 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN

END

;***************************************************

BÀI 6: CHƯƠNG TRÌNH NGẮT NGOÀI INT (RB0) TĂNG BIẾN ĐẾM TỪ 0  9 HIỂN THỊ RA LED 7
ĐOẠN (LED 7 DOẠN NỐI VỚI PORTA QUA IC4511)

CÁCH 1:

TITLE "NGAT TANG DEM.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;Khai bao hang
;--------------------------------------------------------------------------------------------------------------
SW1 EQU 0
STATUS EQU 0x03
PORTB EQU 0x06
TRISB EQU 0x86
PORTD EQU 0x08
TRISD EQU 0x88
COUNT_1 EQU 0x20
COUNT_2 EQU 0x21
DEM EQU 0x22
;=============================
ORG 0x000
GOTO INIT
;=====================================
;CHUONG TRINH NGAT
;=====================================
ORG 0x04 ; VECTO NGAT NGOAI RB0
INCF DEM,1 ;TANG DEM LEN 1
MOVF DEM,0 ; CHO DEM VAO THANH GHI F
XORLW D'10' ; SO SANH VỚI 10
BTFSS STATUS,Z ; KTRA DEM = 10 ?
; Y NHAY MAIN, N NHAY LOOP
GOTO EXIT
MOVLW D'0' ;W=0
MOVWF DEM ; DEM = W = 0
EXIT
BCF INTCON,1 ;XOA CO NGAT INTF
RETFIE
;==================================================
;KHAI BAO NGAT
;=================================================
INIT
BSF INTCON,7 ;CHO PHEP NGAT TOAN CUC

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_15

BSF INTCON,4 ;CHO PHEP NGAT NGOAI RB0 INT


BCF INTCON,1 ; XOA CO NGAT INTF
;=====================================================
;KHAI BAO PORT I/O
;====================================================
BSF STATUS,5 ; CHON BANK1
CLRF PORTA
CLRF PORTB
MOVLW b'00001111'
MOVWF TRISB ; THIẾT LẬP I/O PORTB
CLRF TRISA ; PORTA LA OUTPUT
MOVLW D'0'
MOVWF DEM
BCF STATUS,5 ; VE BANK0
;=============================
;CHUONG TRINH CHINH
;===========================
MAIN
MOVF DEM,0
MOVWF PORTA
GOTO MAIN
;==============================
;CHUONG TRINH DELAY
;==============================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN

END

;*****************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_16 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

CAT CHUNG
U2
RA0 7 13
A QA
RA1 1 12
B QB
RA2 2 11
C QC
RA3 6 10
D QD
9
QE
3 15
LT QF
4 14
BI QG
5

VCC
LE/STB
4511
R1R2R3R4

RC4
RC5
RC6
RC7
QG
QC
QD
QA
QB

QE
QF
10k10k10k10k

VCC

QG
QC
QD
QA
QB

QE
QF
13
12
11
10

15
14
9
U1 U3

QG
QC
QD

QF
QA
QB

QE
13 33 4511
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36 D4
RB3/PGM R5

LE/STB
RA0 2 37
RA1
RA0/AN0 RB4 R6
3 38 R7
100 D6

LT
RA1/AN1 RB5

BI
C
D
A
B
RA2
RA3
4
RA2/AN2/VREF- RB6/PGC
39 R8
100 LED-RED
5 40 100
RA3/AN3/VREF+ RB7/PGD
RA4

7
1
2
6

3
4
5
6
RA5 7
RA4/T0CKI
15 RC0
100 D5
RA5/AN4/SS RC0/T1OSO/T1CKI LED-RED
16 RC1
RC1/T1OSI/CCP2
8 17 RC2
9
RE0/AN5/RD RC2/CCP1
18 RC3 D7
RE1/AN6/WR RC3/SCK/SCL LED-RED
10 23 RC4
RE2/AN7/CS RC4/SDI/SDA
24 RC5

RC0
RC1
RC2
RC3
RC5/SDO VCC
25 RC6 LED-RED
RC6/TX/CK
26 RC7
RC7/RX/DT
R9
RD0/PSP0
19 R10
RD1/PSP1
20 R11
100
RD2/PSP2
21 R12
100
22 R13
100
RD3/PSP3
27 R14
100
RD4/PSP4
28 R15
100
RD5/PSP5
29 R16
RD6/PSP6 100
30 100
RD7/PSP7
100
PIC16F877
D1 D2 D3 D8 D9 D10 D11 D12
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED

CÁCH 2:

TITLE "NGAT TANG DEM.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;Khai bao hang
;--------------------------------------------------------------------------------------------------------------
SW1 EQU 0
STATUS EQU 0x03
PORTB EQU 0x06
TRISB EQU 0x86
PORTD EQU 0x08
TRISD EQU 0x88
COUNT_1 EQU 0x20
COUNT_2 EQU 0x21
DEM EQU 0x0C
TEMP EQU 0x0D
;=============================
ORG 0x000
GOTO INIT

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_17

;=====================================
;CHUONG TRINH NGAT
;=====================================
ORG 0x04 ; VECTO NGAT NGOAI RB0
MOVWF TEMP
INCF DEM,1
MOVLW 0x0A
SUBWF DEM,0
BTFSS STATUS,0 ; <=> BTFSS STATUS,Z
GOTO CARRY_ON
GOTO CLEAR

CARRY_ON
BCF INTCON,1
MOVFW TEMP
RETFIE
CLEAR
CLRF DEM
BCF INTCON,1
RETFIE
;==================================================
;KHAI BAO NGAT
;=================================================
INIT
BSF INTCON,7 ;CHO PHEP NGAT TOAN CUC
BSF INTCON,4 ;CHO PHEP NGAT NGOAI RB0 INT
BCF INTCON,1 ; XOA CO NGAT INTF
;====================================================
;KHAI BAO PORT I/O
;====================================================
BSF STATUS,5 ; CHON BANK1
CLRF PORTA
CLRF PORTB
MOVLW b'00001111'
MOVWF TRISB ;
CLRF TRISA ; PORTA LA OUTPUT
MOVLW D'0'
MOVWF DEM
BCF STATUS,5 ; VE BANK0
;=============================
;CHUONG TRINH CHINH
;===========================
MAIN
MOVF DEM,0 ; CHO DEM VAO W
MOVWF PORTA ; CHO PORTA = W
GOTO MAIN
;==============================
;CHUONG TRINH DELAY
;==============================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_18 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

END

;*********************************************************

BÀI 7: CHƯƠNG TRÌNH NGẮT NGOÀI INT (RB0) GIẢM ĐẾM TỪ 9  0 HIỂN THỊ RA LED 7 ĐOẠN

CÁCH 1: CHƯƠNG TRÌNH NGẮT NGOÀI INT (RB0) GIẢM ĐẾM TỪ 9  0 HIỂN THỊ RA LED 7
ĐOẠN (LED 7 DOẠN NỐI VỚI PORTD QUA IC4511)

TITLE "NGAT GIAM DEM 1.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF
& _LVP_OFF & _CPD_OFF
;----------------------------------------------------
;Khai bao hang
;------------------------------------------

STATUS EQU 0x03


PORTB EQU 0x06
TRISB EQU 0x86
PORTD EQU 0x08
TRISD EQU 0x88
COUNT_1 EQU 0x20
COUNT_2 EQU 0x21
DEM EQU 0x0C
OPTION_REG EQU 0x81
;===========================
ORG 0x000
GOTO INIT
;=====================================
;CHUONG TRINH NGAT
;=====================================
ORG 0x04 ; VECTO NGAT NGOAI RB0
MOVF DEM,0
XORLW D'0'
BTFSS STATUS,Z
GOTO EXIT
MOVLW D'9'
MOVWF DEM
GOTO EXIT2
EXIT
DECF DEM,1
EXIT2
BCF INTCON,1 ;XOA CO NGAT
RETFIE
;==================================================
;KHAI BAO NGAT
;=================================================
INIT
BSF INTCON,7 ;CHO PHEP NGAT TOAN CUC
BSF INTCON,4 ;CHO PHEP NGAT NGOAI RB0 INT
BCF OPTION_REG,6 ; CHO PHEP TAC DONG CANH LEN
BSF OPTION_REG,7
BCF INTCON,1 ; XOA CO NGAT INTF
;=====================================================

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_19

;KHAI BAO PORT I/O


;====================================================
BSF STATUS,5 ; CHON BANK1
CLRF PORTD
CLRF PORTB
MOVLW b'00001111'
MOVWF TRISB
CLRF TRISD ; PORTD LA OUTPUT
BCF STATUS,5 ; VE BANK0
MOVLW D'9'
MOVWF DEM
;=============================
;CHUONG TRINH CHINH
;===========================
MAIN
MOVF DEM,0
MOVWF PORTD
GOTO MAIN
;==============================
;CHUONG TRINH DELAY
;==============================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1

RETURN

END

;*****************************************************
CÁCH 2: NGẮT NGOÀI RB0 GIẢM DẾM TỪ 9 VỀ 0 DÙNG PHƯƠNG PHÁP TRA BẢNG (LED 7 ĐOẠN
DÙNG LOẠI CATOT CHUNG) NỐI Ở PORTC

TITLE "NGAT_RB0 GIAM DEM TRA BANG.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &_HS_OSC & _LVP_OFF
;-----------------------------------------------------------------------------------
;Khai bao hang va cac bien
STATUS EQU 0x03
PORTB EQU 0x06
TRISB EQU 0x86
PORTC EQU 0x07
TRISC EQU 0x87
PORTD EQU 0x08
TRISD EQU 0x88
DEM EQU 0x20
COUNT3 EQU 0x21
;=============================
ORG 0x000
GOTO INIT
;=====================================
;CHUONG TRINH NGAT
;=====================================

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_20 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

ORG 0x004 ; VECTO NGAT NGOAI RB0


MOVF DEM,0
XORLW D'0'
BTFSS STATUS,Z
GOTO EXIT
MOVLW D'9'
MOVWF DEM
GOTO EXIT2
EXIT
DECF DEM,1
EXIT2
BCF INTCON,1 ;XOA CO NGAT
RETFIE

;==================================================
;KHAI BAO NGAT
;=================================================
ORG 0x050
INIT
BSF INTCON,7 ;CHO PHEP NGAT TOAN CUC
BSF INTCON,4 ;CHO PHEP NGAT NGOAI RB0 INT
BCF INTCON,1 ; XOA CO NGAT INTF
;=====================================================
;KHAI BAO PORT I/O
;====================================================
BSF STATUS,5 ; CHON BANK1
CLRF PORTC
MOVLW b'00001111'
MOVWF TRISB ; CHAN RB0 VA RB1 INPUT, CON LAI LA OUTPUT
CLRF TRISC ; PORTA LA OUTPUT
BCF STATUS,5 ; VE BANK0
MOVLW D'9'
MOVWF DEM
;===========================
;CHUONG TRINH LAP VONG

;===============================
MAIN
CALL TABLE
MOVWF PORTC
CALL DELAY
GOTO MAIN

;======================================
;CHUONG TRINH DELAY
;===========================================
DELAY
MOVLW 0xFF
MOVWF COUNT3
D2
DECFSZ COUNT3
GOTO D2
RETURN
;======================================
TABLE
MOVF DEM,W

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_21

ADDWF PCL,1
DT 0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,
0xFA,0x0E,0xFE,0xDE,0xEE,0xF8,0x72,0xBC,0xF2,0xE2
;==========================================================================

TABLE1
MOVF DEM,W ; Get key count
ADDWF PCL ; and calculate jump
NOP ; into table
RETLW B'01111110' ; Code for '0' 7EH
RETLW B'00001100' ; Code for '1' 0CH
RETLW B'10110110' ; Code for '2' B6H
RETLW B'10011110' ; Code for '3' 9EH
RETLW B'11001100' ; Code for '4' CCH
RETLW B'11011010' ; Code for '5' DAH
RETLW B'11111010' ; Code for '6' FAH
RETLW B'00001110' ; Code for '7' 0EH
RETLW B'11111110' ; Code for '8' FEH
RETLW B'11011110' ; Code for '9' DEH
RETLW B'11101110' ; Code for 'A' EEH
RETLW B'11111000' ; Code for 'B' F8H
RETLW B'01110010' ; Code for 'C' 72H
RETLW B'10111100' ; Code for 'D' BCH
RETLW B'11110010' ; Code for 'E' F2H
RETLW B'11100010' ; Code for 'F' E2H
END
;*******************************************************************
BÀI 8: CHƯƠNG TRÌNH MỘT LED SÁNG DỊCH Ở PORTB DÙNG TIMER1 LÀM DELAY

;=============khoi tao chuong trinh=====================

TITLE "DELAY DUNG TIMER1.ASM"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
&_LVP_OFF &_CPD_OFF &_BODEN_OFF
;============phan dat bien=============================

;===========Phan chuong trình chính======================


ORG 0x00
GOTO MAIN
ORG 0x0005
MAIN
;===========PHAN KHAI BAO TIMER ==================
BANKSEL TRISB
CLRF TRISB
BANKSEL PORTB
MOVLW 0X30 ;PRESCALES 1:8
;KO CHO TIMER 1 HOAT DONG TMR1ON=0
;CHE DO TIMER TMR1CS=0
;KO CHO BO DAO DONG HOAT DONG
; T1CSCEN=0
MOVWF T1CON
CLRF PORTB ; XÓA PORTB
;======================================================

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_22 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

START
MOVLW B'10000000'
MOVWF PORTB
CLRC
LOOP
CALL DELAY
RRF PORTB,1
BTFSS STATUS,0
GOTO LOOP
GOTO START

;============CHUONG TRINH CON DELAY==========


DELAY
BSF T1CON,TMR1ON ; CHO TIMER CHAY
BTFSS PIR1,TMR1IF ; KIEM TRA CO TRAN
GOTO $-1
BCF PIR1,TMR1IF ; XOA CO TRAN
RETURN
;==============================================

END

;***********************************************************

BÀI 9 : CHƯƠNG TRÌNH NGẮT TIMER0 TĂNG BIẾN ĐẾM TỪ 0  9 HIỂN THỊ RA LED 7 ĐOẠN Ở
PORTA.

;------------chuong trinh ngat timer0 tang bien dem tu 0 den 9 -----------------


title "ngat timer0.asm"
processor P16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF &
_LVP_OFF & _CPD_OFF
; ------------------------------------------------------------------
; Khai bao bien
;--------------------------------------------------------------------
count1 EQU 0x20
counta EQU 0x21
countb EQU 0x22
DEM EQU 0x23
DEM1 EQU 0x24
W_save EQU 0x25
PCLATH_save EQU 0x26
STATUS_save EQU 0x27
FSR_save EQU 0x28

;------------------------------------------------------------
ORG 0x000
GOTO INIT

;-------------------bat dau chuong trinh ngat timer0----------------------


ORG 0x0004
GOTO ISR

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_23

;-------------------------------------------------------------------------------------------------------------
; CHUONG TRINH NGAT
;-------------------------------------------------------------------------------------------------------------
ISR
;------------------------------------------------------------------------------------------------------------
; doan chuong trinh bat buoc khi bat dau chuong trinh ngat
;------------------------------------------------------------------------------------------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
BTFSS INTCON,TMR0IF ; kiem tra co ngat timer0
GOTO exit_int
BCF INTCON,TMR0IF ; xoa co ngat timer0
;-----------nhiem vu khi ngat ------------------------------
INCF DEM1,1
MOVLW D'200'
XORWF DEM1,0
BTFSS STATUS,Z
GOTO exit_int
CLRF DEM1
INCF DEM,1
MOVLW 0x0A
XORWF DEM,0
BTFSS STATUS,Z
GOTO exit_int
CLRF DEM

;------- thoat ngat -----------------------------


exit_int
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;--------------------------------
INIT
;----------------------------------------
; KHAI BAO Timer0
;----------------------------------------
CLRF TMR0 ; xoa thanh ghi TMR0
CLRF INTCON ; xoa thanh ghi INTCON
BSF STATUS,RP0
MOVLW b'10000001'
MOVWF OPTION_REG
BCF STATUS,RP0 ; chon BANK0
BSF INTCON,TMR0IE ; cho phep ngat Timer0

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_24 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

BSF INTCON,PEIE ; cho phep ngat ngoai vi


BSF INTCON,GIE ; cho phep ngat toan bo cac ngat
;----------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0 ; BANK1
MOVLW 0x00
MOVWF TRISA ; PORTD <- output
CLRF DEM
CLRF DEM1
BCF STATUS,RP0 ;
;----------------------------------------------
main
MOVF DEM,0
MOVWF PORTA
GOTO main
;=======chuong trinh delay 1ms =====================
delay_1ms
MOVLW d'1'
MOVWF count1
d2 MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN

END
;**************************************************

BÀI 10 : CHƯƠNG TRÌNH ĐIỀU KHIỂN 8 LED ĐƠN NỐI VỚI PORTB, BAN ĐẦU 8 LED SÁNG, TẮT DẦN
TỪ TRÁI SANG PHẢI, RỒI LẠI SÁNG TỪ PHẢI SANG TRÁI.

TITLE "CHUONG TRINH DICH_LED.ASM"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC &
_LVP_OFF & _CPD_OFF
;======================== ====================================
BIEN0 EQU 0X30
BIEN1 EQU 0X31
PORTB EQU 0X06
TRISB EQU 0X86
STATUS EQU 0x03
;===================== =========================
;CHUONG TRINH CHINH
;==================== ==============================

ORG 0x000
GOTO MAIN
ORG 0x008

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_25

;=============================================
MAIN
;===================================
;KHOI TAO PORTB
;===========================================
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP1
BCF STATUS,RP0
MOVLW H'FF'
MOVWF PORTB
;============================================
;VONG LAP CHUONG TRINH
;===========================================
START
MOVLW H'FF'
MOVWF PORTB
CALL WAIT
AAA
BCF STATUS,0 ;<=> CLRC
RLF PORTB,1
CALL WAIT
BTFSC PORTB,7
GOTO AAA
;=============================================
BBB
BSF STATUS,0 ;<=> CLRC
RRF PORTB,1
CALL WAIT
BTFSS PORTB,0
GOTO BBB
GOTO AAA
;=============================================
;CHUONG TRINH DELAY
;===========================================
WAIT
MOVLW H'FF'
MOVWF BIEN1
DEL1 CALL DELAY
DECFSZ BIEN1,1
GOTO DEL1
RETURN
DELAY
CLRF BIEN0
DEL DECFSZ BIEN0,1
GOTO DEL
RETURN

END
;********************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_26 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

BÀI 11 : CHƯƠNG TRÌNH HIỂN THỊ TĂNG DẦN TỪ 0 ĐẾN 9999 RA 4 LED 7 ĐOẠN NỐI VỚI PORTB
(DỮU LIỆU) VÀ PORTA (ĐIỀU KHIỂN LED SÁNG)

CATOT CHUNG

C1

33p

X1
CRYSTAL
C2

VCC
33p

VCC Q1
U1 R3 2N2222
13 33 R4
OSC1/CLKIN RB0/INT
R1 14
OSC2/CLKOUT RB1
34 R5
330R
10k 1 35 R6
MCLR/Vpp/THV RB2
36
330R Q2
RB3/PGM R7
330R
2N2222
2 37 R8
RESET 3
RA0/AN0 RB4
38
330R
RA1/AN1 RB5 R9
330R
4 39 330R
RA2/AN2/VREF- RB6/PGC
5 40 330R
RA3/AN3/VREF+ RB7/PGD
6 R10
RA4/T0CKI
7 15 R11
RA5/AN4/SS RC0/T1OSO/T1CKI
16 Q3
RC1/T1OSI/CCP2 R2
1k
2N2222
8 17 R12
1k
RE0/AN5/RD RC2/CCP1
9 18 1k
RE1/AN6/WR RC3/SCK/SCL
10 23 1k
RE2/AN7/CS RC4/SDI/SDA
24
RC5/SDO
25 Q4
RC6/TX/CK 2N2222
26
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

TITLE "TANG TU 0 DEN 9999.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &_HS_OSC & _LVP_OFF
;-----------------------------------------------------------------------------------
;Khai bao hang va cac bien
;-------------------------------------------------------------------------------
PORTB EQU 06H
TRISB EQU 86H
PORTC EQU 07H
TRISC EQU 87H
CBLOCK 0x020
COUNT1
COUNT2
COUNT3
NGHIN
TRAM
CHUC
DVI
BIEN1
BIEN2
BIEN3
BIEN4
count1
counta
countb
ENDC
;==========================
ORG 0x000

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_27

CLRF STATUS
MOVLW 0x00
MOVWF PCLATH
GOTO START
;==========================
;KHAI BAO PORTB VÀ PORTD
;==========================
START
ORG 0x005
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTB
CLRF PORTC
BSF STATUS,RP0
CLRF TRISB
CLRF TRISC
BCF STATUS,RP0
;===========================
;CHUONG TRINH LAP VONG
;===========================
X5
MOVLW D'0'
MOVWF NGHIN
X4
MOVLW D'0'
MOVWF TRAM
X3
MOVLW D'0'
MOVWF CHUC
X1
MOVLW D'0'
MOVWF DVI
X2
CALL BCD_7DOAN
CALL DELAY_HIENTHI
INCF DVI
MOVF DVI,0
XORLW D'10'
BTFSS STATUS,Z
GOTO X2
INCF CHUC
MOVF CHUC,0
XORLW D'10'
BTFSS STATUS,Z
GOTO X1
INCF TRAM
MOVF TRAM,0
XORLW D'10'
BTFSS STATUS,Z
GOTO X3
INCF NGHIN
MOVF NGHIN,0
XORLW D'10'
BTFSS STATUS,Z
GOTO X4
GOTO X5

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_28 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;===============================
BCD_7DOAN

MOVF DVI,0
CALL TABLE
MOVWF BIEN1
MOVF CHUC,0
CALL TABLE
MOVWF BIEN2
MOVF TRAM,0
CALL TABLE
MOVWF BIEN3
MOVF NGHIN,0
CALL TABLE
MOVWF BIEN4
RETURN
;==============================
DELAY_HIENTHI

MOVLW D'2'
MOVWF COUNT1
DEL1
MOVLW D'10'
MOVWF COUNT2
DEL2
CALL HIENTHI
DECFSZ COUNT2
GOTO DEL2
DECFSZ COUNT1
GOTO DEL1
RETURN
;===============================
HIENTHI
MOVF BIEN1,0
MOVWF PORTB
MOVLW B'00000001'
MOVWF PORTC
CALL delay_10ms
MOVF BIEN2,0
MOVWF PORTB
MOVLW B'00000010'
MOVWF PORTC
CALL delay_10ms
MOVF BIEN3,0
MOVWF PORTB
MOVLW B'000000100'
MOVWF PORTC
CALL delay_10ms
MOVF BIEN4,0
MOVWF PORTB
MOVLW B'00001000'
MOVWF PORTC
CALL delay_10ms
RETURN
;======================================
;CHUONG TRINH DELAY

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_29

;===========================================

DELAY
MOVLW D'10'
MOVWF COUNT3
D1 DECFSZ COUNT3
GOTO D1
RETURN
;======================================
delay_10ms
MOVLW d'4'
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
;=========================================================
TABLE ADDWF PCL,1
DT 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90

END
;*******************************************************

BÀI 12 : CHƯƠNG TRÌNH NGẮT TIMER0 LÀM SÁNG TẮT LED Ở CHÂN RB0 (PORTB,0)

;=============khoi tao chuong trinh=====================

TITLE " ngat timer0 _ nhap nhay RB0"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
&_LVP_OFF &_CPD_OFF &_BODEN_OFF
;============phan dat bien=============================
W_save EQU 0x25
PCLATH_save EQU 0x26
STATUS_save EQU 0x27
FSR_save EQU 0x28
;===========Phan chuong trình chính======================
ORG 0x00
GOTO INIT
ORG 0X04
GOTO NGAT_TIMER1
ORG 0x0005
;=================================
INIT
;----------------------------------------
; Khoi tao Timer0

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_30 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;----------------------------------------
CLRF TMR0 ; xoa thanh ghi TMR0
CLRF INTCON ; xoa thanh ghi INTCON
BSF STATUS,RP0 ; chon BANK0
BCF STATUS,RP01
MOVLW b'10000001' ; tat chuc nang dien tro keo len PORTB,
MOVWF OPTION_REG
CLRF TRISB
BCF STATUS,RP0 ; chon BANK0
BSF INTCON,TMR0IE ; cho phep ngat Timer0
BSF INTCON,PEIE ; cho phep ngat ngoai vi
BSF INTCON,GIE ; cho phep ngat toan cuc
CLRF PORTB
MAIN
GOTO $ ; cho ngat o day
;=============================================
NGAT_TIMER1
;--------------phan bat buoc ---------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
;--------------------------------
BTFSS INTCON,TMR0IF
GOTO THOAT_NGAT ;
BCF INTCON,TMR0IF
BTFSS PORTB,0
GOTO SET_RB0
CLR_RB0
BCF PORTB,0
GOTO THOAT_NGAT
SET_RB0
BSF PORTB,0
THOAT_NGAT
;------------phan bat buoc-------------
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;===============================================

END

;*********************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_31

BÀI 13 : CHƯƠNG TRÌNH NGẮT TIMER2 TĂNG GIÁ TRỊ BIẾN ĐẾM HIỂN THỊ RA LED 7 ĐOẠN TỪ 0
 9 Ở PORTA

; chuong trinh ngat cua timer2


;------------------------------------------------------------------------------------------------------------
; Khai bao chip
;-----------------------------------------------------------------------------------
Title "ngat timer.asm"
processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF &
_LVP_OFF & _CPD_OFF
; -----------------------------------------------------------------------------------------------------------
; Khai baùo bieán
;------------------------------------------------------------------------------------------------------------
DEM EQU 0x20
W_save EQU 0x25
PCLATH_save EQU 0x26
STATUS_save EQU 0x27
FSR_save EQU 0x28
;===================================
ORG 0x0004
GOTO ISR
;-------------------------------------------------------------------------------------------------------------
; CHUONG TRINH NGAT
;-------------------------------------------------------------------------------------------------------------
ISR
;------------------------------------------------------------------------------------------------------------
; doan chuong trinh bat buoc khi bat dau chuong trinh ngat
;------------------------------------------------------------------------------------------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
;-------------------------------------------------------------------------------------------------------------
; Cac thao tac chinh cua chuong trinh ngat
;-------------------------------------------------------------------------------------------------------------
BTFSS PIR1,TMR2IF
GOTO THOAT_NGAT
BCF PIR1,TMR2IF
INCF DEM
MOVLW 0x0A
XORWF DEM,0
BTFSS STATUS,Z
GOTO THOAT_NGAT
CLRF DEM

;---------------------------------------------------------------------------------------------------------------
THOAT_NGAT

MOVF FSR_save,W

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_32 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;----------------------------------------------------------------------------------------------------------------
; Ket thuc chuong trinh ngat
;----------------------------------------------------------------------------------------------------------------
ORG 0x000
GOTO start
ORG 0x050
;----------------------------------------------------------------------------------------------------------------
; Bat dau chuong trình chính
;----------------------------------------------------------------------------------------------------------------
start
;---------------------------------------------
; Khai bao cac PORT
;---------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x00
MOVWF TRISA
BCF STATUS,RP0

;----------------------------------------
; KHAI BAO Timer2
;----------------------------------------
MOVLW b'11111111' ; postscaler 1:16, prescaler 1:16, Timer2 ON
MOVWF T2CON
BSF STATUS,RP0
MOVLW .249 ; dat truoc gia tri can so sanh thanh ghi TMR2
MOVWF PR2 ; vao thanh ghi PR2
BSF PIE1,TMR2IE ; cho phep ngat Timer2
BCF STATUS,RP0
BSF INTCON,PEIE ; cho phep ngat ngoai vi
BSF INTCON,GIE ; cho cho phep ngat toan cuc
;----------------------------------------------
; Khoi tao cac bien
;----------------------------------------------
CLRF DEM
;----------------------------------------------
; VONG LAP CHING
;----------------------------------------------
MAIN
MOVF DEM,0
MOVWF PORTA
GOTO MAIN
;------------------------------------------------------------------------
END

;********************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_33

BÀI 14 : CHƯƠNG TRÌNH NGẮT TIMER1 TĂNG GIÁ TRỊ BIẾN ĐẾM HIỂN THỊ RA LED 7 ĐOẠN TỪ 0
 9 Ở PORTA

;=============khoi tao chuong trinh=====================

TITLE " ngat timer1.asm"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF
&_BODEN_OFF
;============phan dat bien=============================
DEM EQU 0x20
W_save EQU 0x34 ; Cac thanh ghi dung de luu lai gia
PCLATH_save EQU 0x35 ; tri cac thanh ghi quan trong khi
STATUS_save EQU 0x36 ; thuc thi chuong trình ngat
FSR_save EQU 0x37

ORG 0x0004
GOTO ISR

;-----------------------------------------------------------------------------
; Chuong trinh ngat
;-----------------------------------------------------------------------------
ISR
;---------------------------------------------------------------------------
; doan chuong trinh bat buoc khi bat dau chuong trinh ngat
;--------------------------------------------------------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
;--------------------------------------------------------------------------------
; Kiem tra co ngat
;--------------------------------------------------------------------------------
BTFSS PIR1,TMR1IF ; kiem tra co ngat timer1
GOTO EXIT_INT
BCF T1CON,TMR1ON ; tam thoi tat timer1 de khoi tao lai
;--------------------------------------------------------------------------------
; cac thao tac chinh cua chuong trinh ngat
;--------------------------------------------------------------------------------
CLRF TMR1L ; khoi tao cac gia tri chua trong thanh
CLRF TMR1H ; ghi TMRH va TMRL
MOVLW 0x61 ; nap gia tri vao cac thanh ghi dem cua Timer1
MOVWF TMR1H ; gia tri 25000 (25000 -> 61A8h)
MOVLW 0xA8 ; Note “gia tri nay cang nho, time ngat cang cham”.
MOVWF TMR1L
BSF T1CON,TMR1ON ; Bat Timer1
BCF PIR1,TMR1IF ; xoa co ngat

INCF DEM
MOVLW d'10'

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_34 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

XORWF DEM,0
BTFSS STATUS,Z
GOTO EXIT_INT
CLRF DEM

;----------------------------------------------------------------------------------------------------------------
; DOAN CHUUONG TRINH BAT BUOC KHI KE THUC CHUONG TRINH NGAT
;----------------------------------------------------------------------------------------------------------------
EXIT_INT

MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;---------------------------
ORG 0x0000
GOTO START
ORG 0x050
;---------------------------------------------------------------------------------------------------
; Chuong trình chính
;---------------------------------------------------------------------------------------------------
START
;---------------------------------------------------------------
; khoi tao cac port dieu khien
;---------------------------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x00 ; PORTA <-output
MOVWF TRISA
BCF STATUS,RP0

;-----------------------------------------------------------------
; Khoi tao Timer1
;-----------------------------------------------------------------
CLRF T1CON
CLRF INTCON
CLRF TMR1H
CLRF TMR1L
BSF STATUS,RP0 ; Chon BANK1
CLRF PIE1
BSF PIE1,TMR1IE ; Cho phep ngat Timer1
BCF STATUS,RP0 ; ChoN BANK0
CLRF PIR1 ; xoa tat ca cac co ngat
MOVLW 0X30 ; prescaler 1:8, xung dem la xung lenh, tam thoi
MOVWF T1CON ; tat Timer1

MOVLW 0x61 ; Khoi tao gia tri trong thanh ghi TMR1H
MOVWF TMR1H ; vao TMR1L (TMR1H:TMR1L = 25000)
MOVLW 0xA8
MOVWF TMR1L
BSF T1CON,TMR1ON ; Bat Timer1

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_35

BSF INTCON,TMR1IE ; Cho phep ngat Timer1


BSF INTCON,PEIE ; Cho phep ngat ngoai vi
BSF INTCON,GIE ; Cho phep ngat toan cuc
;====================================================
CLRF DEM
MAIN
MOVF DEM,0
MOVWF PORTA
GOTO MAIN
;=================================
END

;***************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_36 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

U1 CATOED CHUNG
13 33 R4
OSC1/CLKIN RB0/INT
14 34 A
1
OSC2/CLKOUT RB1
35 B
R5
MCLR/Vpp/THV RB2
36 C
R6
220R VCC
2
RB3/PGM
37 D
R7
220R
3
RA0/AN0 RB4
38 E
R8
220R
4
RA1/AN1 RB5
39 F
R9
220R
5
RA2/AN2/VREF- RB6/PGC
40 G
R10
220R
RA3/AN3/VREF+ RB7/PGD 220R
6
RA4/T0CKI 220R
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
RC1/T1OSI/CCP2
16 A R1 R2 R3
8 17 B
RE0/AN5/RD RC2/CCP1 10k 10k 10k
9 18 C
RE1/AN6/WR RC3/SCK/SCL
10 23 D
RE2/AN7/CS RC4/SDI/SDA
24 E
RC5/SDO
25 F
RC6/TX/CK
26 G
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21

3
RD2/PSP2
22
RD3/PSP3
RD4/PSP4
RD5/PSP5
27
28
A 1 2 3
29
RD6/PSP6
30
RD7/PSP7
PIC16F877
B 4 5 6
C 7 8 9
D 0 #

BÀI 15A : CHƯƠNG TRÌNH CAN_KEY

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; KEYPAD.ASM MPB Ver 1.0 28-8-05
;
; Reads keypad and shows digit on display
; Design file KEYPAD.DSN
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESSOR 16F877
PCL EQU 002 ; Program Counter
PORTC EQU 007 ; 7-Segment display
PORTD EQU 008 ; 3x4 keypad
TRISC EQU 087 ; Data direction
TRISD EQU 088 ; registers
Key EQU 020 ; Count of keys
; Initialise ports.........................................
BANKSEL TRISC ; Display
CLRW ; all outputs
MOVWF TRISC ; PORTC OUTPUT
MOVLW B'00000111' ; Keypad
MOVWF TRISD ; bidirectional
BANKSEL PORTC ; Display off
CLRF PORTC ; initially
GOTO main ; jump to main
; Check a row of keys .....................................

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_37

row
INCF Key ; Count first key
BTFSS PORTD,0 ; Check key
GOTO found ; and quit if on
INCF Key ; and repeat
BTFSS PORTD,1 ; for second
GOTO found ; key
INCF Key ; and repeat
BTFSS PORTD,2 ; for third
GOTO found ; key
GOTO next ; go for next row
; Scan the keypad..........................................
scan
CLRF Key ; Zero key count
BSF 3,0 ; Set Carry Flag
BCF PORTD,4 ; Select first row
newrow
GOTO row ; check row
next
BSF PORTD,3 ; Set fill bit
RLF PORTD ; Select next row
BTFSC 3,0 ; 0 into carry flag?
GOTO newrow ; if not, next row
GOTO scan ; if so, start again
found
RETURN ; quit with key count
; Display code table.......................................
table
MOVF Key,W ; Get key count
ADDWF PCL ; and calculate jump
NOP ; into table
RETLW B'00001100' ; Code for '1'
RETLW B'10110110' ; Code for '2'
RETLW B'10011110' ; Code for '3'
RETLW B'11001100' ; Code for '4'
RETLW B'11011010' ; Code for '5'
RETLW B'11111010' ; Code for '6'
RETLW B'00001110' ; Code for '7'
RETLW B'11111110' ; Code for '8'
RETLW B'11011110' ; Code for '9'
RETLW B'10010010' ; Code for '*'
RETLW B'01111110' ; Code for '0'
RETLW B'11101100' ;Code for '#'
; Output display code......................................
show
CALL table ; Get display code
MOVWF PORTC ; and show it
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Read keypad & display....
main
MOVLW 0FF ; Set all outputs
MOVWF PORTD ; to keypad high
CALL scan ; Get key number
CALL show ; and dsiplay it
GOTO main ; and repeat

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_38 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

END

;****************************************************************
VCC

U1 CATOED CHUNG
13 33 R4
OSC1/CLKIN RB0/INT
14 34 A
1
OSC2/CLKOUT RB1
35 B
R5 VCC
MCLR/Vpp/THV RB2 R6
220R
R11 RB3/PGM
36 C
R7
220R
2 37 D
10k
3
RA0/AN0 RB4
38 E
R8
220R
4
RA1/AN1 RB5
39 F
R9
220R
5
RA2/AN2/VREF- RB6/PGC
40 G
R10
220R
RA3/AN3/VREF+ RB7/PGD 220R
6
RA4/T0CKI 220R
7
RA5/AN4/SS RC0/T1OSO/T1CKI
15 R1 R2 R3 R12
16 A
RC1/T1OSI/CCP2 10k 10k 10k 10k
8 17 B
RE0/AN5/RD RC2/CCP1
9 18 C
RE1/AN6/WR RC3/SCK/SCL
10 23 D
RE2/AN7/CS RC4/SDI/SDA
24 E
RC5/SDO
25 F
RC6/TX/CK
26 G
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27

4
RD4/PSP4
28

+
RD5/PSP5
C
RD6/PSP6
RD7/PSP7
29
30
D
ON 0 =
PIC16F877
C 1 2 3
B 4 5 6
A 7 8 9

BÀI 15B : CHƯƠNG TRÌNH CAN_KEY 16 BIT

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;CHUONG TRINH SCAN_KEY 16 BIT
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESSOR 16F877
PCL EQU 002
PORTC EQU 007 ; 7-Segment display
PORTD EQU 008 ; 3x4 keypad
TRISC EQU 087 ; Data direction
TRISD EQU 088 ; registers
KEY EQU 020 ; Count of keys
; Initialise ports.........................................
BANKSEL TRISC ; Display
CLRW ; all outputs
MOVWF TRISC ;
MOVLW B'00000111' ; Keypad
MOVWF TRISD ; bidirectional
BANKSEL PORTC ; Display off
CLRF PORTC ; initially
GOTO MAIN ; jump to main
; Check a row of keys .....................................
ROW
INCF KEY ; Count first key
BTFSS PORTD,0 ; Check key

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_39

GOTO FOUND ; and quit if on


INCF KEY ; and repeat
BTFSS PORTD,1 ; for second
GOTO FOUND ; key
INCF KEY ; and repeat
BTFSS PORTD,2 ; for third
GOTO FOUND ; key
INCF KEY ; and repeat
BTFSS PORTD,3 ; for third
GOTO FOUND ; key
GOTO NEXT ; go for next row
; Scan the keypad..........................................
SCAN
CLRF KEY ; Zero key count
BSF 3,0 ; Set Carry Flag
BCF PORTD,4 ; Select first row PORTD = 11101111
NEWROW
GOTO ROW ; check row
NEXT
RLF PORTD ; Select next row
BTFSC 3,0 ; 0 into carry flag?
GOTO NEWROW ; if not, next row
GOTO SCAN ; if so, start again
FOUND
RETURN ; quit with key count
; Display code table.......................................
TABLE
MOVF KEY,W ; Get key count
ADDWF PCL ; and calculate jump
NOP ; into table
RETLW B'01110010' ; Code for 'C' 72H ON
RETLW B'01111110' ; Code for '0' 7EH 0
RETLW B'11110010' ; Code for 'E' F2H =
RETLW B'11101110' ; Code for 'A' EEH ADD +
RETLW B'00001100' ; Code for '1' 0CH 1
RETLW B'10110110' ; Code for '2' B6H 2
RETLW B'10011110' ; Code for '3' 9EH 3
RETLW B'11111000' ; Code for 'B' F8H -
RETLW B'11001100' ; Code for '4' CCH 4
RETLW B'11011010' ; Code for '5' DAH 5
RETLW B'11111010' ; Code for '6' FAH 6
RETLW B'10111100' ; Code for 'D' BCH +
RETLW B'00001110' ; Code for '7' 0EH 7
RETLW B'11111110' ; Code for '8' FEH 8
RETLW B'11011110' ; Code for '9' DEH 9
RETLW B'11100010' ; Code for 'F' E2H /
; Output display code......................................
SHOW
CALL TABLE ; Get display code
MOVWF PORTC ; and show it
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Read keypad & display....
MAIN
MOVLW 0FF ; Set all outputs
MOVWF PORTD ; to keypad high

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_40 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

CALL SCAN ; Get key number


CALL SHOW ; and dsiplay it
GOTO MAIN ; and repeat
END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;*****************************************************************************
C1
RP1
33p 10K
X1
CRYSTAL
C2

2
3
4
5
6
7
8
9
VCC
33p
VCC

R20
R16 U1
10K
10K
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36 CATOED CHUNG
RB3/PGM
2 37 R15
RA0/AN0 RB4
3 38 A
4
RA1/AN1 RB5
39 B
R11
5
RA2/AN2/VREF- RB6/PGC
40 C
R13
220R
6
RA3/AN3/VREF+ RB7/PGD
D
R12
220R
RA4/T0CKI
E
R14
220R
7
RA5/AN4/SS RC0/T1OSO/T1CKI
15
A F
R9
220R
NUT NHAN NGAT COUNTER TIMER0 RC1/T1OSI/CCP2
16
B G
R10
220R
8 17 220R
RE0/AN5/RD RC2/CCP1
9 18 C
RE1/AN6/WR RC3/SCK/SCL 220R
10 23 D
RE2/AN7/CS RC4/SDI/SDA
24 E
RC5/SDO
25 F
RC6/TX/CK
26 G
RC7/RX/DT
R1
RD0/PSP0
19 R2
RD1/PSP1
20 R3
100R
RD2/PSP2
21 R4
100R
RD3/PSP3
22 R5
100R
27 R6
100R
RD4/PSP4
28 R7
100R
RD5/PSP5
RD6/PSP6
29 R8
100R
30 100R
RD7/PSP7
100R
PIC16F877
D8 D3 D1 D2 D12 D11 D9 D10
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED

BÀI 16 : CHƯƠNG TRÌNH KIỂM NGẮT COUNTER TIMER0 TĂNG BIẾN HIỂN THỊ SỐ TỪ 0  F RA
LED 7 (CATHEOD CHUNG) ĐOẠN NỐI VỚI PORTC

TITLE "NGAT COUNTER TIMER0 TANG DEM TRA BANG.ASM"


processor P16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &_HS_OSC & _LVP_OFF
;-----------------------------------------------------------------------------------
;Khai bao hang va cac bien
;----------------------------------------------------------------------------
STATUS EQU 0x03
PORTB EQU 0x06
TRISB EQU 0x86
PORTC EQU 0x07
TRISC EQU 0x87
PORTD EQU 0x08
TRISD EQU 0x88
COUNT EQU 0x20
COUNT3 EQU 0x21
;=============================
;------------------------------------------------------------
ORG 0x000
GOTO INIT
;-------------------bat dau chuong trinh ngat timer0----------------------

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_41

ORG 0x0004
BTFSS INTCON,TMR0IF ; kiem tra co ngat timer0
GOTO EXIT
BCF INTCON,TMR0IF ; xoa co ngat timer0
;-----------nhiem vu khi ngat ------------------------------
INCF COUNT,1
MOVF COUNT,0
XORLW D'16'
BTFSS STATUS,Z
GOTO EXIT
MOVLW D'0'
MOVWF COUNT

;------- thoat ngat -----------------------------


EXIT
MOVLW .255
MOVWF TMR0 ;nap gi tri dem cho counter
RETFIE

;--------------------------------
INIT
;----------------------------------------
; KHAI BAO ngat counter Timer0
;----------------------------------------
CLRF TMR0 ; xoa thanh ghi TMR0
CLRF INTCON ; xoa thanh ghi INTCON
BSF STATUS,RP0
BSF OPTION_REG,7 ;
BSF OPTION_REG,5 ; TIMER0 HD COUNTER
BCF STATUS,RP0 ; chon BANK0
BSF INTCON,TMR0IE ; cho phep ngat Timer0
BSF INTCON,PEIE ; cho phep ngat ngoai vi
BSF INTCON,GIE ; cho phep ngat toan bo cac ngat
MOVLW .255
MOVWF TMR0

;----------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0 ; BANK1
MOVLW B'111111'
MOVWF TRISA ; THIET LAP I/O PORTA
CLRF TRISC ; PORTA LA OUTPUT
CLRF COUNT
BCF STATUS,RP0 ;
;===============================
;CHUONG TRINH CHINH
;=================================
MAIN

CALL TABLE
MOVWF PORTC
GOTO MAIN

;======================================
;CHUONG TRINH DELAY
;===========================================

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_42 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

DELAY
MOVLW 0xFF
MOVWF COUNT3
D2
DECFSZ COUNT3
GOTO D2
RETURN
;======================================
TABLE
MOVF COUNT,W
ADDWF PCL,1
DT 0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,
0xFE,0xDE,0xEE,0xF8,0x72,0xBC,0xF2,0xE2
TABLE1
MOVF COUNT,W ; Get key count
ADDWF PCL ; and calculate jump
NOP ; into table
RETLW B'01111110' ; Code for '0' 7EH
RETLW B'00001100' ; Code for '1' 0CH
RETLW B'10110110' ; Code for '2' B6H
RETLW B'10011110' ; Code for '3' 9EH
RETLW B'11001100' ; Code for '4' CCH
RETLW B'11011010' ; Code for '5' DAH
RETLW B'11111010' ; Code for '6' FAH
RETLW B'00001110' ; Code for '7' 0EH
RETLW B'11111110' ; Code for '8'FEH
RETLW B'11011110' ; Code for '9' DEH
RETLW B'11101110' ; Code for 'A' EEH
RETLW B'11111000' ; Code for 'B' F8H
RETLW B'01110010' ; Code for 'C' 72H
RETLW B'10111100' ; Code for 'D' BCH
RETLW B'11110010' ; Code for 'E' F2H
RETLW B'11100010' ; Code for 'F' E2H
END

;******************************************************************

BÀI 17A : CHƯƠNG TRÌNH NGẮT_COUNTER TIMER1 TĂNG GIÁ TRỊ BIẾN ĐẾM HIỂN THỊ RA LED 7
ĐOẠN TỪ 0  9 Ở PORTA(QUA IC 4511)

;=============khoi tao chuong trinh=====================

TITLE " ngat_counter timer1.asm"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF
&_BODEN_OFF
;============phan dat bien=============================
DEM EQU 0x20
W_save EQU 0x34 ; Cac thanh ghi dung de luu lai gia
PCLATH_save EQU 0x35 ; tri cac thanh ghi quan trong khi
STATUS_save EQU 0x36 ; thuc thi chuong trình ngat
FSR_save EQU 0x37
;---------------------------------------------------------
ORG 0x0004

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_43

GOTO ISR

;-----------------------------------------------------------------------------
; Chuong trinh ngat
;-----------------------------------------------------------------------------
ISR
;---------------------------------------------------------------------------
; doan chuong trinh bat buoc khi bat dau chuong trinh ngat
;--------------------------------------------------------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
;--------------------------------------------------------------------------------
; Kiem tra co ngat
;--------------------------------------------------------------------------------
BTFSS PIR1,TMR1IF ; kiem tra co ngat timer1
GOTO EXIT_INT
BCF T1CON,TMR1ON ; tam thoi tat timer1 de khoi tao lai
;--------------------------------------------------------------------------------
; cac thao tac chinh cua chuong trinh ngat
;--------------------------------------------------------------------------------
CLRF TMR1L ; khoi tao cac gia tri chua trong thanh
CLRF TMR1H ; ghi TMRH va TMRL
MOVLW 0xFF ; nap gia tri vao cac thanh ghi dem cua Timer1
MOVWF TMR1H ; gia tri 25000 (25000 -> 61A8h)
MOVLW 0xFF ;gia tri 10000 (10000 -> 2710h)
MOVWF TMR1L
BSF T1CON,TMR1ON ; Bat Timer1 hoat dong lai
BCF PIR1,TMR1IF ; xoa co ngat

INCF DEM
MOVLW d'10'
XORWF DEM,0
BTFSS STATUS,Z
GOTO EXIT_INT
CLRF DEM

;----------------------------------------------------------------------------------------------------------------
; DOAN CHUUONG TRINH BAT BUOC KHI KE THUC CHUONG TRINH NGAT
;----------------------------------------------------------------------------------------------------------------
EXIT_INT
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_44 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;---------------------------
ORG 0x0000
GOTO START
ORG 0x050
;---------------------------------------------------------------------------------------------------
; Chuong trình chính
;---------------------------------------------------------------------------------------------------
START
;---------------------------------------------------------------
; khoi tao cac port dieu khien
;---------------------------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x00 ; PORTA <-output
MOVWF TRISA
BCF STATUS,RP0

;-----------------------------------------------------------------
; Khoi tao Timer1
;-----------------------------------------------------------------
CLRF T1CON ;xoa thanh ghi T1CON
CLRF INTCON ;xoa thanh ghi INTCON
CLRF TMR1H
CLRF TMR1L
BSF STATUS,RP0 ; Chon BANK1
CLRF PIE1
BSF PIE1,TMR1IE ; Cho phep ngat Timer1
BCF STATUS,RP0 ; ChoN BANK0
CLRF PIR1 ; xoa tat ca cac co ngat
BSF T1CON,1 ;TIMER1 HOAT DONG CHE DO COUNTER
MOVLW 0xFF ; Khoi tao gia tri trong thanh ghi TMR1H
MOVWF TMR1H ; vao TMR1L (TMR1H:TMR1L = 65535 = ffffh)
MOVLW 0xFF ;khi do timer1 dem 1 la tra.
MOVWF TMR1L
BSF T1CON,TMR1ON ; Bat Timer1
BSF INTCON,TMR1IE ; Cho phep ngat Timer1
BSF INTCON,PEIE ; Cho phep ngat ngoai vi
BSF INTCON,GIE ; Cho phep ngat toan cuc
;====================================================
CLRF DEM
MAIN
MOVF DEM,0
MOVWF PORTA
GOTO MAIN
;=================================
END

;***********************************************

BÀI 17B : CHƯƠNG TRÌNH NGẮT_COUNTER1 TĂNG GIÁ TRỊ BIẾN ĐẾM TỪ 0  9 HIỂN THỊ RA
LED 7 ĐOẠN Ở PORTD BẰNG PHƯƠNG PHÁP TRA BẢNG

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_45

C1

33p
X1
CRYSTAL
C2
VCC

33p
VCC

R16 U1
10K
13
OSC1/CLKIN RB0/INT
33 R9
14 34 10K
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36
RB3/PGM
2 37
RA0/AN0 RB4
3 38
4
RA1/AN1 RB5
39
NUT NHAN NGAT COUNTER1
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
6
RA4/T0CKI
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
8 17
RE0/AN5/RD RC2/CCP1
9 18
RE1/AN6/WR RC3/SCK/SCL
10 23
RE2/AN7/CS RC4/SDI/SDA
24
RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT CATOT CHUNG
19 R1
RD0/PSP0
RD1/PSP1
20 R2
21 R3
100R
RD2/PSP2
RD3/PSP3
22 R4
100R
27 R5
100R
RD4/PSP4
RD5/PSP5
28 R6
100R
29 R7
100R
RD6/PSP6
30 100R
RD7/PSP7
100R
PIC16F877

;=============khoi tao chuong trinh=====================

TITLE " ngat_counter timer1.asm"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF
&_BODEN_OFF
;============phan dat bien=============================
DEM EQU 0x20
W_save EQU 0x34 ; Cac thanh ghi dung de luu lai gia
PCLATH_save EQU 0x35 ; tri cac thanh ghi quan trong khi
STATUS_save EQU 0x36 ; thuc thi chuong trình ngat
FSR_save EQU 0x37
;---------------------------------------------------------
ORG 0x004
GOTO ISR

;-----------------------------------------------------------------------------
; Chuong trinh ngat
;-----------------------------------------------------------------------------
ISR

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_46 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;---------------------------------------------------------------------------
; doan chuong trinh bat buoc khi bat dau chuong trinh ngat
;--------------------------------------------------------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
;--------------------------------------------------------------------------------
; Kiem tra co ngat
;--------------------------------------------------------------------------------
BTFSS PIR1,TMR1IF ; kiem tra co ngat timer1
GOTO EXIT_INT
BCF T1CON,TMR1ON ; tam thoi tat timer1 de khoi tao lai
;--------------------------------------------------------------------------------
; cac thao tac chinh cua chuong trinh ngat
;--------------------------------------------------------------------------------
CLRF TMR1L ; khoi tao cac gia tri chua trong thanh
CLRF TMR1H ; ghi TMRH va TMRL
MOVLW 0xFF ; nap gia tri vao cac thanh ghi dem cua Timer1
MOVWF TMR1H ; gia tri 25000 (25000 -> 61A8h)
MOVLW 0xFF ;gia tri 10000 (10000 -> 2710h)
MOVWF TMR1L
BSF T1CON,TMR1ON ; Bat Timer1 hoat dong lai
BCF PIR1,TMR1IF ; xoa co ngat

INCF DEM
MOVLW d'10'
XORWF DEM,0
BTFSS STATUS,Z
GOTO EXIT_INT
CLRF DEM

;----------------------------------------------------------------------------------------------------------------
; DOAN CHUUONG TRINH BAT BUOC KHI KE THUC CHUONG TRINH NGAT
;----------------------------------------------------------------------------------------------------------------
EXIT_INT
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;====================================================================
ORG 0x0000
GOTO START
ORG 0x050
;---------------------------------------------------------------------------------------------------
; Chuong trình chính

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_47

;---------------------------------------------------------------------------------------------------
START
;---------------------------------------------------------------
; khoi tao cac port dieu khien
;---------------------------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x00 ; PORTD <-output
MOVWF TRISD
MOVLW 0xFF ; PORTC <-INPUT
MOVWF TRISC
BCF STATUS,RP0

;-----------------------------------------------------------------
; Khoi tao Timer1
;-----------------------------------------------------------------
CLRF T1CON
CLRF INTCON
CLRF TMR1H
CLRF TMR1L
BSF STATUS,RP0 ; Chon BANK1
CLRF PIE1
BSF PIE1,TMR1IE ; Cho phep ngat Timer1
BCF STATUS,RP0 ; ChoN BANK0
CLRF PIR1 ; xoa tat ca cac co ngat
BSF T1CON,1 ;TIMER1 HOAT DONG CHE DO COUNTER
MOVLW 0xFF ; Khoi tao gia tri trong thanh ghi TMR1H
MOVWF TMR1H ; vao TMR1L (TMR1H:TMR1L = 65535 = ffffh)
MOVLW 0xFF ;khi do timer1 dem 1 la tra.
MOVWF TMR1L
BSF T1CON,TMR1ON ; Bat Timer1
BSF INTCON,TMR1IE ; Cho phep ngat Timer1
BSF INTCON,PEIE ; Cho phep ngat ngoai vi
BSF INTCON,GIE ; Cho phep ngat toan cuc
;====================================================
CLRF DEM
MAIN

CALL TABLE
MOVWF PORTD
GOTO MAIN

;======================================

TABLE
MOVF DEM,W
ADDWF PCL,1
DT 0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,
0x0E,0xFE,0xDE,0xEE,0xF8,0x72,0xBC,0xF2,0xE2

END
;*****************************************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_48 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

BÀI 18 : CHƯƠNG TRÌNH TẠO XUNG VUÔNG VỚI TẦN SỐ 1KHZ RA CHÂN SỐ 6 CỦA PIC16F877A.

;--------------- ------chuong trinh tao xung vuong 1KHZ o chan 6 cua 16f877a ------------------
;f = 1KHZ , T = 1/f = 1000 us (micrco giay), cao 500us, thap 500us.
;chan so 6 cua PIC 16F877A la bit thu 4 cua PORTA

processor P16f877a
include <P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF &
_LVP_OFF & _CPD_OFF

;-------------------KHAI BAO BIEN --------------------------------

STATUS EQU 0x03


PORTA EQU 0x05
TRISA EQU 0x85
COUNT0 EQU 0x20
COUNT1 EQU 0x21
COUNT2 EQU 0x21

;========= KHAI BAO PORT ===========


BCF STATUS,RP1
BSF STATUS,RP0 ;Switch to Bank 1
CLRF TRISA ;to Output.
BCF STATUS,RP0 ;Switch back to Bank 0
CLRF PORTA ; BAN DAU CAC BIT O MUC 0

;=========CHUONG TRINH CHINH ==============


MAIN
BCF PORTA,4
CALL DELAY500US
BSF PORTA,4
CALL DELAY500US
GOTO MAIN
;=========CHUONG TRINH DELAY500U ==============
DELAY500US ; TCKM = 2 + 166 + 330 + 4 = 500 CKM

MOVLW d'166' ; 1CKM


MOVWF COUNT0 ;1CKM
LAP
DECFSZ COUNT0,1 ; 166x1 = 166 CKM
GOTO LAP ; 165x2 = 330 CKM
RETURN ; 2CKM
;========================================================
END

;*******************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_49

BÀI 19 : CHƯƠNG TRÌNH BAN ĐẦU 8 LED NỐI VỚI POTRB TẮT HẾT, SAU ĐÓ SÁNG DẦN TỪ TRÁI
QUA PHẢI, KHI SÁNG HẾT THÌ TẮT DẦN TỪ PHẢI QUA TRÁI, KHI NÀO TẮT HẾT THÌ LẶP LẠI.

TITLE "CHUONG TRINH DICH_LED.ASM"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC &
_LVP_OFF & _CPD_OFF
;===============================================================================
BIEN0 EQU 0X30
BIEN1 EQU 0X31
PORTB EQU 0X06
TRISB EQU 0X86
STATUS EQU 0x03
;==============================
;CHUONG TRINH CHINH
;==============================

ORG 0x000
GOTO MAIN
ORG 0x008
;=======================
MAIN
;=======================
;KHOI TAO PORTB
;=============================
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
BCF STATUS,RP1
BCF STATUS,RP0
MOVLW H'00'
MOVWF PORTB
;=============================
;VONG LAP CHUONG TRINH
;=============================
START
MOVLW H'00'
MOVWF PORTB
CALL WAIT
AAA
BSF STATUS,0 ;<=> C = 1
RRF PORTB,1
CALL WAIT
BTFSS PORTB,0
GOTO AAA
;==========================
BBB
BCF STATUS,0 ;<=> C = 0
RLF PORTB,1
CALL WAIT
BTFSC PORTB,7
GOTO BBB

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_50 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

GOTO AAA
;========================
;CHUONG TRINH DELAY
;=========================
WAIT
MOVLW H'FF'
MOVWF BIEN1
DEL1 CALL DELAY
DECFSZ BIEN1,1
GOTO DEL1
RETURN
DELAY
CLRF BIEN0
DEL
DECFSZ BIEN0,1
GOTO DEL
RETURN

END
;************************************************
BÀI 20A : CHƯƠNG TRÌNH ĐIỀU KHIỂN 8 LED NỐI VỚI PORTD VÀ 1 NÚT NHẤN NỐI VỚI CHÂN RB0
CỦA PORTB. BAN ĐẦU 8 LED TẮT HẾT, NẾU NHẤN NÚT 1 LẦN THÌ 8 LEN CHỚP TẮT 3 LẦN RỒI TẮT,
CÒN NẾU NHẤN NÚT 2 LẦN THÌ 8 LED SÁNG DẦN TỪ TRÁI QUA PHẢI, KHI 8 LED SÁNG HẾT THÌ
CHỚP TẮT 3 LẦN.

TITLE "NHAN NUT 1 LAN VA NHAN NUT 2 LAN"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;KHAI BAO BIEN
;--------------------------------------------------------------------------------------------------------------
STATUS EQU 03H
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
counta EQU 0x22
countb EQU 0x23
count1 EQU 0x24
;========================================

ORG 0x000
GOTO START
ORG 0x0005
START
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW b'11111111' ;PORTB INPUT
MOVWF TRISB

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_51

CLRF TRISD
BCF STATUS,RP0

MAIN
MOVLW b'00000000'
MOVWF PORTD
C1 BTFSC PORTB,0
GOTO C1 ;NHAY VE SAU 1 DONG LENH
CALL DELAY
C2 BTFSS PORTB,0
GOTO C2
CALL delay_100ms
BTFSC PORTB,0
GOTO KTRA
CALL DELAY
C3 BTFSS PORTB,0
GOTO C3
CALL DELAY
GOTO CTRINH2
KTRA
CALL delay_100ms
BTFSC PORTB,0
GOTO CTRINH1
C4 BTFSS PORTB,0
GOTO C4
CALL DELAY
CTRINH2
BSF STATUS,0
RRF PORTD,1
CALL delay_100ms
BTFSS STATUS,0
GOTO CTRINH2
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
CLRC
CTRINH1
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
GOTO MAIN

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_52 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN
;=================================
delay_100ms
MOVLW d'100'
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
END
;***************************************************************

BÀI 20B : CHƯƠNG TRÌNH ĐIỀU KHIỂN 8 LED NỐI VỚI PORTD VÀ 1 NÚT NHẤN NỐI VỚI CHÂN RB0
CỦA PORTB. BAN ĐẦU 8 LED TẮT HẾT, NẾU NHẤN NÚT 1 LẦN THÌ 8 THÌ THỰC HIỆN CHƯƠNG
TRÌNH 1, CÒN NẾU NHẤN NÚT 2 LẦN THÌ THỰC HIỆN CHƯƠNG TRÌNH 2.
VÀ NẾU NHẤN NÚT 3 LẦN THÌ THỰC HIỆN CHƯƠNG TRÌNH 3.

TITLE "NHAN NUT 1 LAN_2 LAN VA 2 LAN"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;KHAI BAO BIEN
;--------------------------------------------------------------------------------------------------------------
STATUS EQU 03H
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
counta EQU 0x22
countb EQU 0x23
count1 EQU 0x24
;========================================

ORG 0x000

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_53

GOTO START
ORG 0x008
START
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW b'11111111'
MOVWF TRISB
CLRF TRISD
BCF STATUS,RP0
;=====================================

MAIN
MOVLW b'00000000'
MOVWF PORTD
;===================================
;NHAN LAN 1
;===================================
L1 BTFSC PORTB,0
GOTO L1
CALL DELAY
L12 BTFSS PORTB,0
GOTO L12
CALL delay_100ms
;=====================================
;KIEM TRA NHAN LAN 2 KHONG?
;======================================
BTFSC PORTB,0
GOTO KTRA1
CALL DELAY
L2 BTFSS PORTB,0
GOTO L2
CALL delay_100ms
;========================================
;KIEM TRA NHAN LAN 3
;===========================================
BTFSC PORTB,0
GOTO KTRA2
CALL DELAY
L3 BTFSS PORTB,0
GOTO L3
CALL DELAY
GOTO CTRINH3
;=======================================
KTRA1
CALL delay_100ms
BTFSC PORTB,0
GOTO CTRINH1
CALL DELAY
GOTO L2
;=======================================
KTRA2
CALL delay_100ms
BTFSC PORTB,0

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_54 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

GOTO CTRINH2
CALL DELAY
GOTO L3

;===================================
CTRINH3

BSF STATUS,0
RLF PORTD,1
CALL delay_100ms
BTFSS STATUS,0
GOTO CTRINH3
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
CLRC

;========================================
CTRINH2
BSF STATUS,0
RRF PORTD,1
CALL delay_100ms
BTFSS STATUS,0
GOTO CTRINH2
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
CLRC
;=========================================
CTRINH1
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
GOTO MAIN

;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_55

D1 DECFSZ COUNT_1
GOTO D1
RETURN
;=================================
delay_100ms
MOVLW d'100'
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
;======================================
END

;*******************************************************************
BÀI 20C : CHƯƠNG TRÌNH ĐIỀU KHIỂN 8 LED NỐI VỚI PORTD VÀ 1 NÚT NHẤN NỐI VỚI CHÂN RB0
CỦA PORTB. BAN ĐẦU 8 LED TẮT HẾT, NẾU NHẤN NÚT 1 LẦN THÌ 8 THÌ THỰC HIỆN CHƯƠNG
TRÌNH 1, CÒN NẾU NHẤN NÚT 2 LẦN THÌ THỰC HIỆN CHƯƠNG TRÌNH 2. VÀ NẾU NHẤN NÚT 3
LẦN THÌ THỰC HIỆN CHƯƠNG TRÌNH 3.(TRONG KHI CHẠY NẾU NHÁN NÚT 1 LẦN THÌ SẼ CHẠY
LẠI CHƯƠNG TRÌNH 1, NHẤN 2 LẦN CHẠY LẠI CHƯƠNG TRÌNH 2, NHẤN 3 LẦN CHẠY LẠI CHƯƠNG
TRÌNH 3 KIỂM TRA LIÊN TỤC )

CÁCH 1:

TITLE "NHAN NUT 1 LAN_2 LAN VA 2 LAN"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;KHAI BAO BIEN
;--------------------------------------------------------------------------------------------------------------
STATUS EQU 03H
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
counta EQU 0x22
countb EQU 0x23
count1 EQU 0x24
;================== ================

ORG 0x000
GOTO START
ORG 0x008

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_56 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

START
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTD
CLRF PORTB
BSF STATUS,RP0
MOVLW b'11111111'
MOVWF TRISB
CLRF TRISD
BCF STATUS,RP0
;=====================================

MAIN
MOVLW b'00000000'
MOVWF PORTD
;===================================
;NHAN LAN 1
;===================================
L1 BTFSC PORTB,0
GOTO L1
LOOP
MOVLW b'00000000'
MOVWF PORTD
CALL DELAY
L12 BTFSS PORTB,0
GOTO L12
CALL delay_100ms
;=====================================
;KIEM TRA NHAN LAN 2 KHONG?
;======================================
BTFSC PORTB,0
GOTO KTRA1
CALL DELAY
L2 BTFSS PORTB,0
GOTO L2
CALL delay_100ms
;========================================
;KIEM TRA NHAN LAN 3
;===========================================
BTFSC PORTB,0
GOTO KTRA2
CALL DELAY
L3 BTFSS PORTB,0
GOTO L3
CALL DELAY
GOTO CTRINH3
;=======================================
KTRA
GOTO LOOP
;======================================
KTRA1
CALL delay_100ms
BTFSC PORTB,0
GOTO CTRINH1
CALL DELAY
GOTO L2

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_57

;=======================================
KTRA2
CALL delay_100ms
BTFSC PORTB,0
GOTO CTRINH2
CALL DELAY
GOTO L3

;===================================

CTRINH1
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
LAP BSF STATUS,0
RRF PORTD,1
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
BTFSS STATUS,0
GOTO LAP
GOTO CTRINH1
;=====================================
CTRINH2
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
MOVLW b'00011000'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
MOVLW b'00111100'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
MOVLW b'01111110'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
GOTO CTRINH2
;=============================================
CTRINH3

MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_58 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

LAP1
BSF STATUS,0
RLF PORTD,1
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
BTFSS STATUS,0
GOTO LAP1
GOTO CTRINH3
;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN
;=================================
delay_100ms
MOVLW d'100'
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
;======================================
END

;***************************************************************
CÁCH 2:

TITLE "1 NUT NHAN 3 CHUONG TRINH CACH 2"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------------------------------------------------------
;KHAI BAO BIEN
;--------------------------------------------------------------------------------------------------------------
STATUS EQU 03H
PORTB EQU 06H
TRISB EQU 86H
PORTD EQU 08H
TRISD EQU 88H
COUNT_1 EQU 0x20
counta EQU 0x22

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_59

countb EQU 0x23


count1 EQU 0x24
DEM EQU 0x25
;========================================

ORG 0x000
GOTO START
ORG 0x008
START
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW b'11111111'
MOVWF TRISB
CLRF TRISD
BCF STATUS,RP0
CLRF DEM
CLRF PORTD
;=====================================

MAIN

;===================================
;NHAN LAN 1
;===================================
L1 BTFSC PORTB,0
GOTO L1
KTRA
MOVLW b'00000000'
MOVWF PORTD
CALL DELAY
L12 BTFSS PORTB,0
GOTO L12

;=====================================
;KIEM TRA NHAN LAN 2 KHONG?
;======================================
CALL delay_100ms
KTRA11
BTFSC PORTB,0
GOTO KTRA1
CALL DELAY
L2
BTFSS PORTB,0
GOTO L2

;========================================
;KIEM TRA NHAN LAN 3
;===========================================
CALL delay_100ms
CLRF DEM
KTRA21
BTFSC PORTB,0
GOTO KTRA2
CALL delay_100ms
CLRF DEM

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_60 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

L3
BTFSS PORTB,0
GOTO L3
CALL delay_100ms
GOTO CTRINH3
;=======================================
KTRA1
INCF DEM
CALL DELAY
MOVF DEM,0
XORLW D'40'
BTFSS STATUS,Z
GOTO KTRA11
CLRF DEM
GOTO CTRINH1

;=======================================
KTRA2
INCF DEM
CALL DELAY
MOVF DEM,0
XORLW D'40'
BTFSS STATUS,Z
GOTO KTRA21
CLRF DEM
GOTO CTRINH2

;===================================

CTRINH1
CLRF DEM
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
LAP BSF STATUS,0
RRF PORTD,1
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
BTFSS STATUS,0
GOTO LAP
GOTO CTRINH1
;=====================================
CTRINH2
CLRF DEM
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
MOVLW b'00011000'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
MOVLW b'00111100'

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_61

MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
MOVLW b'01111110'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
MOVLW b'11111111'
MOVWF PORTD
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
GOTO CTRINH2
;=============================================
CTRINH3
CLRF DEM
MOVLW b'00000000'
MOVWF PORTD
CALL delay_100ms
LAP1
BSF STATUS,0
RLF PORTD,1
CALL delay_100ms
BTFSS PORTB,0
GOTO KTRA
BTFSS STATUS,0
GOTO LAP1
GOTO CTRINH3
;=============================================
;CHUONG TRINH DELAY
;===========================================

DELAY
CLRF COUNT_1
D1 DECFSZ COUNT_1
GOTO D1
RETURN
;=================================
delay_100ms
MOVLW d'100'
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_62 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;======================================
END

;***********************************************************************

C1 ANOT CHUNG

33p
X1 U1
CRYSTAL 13 33
C2 14
OSC1/CLKIN RB0/INT
34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36
RB3/PGM
33p RA0 2 37
RA0/AN0 RB4
RA1 3 38
RA1/AN1 RB5
RA2 4 39
RA2/AN2/VREF- RB6/PGC
RA3 5 40
RA3/AN3/VREF+ RB7/PGD
RA4 6
RA5 7
RA4/T0CKI
15
R9 A
RA5/AN4/SS RC0/T1OSO/T1CKI
16
R10 B
8
RC1/T1OSI/CCP2
17
R11
220R
C
RE0/AN5/RD RC2/CCP1 R12
220R
D
9 18 R13
RE1/AN6/WR RC3/SCK/SCL 220R
10 23 E
RE2/AN7/CS RC4/SDI/SDA R14
220R
F
24 R15

G
C
D

RA0
RA1
A
B

E
220R

F
RC5/SDO
25 G
RC6/TX/CK R16
220R
P
26 220R
RC7/RX/DT
220R
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

BÀI 21 : CHƯƠNG TRÌNH HIỂN THỊ TĂNG DẦN TỪ 0 ĐÉN 59 RỒI LẶP LẠI
DÙNG NGẮT TIMER0 ĐỂ TĂNG GIÁ TRỊ:

;CHUONG TRINH HIEN THI 2 SO TANG DAN TU 0 DEN 59 ROI LAP LAI
TITLE "Tang tu 0 den 59 dung timer 0"
processor P16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF &
_LVP_OFF & _CPD_OFF
; -----------------------------------------------------------------------------------------------------------
; Khai baùo bieán
;------------------------------------------------------------------------------------------------------------
count1 EQU 0x20
counta EQU 0x21 ; trình delay
countb EQU 0x22
hang_don_vi EQU 0x23
hang_chuc EQU 0x24
W_save EQU 0x25
PCLATH_save EQU 0x26
STATUS_save EQU 0x27
FSR_save EQU 0x28
DEM EQU 0x29
;-------------------------------------------------------------------------------------------------------------
; Chöông trình ngaét
;-------------------------------------------------------------------------------------------------------------

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_63

ORG 0x0004
GOTO ISR
ISR
;------------------------------------------------------------------------------------------------------------
; Ñoaïn chöông trình baét buoäc ñaàu chöông trình ngaét
;------------------------------------------------------------------------------------------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
BTFSS INTCON,TMR0IF ; KIEM TRA CO NGAT TIMER
GOTO exit_int
; =============CHUONG TRING NGAT===================
BCF INTCON,TMR0IF
;----------------------------------------------------------
INCF DEM,1
MOVLW D'200'
XORWF DEM,0
BTFSS STATUS,Z
GOTO exit_int
CLRF DEM
INCF hang_don_vi,1
MOVLW D'10'
XORWF hang_don_vi,0
BTFSS STATUS,Z
GOTO exit_int
CLRF hang_don_vi
INCF hang_chuc,1
MOVLW D'6'
XORWF hang_chuc,0
BTFSS STATUS,Z
GOTO exit_int
CLRF hang_chuc
GOTO exit_int
;---------------------------------------------------------------------

exit_int
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;----------------------------------------------------------------------------------------------------------------
; ket thuc chuong trinh ngat
;----------------------------------------------------------------------------------------------------------------
ORG 0x0000
GOTO start

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_64 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

ORG 0x050
;----------------------------------------------------------------------------------------------------------------
; bat dau chuong trình chính
;----------------------------------------------------------------------------------------------------------------
start
;---------------------------------------------
; khai bao cac port
;---------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0 ; BANK1
MOVLW 0x00
MOVWF TRISC ; PORTD <- output
MOVLW b'111100'
MOVWF TRISA ; PORTB<1:0> <- output
BCF STATUS,RP0 ;
CLRF PORTC
CLRF PORTA
;----------------------------------------
; Khôûi taïo Timer0
;----------------------------------------
CLRF TMR0 ; xoa thanh ghi TMR0
CLRF INTCON ; xoa thanh ghi INTCON
BSF STATUS,RP0
MOVLW b'10000001'
MOVWF OPTION_REG
; prescaler cho Timer0 va hon tan so chia
; tan so prescaler la 1:4
BCF STATUS,RP0 ; chon BANK0
BSF INTCON,TMR0IE ; cho phep ngat Timer0
BSF INTCON,PEIE ; cho phep ngat ngoai vi
BSF INTCON,GIE ; cho phep ngat toan bo cac ngat
;----------------------------------------------
CLRF hang_chuc
CLRF hang_don_vi
CLRF DEM
;----------------------------------------------
main
CALL hien_thi
GOTO main
;-------------------------------------
hien_thi
MOVF hang_don_vi,0
CALL table
MOVWF PORTC
MOVLW b'000010'
MOVWF PORTA
CALL delay_1ms
MOVF hang_chuc,0
CALL table
MOVWF PORTC
MOVLW b'000001'
MOVWF PORTA
CALL delay_1ms
RETURN
;--------------------------------------------------------------------------------------------------------
; CAC CHUONG TRINH CON DUNG CHO CHUONG TRINH CON HIEN THI

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_65

;--------------------------------------------------------------------------------------------------------
table
ADDWF PCL,1
RETLW 0xC0
RETLW 0xF9
RETLW 0xA4
RETLW 0xB0
RETLW 0x99
RETLW 0x92
RETLW 0x82
RETLW 0xF8
RETLW 0x80
RETLW 0x90
;================================
delay_1ms
MOVLW d'10'
MOVWF count1
d2 MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
END
;***********************************************************************

BÀI 22 : CHƯƠNG TRÌNH HIỂN THỊ TĂNG DẦN TỪ 0 ĐÉN 59 RỒI LẶP LẠI
DÙNG NGẮT TIMER1 ĐỂ TĂNG GIÁ TRỊ:

;=============khoi tao chuong trinh=====================

;=============khoi tao chuong trinh=====================

TITLE " ngat timer1.asm"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC &_LVP_OFF &_CPD_OFF
&_BODEN_OFF
;============phan dat bien=============================
count1 EQU 0x20
counta EQU 0x21 ; trình delay
countb EQU 0x22
hang_don_vi EQU 0x23
hang_chuc EQU 0x24
W_save EQU 0x25
PCLATH_save EQU 0x26
STATUS_save EQU 0x27
FSR_save EQU 0x28
DEM EQU 0x29

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_66 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

ORG 0x0004
GOTO ISR

;-----------------------------------------------------------------------------
; Chuong trinh ngat
;-----------------------------------------------------------------------------
ISR
;---------------------------------------------------------------------------
; doan chuong trinh bat buoc khi bat dau chuong trinh ngat
;--------------------------------------------------------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
;--------------------------------------------------------------------------------
; Kiem tra co ngat
;--------------------------------------------------------------------------------
BTFSS PIR1,TMR1IF ; kiem tra co ngat timer1
GOTO EXIT_INT
BCF T1CON,TMR1ON ; tam thoi tat timer1 de khoi tao lai
;--------------------------------------------------------------------------------
; cac thao tac chinh cua chuong trinh ngat
;--------------------------------------------------------------------------------
CLRF TMR1L ; khoi tao cac gia tri chua trong thanh
CLRF TMR1H ; ghi TMRH va TMRL
MOVLW 0x9E ; nap gia tri vao cac thanh ghi dem cua Timer1
MOVWF TMR1H ; gia tri 25000 (25000 -> 61A8h)
MOVLW 0x57 ;gia tri 10000 (10000 -> 2710h)
MOVWF TMR1L
BSF T1CON,TMR1ON ; Bat Timer1
BCF PIR1,TMR1IF ; xoa co ngat

INCF DEM,1
MOVLW D'5'
XORWF DEM,0
BTFSS STATUS,Z
GOTO EXIT_INT
CLRF DEM
INCF hang_don_vi,1
MOVLW D'10'
XORWF hang_don_vi,0
BTFSS STATUS,Z
GOTO EXIT_INT
CLRF hang_don_vi
INCF hang_chuc,1
MOVLW D'6'
XORWF hang_chuc,0
BTFSS STATUS,Z
GOTO EXIT_INT
CLRF hang_chuc

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_67

;----------------------------------------------------------------------------------------------------------------
; DOAN CHUUONG TRINH BAT BUOC KHI KE THUC CHUONG TRINH NGAT
;----------------------------------------------------------------------------------------------------------------
EXIT_INT

MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;---------------------------
ORG 0x0000
GOTO START
ORG 0x050
;---------------------------------------------------------------------------------------------------
; Chuong trình chính
;---------------------------------------------------------------------------------------------------
START
;---------------------------------------------------------------
; khoi tao cac port dieu khien
;---------------------------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x00 ; PORTA <-output
MOVWF TRISA
MOVLW 0x00 ; PORTC <-output
MOVWF TRISC
BCF STATUS,RP0
;-----------------------------------------------------------------
; Khoi tao Timer1
;----------------------------------------------------------------
CLRF T1CON
CLRF INTCON
CLRF TMR1H
CLRF TMR1L
BSF STATUS,RP0 ; Chon BANK1
CLRF PIE1
BSF PIE1,TMR1IE ; Cho phep ngat Timer1
BCF STATUS,RP0 ; ChoN BANK0
CLRF PIR1 ; xoa tat ca cac co ngat
MOVLW 0x30 ; prescaler 1:8, xung dem la xung lenh, tam thoi
MOVWF T1CON ; tat Timer1

MOVLW 0x9E ; Khoi tao gia tri trong thanh ghi TMR1H
MOVWF TMR1H ; vao TMR1L (TMR1H:TMR1L = 25000)
MOVLW 0x57
MOVWF TMR1L
BSF INTCON,TMR1IE ; Cho phep ngat Timer1
BSF INTCON,PEIE ; Cho phep ngat ngoai vi
BSF INTCON,GIE ; Cho phep ngat toan cuc
BSF T1CON,TMR1ON ; Bat Timer1

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_68 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;====================================================
CLRF hang_chuc
CLRF hang_don_vi
CLRF DEM
;----------------------------------------------
MAIN
CALL hien_thi
GOTO MAIN
;-------------------------------------
hien_thi
MOVF hang_don_vi,0
CALL TABEL
MOVWF PORTC
MOVLW b'000010'
MOVWF PORTA
CALL delay_1ms
MOVF hang_chuc,0
CALL TABEL
MOVWF PORTC
MOVLW b'000001'
MOVWF PORTA
CALL delay_1ms
RETURN
;--------------------------------------------------------------------------------------------------------
; CAC CHUONG TRINH CON DUNG CHO CHUONG TRINH CON HIEN THI
;--------------------------------------------------------------------------------------------------------
TABEL ADDWF PCL,1
DT 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
;================================
delay_1ms
MOVLW d'10'
MOVWF count1
d2 MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
;=======================================
END
;********************************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_69

BÀI 23 : CHƯƠNG TRÌNH NHẤN NÚT NHẤN 1 (NỐI VỚI CHÂN RB1) TĂNG ĐẾM, NHẤN NÚT NHẤN 2
(NỐI VỚI CHÂN RB2) GIẢM ĐỀM HIỂN THỊ RA LED 7 ĐOẠN NỐI VỚI PORTC

VCC
R15
R14
R13
R12
10k10k10k10k
CATOED CHUNG
A
R4
B
R5
VCC
C
R6
220R
D
R7
220R
U1 E
R8
220R
13 33 F
R9
220R
14
OSC1/CLKIN RB0/INT
34 G
R10
220R
OSC2/CLKOUT RB1 220R
1 35
MCLR/Vpp/THV RB2 220R
R11 RB3/PGM
36
10k 2 37
RA0/AN0 RB4
3 38
RA1/AN1 RB5
4 39
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
6
RA4/T0CKI
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16 A
RC1/T1OSI/CCP2
8 17 B
RE0/AN5/RD RC2/CCP1
9 18 C
RE1/AN6/WR RC3/SCK/SCL
10 23 D
RE2/AN7/CS RC4/SDI/SDA
24 E
RC5/SDO
25 F
RC6/TX/CK
26 G
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

TITLE "2 NUT NHAN TANG_GIAM DEM TRA BANG.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &_HS_OSC & _LVP_OFF
;-----------------------------------------------------------------------------------
;Khai bao hang va cac bien
SW1 EQU 1
SW2 EQU 2
STATUS EQU 0x03
PORTB EQU 0x06
TRISB EQU 0x86
PORTC EQU 0x07
TRISC EQU 0x87
COUNT EQU 0x20
COUNT3 EQU 0x21
;======================================
ORG 0x000
GOTO INIT
ORG 0x005
;=====================================
;KHAI BAO PORT I/O
;====================================================
INIT
BCF STATUS,RP1
BSF STATUS,RP0 ; CHON BANK1

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_70 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

MOVLW b'00001111'
MOVWF TRISB ; CHAN RB0 VA RB1 INPUT, CON LAI LA OUTPUT
CLRF TRISC ; PORTA LA OUTPUT
BCF STATUS,RP0 ; VE BANK0
CLRF PORTC
CLRF COUNT
;============================================================
;CHUONG TRINH LAP VONG

;===============================
MAIN
CALL TABLE
MOVWF PORTC
BTFSC PORTB,SW1
GOTO KHONG_NHAN_SW1
CALL DELAY
C1 BTFSS PORTB,SW1
GOTO C1
CALL DELAY
TANG
INCF COUNT,1
MOVF COUNT,0
XORLW D'16'
BTFSS STATUS,Z ; KTRA DEM = 10 ? Y NHAY MAIN, N NHAY LOOP
GOTO MAIN
CLRF COUNT
;===============================================
KHONG_NHAN_SW2
GOTO MAIN
;==================================================
KHONG_NHAN_SW1

BTFSC PORTB,SW2
GOTO KHONG_NHAN_SW2
CALL DELAY
C2 BTFSS PORTB,SW2
GOTO C2
CALL DELAY
MOVF COUNT,0
XORLW D'0'
BTFSS STATUS,Z ; KTRA DEM = 10 ? Y NHAY MAIN, N NHAY LOOP
GOTO GIAM
MOVLW D'16'
MOVWF COUNT
GOTO MAIN
GIAM
DECFSZ COUNT,1
GOTO MAIN

;======================================
;CHUONG TRINH DELAY
;===========================================
DELAY
MOVLW 0xFF
MOVWF COUNT3
D2

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_71

DECFSZ COUNT3
GOTO D2
RETURN
;======================================
TABLE
MOVF COUNT,W
ADDWF PCL,1

DT 0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,
0xFE,0xDE,0xEE,0xF8,0x72,0xBC,0xF2,0xE2
‘================================================================
TABLE1
MOVF COUNT,W ; Get key count
ADDWF PCL ; and calculate jump
NOP ; into table
RETLW B'01111110' ; Code for '0' 7EH
RETLW B'00001100' ; Code for '1' 0CH
RETLW B'10110110' ; Code for '2' B6H
RETLW B'10011110' ; Code for '3' 9EH
RETLW B'11001100' ; Code for '4' CCH
RETLW B'11011010' ; Code for '5' DAH
RETLW B'11111010' ; Code for '6' FAH
RETLW B'00001110' ; Code for '7' 0EH
RETLW B'11111110' ; Code for '8' FEH
RETLW B'11011110' ; Code for '9' DEH
RETLW B'11101110' ; Code for 'A' EEH
RETLW B'11111000' ; Code for 'B' F8H
RETLW B'01110010' ; Code for 'C' 72H
RETLW B'10111100' ; Code for 'D' BCH
RETLW B'11110010' ; Code for 'E' F2H
RETLW B'11100010' ; Code for 'F' E2H
END
;****************************************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_72 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

RP1
10K

2
3
4
5
6
7
8
9
VCC
U1
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36 CATOED CHUNG
RB3/PGM
2 37 R15
RA0/AN0 RB4
3 38 A
4
RA1/AN1 RB5
39 B
R11
5
RA2/AN2/VREF- RB6/PGC
40 C
R13
220R
6
RA3/AN3/VREF+ RB7/PGD
D
R12
220R
7
RA4/T0CKI
15 E
R14
220R
RA5/AN4/SS RC0/T1OSO/T1CKI
16 A F
R9
220R
8
RC1/T1OSI/CCP2
17 B G
R10
220R
RE0/AN5/RD RC2/CCP1 220R
9 18 C
RE1/AN6/WR RC3/SCK/SCL 220R
10 23 D
RE2/AN7/CS RC4/SDI/SDA
24 E
RC5/SDO
25 F
RC6/TX/CK
26 G
RC7/RX/DT
R1
19 R2
RD0/PSP0
20 R3
100R
RD1/PSP1
21 R4
100R
RD2/PSP2
RD3/PSP3
22 R5
100R
27 R6
100R
RD4/PSP4
28 R7
100R
RD5/PSP5
29 R8
100R
RD6/PSP6
30 100R
RD7/PSP7
100R
PIC16F877
D8 D3 D1 D2 D12 D11 D9 D10
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED
LED-RED

PIC.DSN

BÀI 24 : CHƯƠNG TRÌNH ĐIỂU KHIỂN 8 LED ĐƠN NỐI VỚI PORTD :
KHI NHẤN NÚT NHẤN 1 (NỐI VỚI CHÂN RB6) LED SÁNG DỊCH SANG TRÁI
KHI NHẤN NÚT NHẤN 2 (NỐI VỚI CHÂN RB7) LED SÁNG DỊCH SANG PHẢI
(SƠ ĐỒ MẠCH HÌNH TRÊN)

TITLE "2 NUT NHAN DICH TRAI_DICH PHAI LED DON.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &_HS_OSC & _LVP_OFF
;-----------------------------------------------------------------------------------
;Khai bao hang va cac bien
SW1 EQU 6
SW2 EQU 7
STATUS EQU 0x03
PORTB EQU 0x06
TRISB EQU 0x86
PORTD EQU 0x08
TRISD EQU 0x88
COUNT EQU 0x20
COUNT3 EQU 0x21
;=============================
ORG 0x000

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_73

GOTO INIT
ORG 0x005
;=====================================
;KHAI BAO PORT I/O
;====================================================
INIT
BCF STATUS,RP1
BSF STATUS,RP0 ; CHON BANK1
MOVLW b'11111111'
MOVWF TRISB ; CHAN RB0 VA RB1 INPUT, CON LAI LA OUTPUT
CLRF TRISD ; PORTA LA OUTPUT
BCF STATUS,RP0 ; VE BANK0
MOVLW b'00000001'
CLRC
;===========================
;CHUONG TRINH LAP VONG
;===============================
MAIN
MOVLW b'00000001'
CLRC
MOVWF PORTD
KTRA
BTFSC PORTB,SW1
GOTO KHONG_NHAN_SW1
CALL DELAY
C1 BTFSS PORTB,SW1
GOTO C1
CALL DELAY
XOAY_TRAI
RLF PORTD,1
BTFSS STATUS,0
GOTO KTRA
MOVLW b'00000001'
MOVWF PORTD
CLRC
GOTO KTRA
;===============================================
KHONG_NHAN_SW2
GOTO KTRA
;==================================================
KHONG_NHAN_SW1

BTFSC PORTB,SW2
GOTO KHONG_NHAN_SW2
CALL DELAY
C2 BTFSS PORTB,SW2
GOTO C2
CALL DELAY
XOAY_PHAI
RRF PORTD,1
BTFSS STATUS,0
GOTO KTRA
MOVLW b'10000000'
MOVWF PORTD
CLRC
GOTO KTRA

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_74 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;======================================
;CHUONG TRINH DELAY
;===========================================
DELAY
MOVLW 0xFF
MOVWF COUNT3
D2
DECFSZ COUNT3
GOTO D2
RETURN
;======================================

END

;*****************************************************

BÀI 26 : CHƯƠNG TRÌNH NGẮT NGOÀI RB0, TĂNG GIÁI TRỊ TỪ O DẾN 99, HIỂN THỊ RA 2 LED 7
ĐOẠN NỐI VỚI PORTD

VCC

R1
10k VCC
UP

Q1
2N2222

U1 R3R4R5R6R7R8R9
330R
330R
330R
330R
330R
330R
330R
13 33
OSC1/CLKIN RB0/INT
14 34
OSC2/CLKOUT RB1
1 35
MCLR/Vpp/THV RB2
36
2
RB3/PGM
37 Q2
RA0/AN0 RB4 2N2222
3 38
RA1/AN1 RB5
4 39
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
6 R10
RA4/T0CKI
7
RA5/AN4/SS RC0/T1OSO/T1CKI
15 R11
16 1k
RC1/T1OSI/CCP2
8 17 1k
RE0/AN5/RD RC2/CCP1
9 18
RE1/AN6/WR RC3/SCK/SCL
10 23
RE2/AN7/CS RC4/SDI/SDA
24
RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_75

TITLE "NGAT TANG DEM.ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC &_WRT_OFF &
_LVP_OFF & _CPD_OFF
;--------------------------------------------------------------
;Khai bao hang
;--------------------------------------------------------------
count1 EQU 0x21
counta EQU 0x28
countb EQU 0x27
COUNT2 EQU 0x22
CHUC EQU 0x23
DVI EQU 0x24
BIEN1 EQU 0x25
BIEN2 EQU 0x26
;=============================
ORG 0x000
GOTO INIT
ORG 0x008
;=====================================
;CHUONG TRINH NGAT
;=====================================
ORG 0x04 ; VECTO NGAT NGOAI RB0
INCF DVI
MOVF DVI,0
XORLW D'10'
BTFSS STATUS,Z
GOTO EXIT
MOVLW 0x00
MOVWF DVI
INCF CHUC
MOVF CHUC,0
XORLW D'10'
BTFSS STATUS,Z
GOTO EXIT
MOVLW 0x00
MOVWF CHUC
EXIT
BCF INTCON,1
RETFIE
;==================================================
;KHAI BAO NGAT
;=================================================
INIT
BSF INTCON,7 ;CHO PHEP NGAT TOAN CUC
BSF INTCON,4 ;CHO PHEP NGAT NGOAI RB0 INT
BCF INTCON,1 ; XOA CO NGAT INTF
;=====================================================
;KHAI BAO PORT I/O
;====================================================
BSF STATUS,5 ; CHON BANK1
MOVLW b'00001111'

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_76 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

MOVWF TRISB ; CHAN RB0 VA RB1 INPUT, CON LAI LA OUTPUT


CLRF TRISD ; PORTA LA OUTPUT
CLRF TRISC
BCF STATUS,5 ; VE BANK0
CLRF PORTD
CLRF PORTC
CLRF PORTB
MOVLW 0x00
MOVWF CHUC
MOVLW 0x00
MOVWF DVI
;=============================
;CHUONG TRINH CHINH
;===========================
MAIN
CALL BCD_7DOAN
CALL HIENTHI
GOTO MAIN
;==============================
;CHUONG TRINH DELAY
;==============================
BCD_7DOAN
MOVF DVI,0
CALL TABLE
MOVWF BIEN1
MOVF CHUC,0
CALL TABLE
MOVWF BIEN2
RETURN
;==============================
HIENTHI
MOVF BIEN1,0
MOVWF PORTD
MOVLW B'00000001'
MOVWF PORTC
CALL delay_1ms
MOVF BIEN2,0
MOVWF PORTD
MOVLW B'00000010'
MOVWF PORTC
CALL delay_1ms
RETURN
;======================================
;CHUONG TRINH DELAY
;===========================================

delay_1ms
MOVLW d'10'
MOVWF count1
d1
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_77

DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN

;======================================
DELAY
CLRF COUNT2
D1 DECFSZ COUNT2
GOTO D1
RETURN
;======================================
TABLE ADDWF PCL,1
DT 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90

END

;****************************************************************************

C1

33p
X1 U1
CRYSTAL 13 33
OSC1/CLKIN RB0/INT
14 34
C2 1
OSC2/CLKOUT RB1
35
MCLR/Vpp/THV RB2
36
2
RB3/PGM
37 LCD1
RA0/AN0 RB4 LM016L
33p 3 38
RA1/AN1 RB5
4 39
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
6
RA4/T0CKI
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
8 17
RE0/AN5/RD RC2/CCP1
VDD
VSS

VEE

R1 9 18
RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
RE1/AN6/WR RC3/SCK/SCL
E

10k 10 23
RE2/AN7/CS RC4/SDI/SDA
24
RC5/SDO
1
2
3

4
5
6

7
8
9
10
11
12
13
14
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

BÀI 27 : CHƯƠNG TRÌNH HIỂN THỊ LCD ML016L

;LCD.ASM MPB 4-12-05


;
; Outputs fixed and variable characters
; to 16x2 LCD in 4-bit mode
;
; Version 2.0: Initialisation modified
; Status: Tested OK in simulation mode
;

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_78 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROCESSOR 16F877
; Clock = XT 4MHz, standard fuse settings
__CONFIG 0x3731
; LABEL EQUATES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INCLUDE "P16F877.INC" ; Standard labels
Timer1 EQU 20 ; 1ms count register
TimerX EQU 21 ; Xms count register
Var EQU 22 ; Output variable
Point EQU 23 ; Program table pointer
Select EQU 24 ; Copy of RS bit
OutCod EQU 25 ; Temp store for output
RS EQU 1 ; Register select bit
E EQU 2 ; Display enable
; PROGRAM BEGINS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0x000 ; Place machine code
NOP ; for ICD mode
BANKSEL TRISD ; Select bank 1
CLRW ; All outputs
MOVWF TRISD ; Initialise display port
BANKSEL PORTD ; Select bank 0
CLRF PORTD ; Clear display outputs
GOTO Start ; Jump to main program
; SUBROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 1ms delay with 1us cycle time (1000 cycles)-------------------
Onems
MOVLW D'249' ; Count for 1ms delay
MOVWF Timer1 ; Load count
Loop1
NOP ; Pad for 4 cycle loop
DECFSZ Timer1 ; Count
GOTO Loop1 ; until Z
RETURN ; and finish
; Delay Xms, X received in W -----------------------------------
Xms
MOVWF TimerX ; Count for X ms
LoopX
CALL Onems ; Delay 1ms
DECFSZ TimerX ; Repeat X times
GOTO LoopX ; until Z
RETURN ; and finish
; Generate data/command clock siganl E -------------------------
PulseE
BSF PORTD,E ; Set E high
CALL Onems ; Delay 1ms
BCF PORTD,E ; Reset E low

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_79

CALL Onems ; Delay 1ms


RETURN ; done
; Send a command byte in two nibbles from RB4 - RB7 ------------
Send
MOVWF OutCod ; Store output code
ANDLW 0F0 ; Clear low nybble
MOVWF PORTD ; Output high nybble
BTFSC Select,RS ; Test RS bit
BSF PORTD,RS ; and set for data
CALL PulseE ; and clock display
CALL Onems ; wait 1ms for display
SWAPF OutCod ; Swap low/high nybbles
MOVF OutCod,W ; Retrieve output code
ANDLW 0F0 ; Clear low nybble
MOVWF PORTD ; Output low nybble
BTFSC Select,RS ; Test RS bit
BSF PORTD,RS ; and set for data
CALL PulseE ; and clock display
CALL Onems ; wait 1ms for display
RETURN ; done
;Table of fixed characters to send ----------------------------
Line1
ADDWF PCL ; Modify program counter
RETLW 'C' ; Pointer = 0
RETLW 'O' ; Pointer = 1
RETLW 'N' ; Pointer = 2
RETLW 'S' ; Pointer = 3
RETLW 'T' ; Pointer = 4
RETLW ':' ; Pointer = 5
RETLW '0' ; Pointer = 6
RETLW '1' ; Pointer = 7
RETLW '2' ; Pointer = 8
RETLW '3' ; Pointer = 9
RETLW '4' ; Pointer = 10
RETLW '5' ; Pointer = 11
RETLW '6' ; Pointer = 12
RETLW '7' ; Pointer = 13
RETLW '8' ; Pointer = 14
RETLW '9' ; Pointer = 15
Line2
ADDWF PCL ; Modify program counter
RETLW 'V' ; Pointer = 0
RETLW 'A' ; Pointer = 1
RETLW 'R' ; Pointer = 2
RETLW 'I' ; Pointer = 3
RETLW 'A' ; Pointer = 4

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_80 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

RETLW 'B' ; Pointer = 5


RETLW 'L' ; Pointer = 6
RETLW 'E' ; Pointer = 7
RETLW ' ' ; Pointer = 8
RETLW '=' ; Pointer = 9
RETLW ' ' ; Pointer = 10
; Initialise the display ----------------------------------------
Init
MOVLW D'100' ; Load count 100ms delay
CALL Xms ; and wait for display
MOVLW 0F0 ; Mask for select code
MOVWF Select ; High nybble not masked
MOVLW 0x30 ; Load initial nibble
MOVWF PORTD ; and output it to display
CALL PulseE ; Latch initial code
MOVLW D'5' ; Set delay 5ms
CALL Xms ; and wait
CALL PulseE ; Latch initial code again
CALL Onems ; Wait 1ms
CALL PulseE ; Latch initial code again
BCF PORTD,4 ; Set 4-bit mode
CALL PulseE ; Latch it
MOVLW 0x28 ; Set 4-bit mode, 2 lines
CALL Send ; and send code
MOVLW 0x08 ; Switch off display
CALL Send ; and send code
MOVLW 0x01 ; Clear display
CALL Send ; and send code
MOVLW 0x06 ; Enable cursor auto inc
CALL Send ; and send code
MOVLW 0x80 ; Zero display address
CALL Send ; and send code
MOVLW 0x0C ; Turn on display
CALL Send ; and send code
RETURN ; Done
; Send the fixed message to the display ------------------------
OutMes
CLRF Point ; Reset table pointer
BSF Select,RS ; Select data mode

;=======================================
Mess1
MOVF Point,W ; and load it
CALL Line1 ; Get ASCII code from table
CALL Send ; and do it
INCF Point ; point to next character

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_81

MOVF Point,W ; and load the pointer


SUBLW D'16' ; check for last table item
BTFSS STATUS,Z ; and finish if 16 done
GOTO Mess1 ; Output character code
MOVLW 0xC0 ; Move cursor to line 2
BCF Select,RS ; Select command mode
CALL Send ; and send code
CLRF Point ; Reset table pointer
;=====================================
Mess2
MOVF Point,W ; and load it
CALL Line2 ; Get fixed character
BSF Select,RS ; Select data mode
CALL Send ; and send code
INCF Point ; next character
MOVF Point,W ; Reload pointer
SUBLW D'11' ; and check for last
BTFSS STATUS,Z ; Skip if last
GOTO Mess2 ; or send next
RETURN ; done
;==========================================
OutVar
CLRF Var ; Clear variable number
MOVLW 0X30 ; Load offset to be added
ADDWF Var ; to make ASCII code (30-39)
Next
MOVF Var,W ; Load the code
BSF Select,RS ; Select data mode
CALL Send ; and send code
MOVLW 0xCB ; code to move cursor back
BCF Select,RS ; Select command mode
CALL Send ; and send code
MOVLW D'250' ; Load count to wait 250ms
CALL Xms ; so numbers are visible
INCF Var ; Next number
MOVF Var,W ; Load number
SUBLW 0x3A ; Check for last (10=A)
BTFSS STATUS,Z ; and skip if last
GOTO Next ; or do next number
GOTO OutVar ; Repeat from number Z
; MAIN PROGRAM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Start
CALL Init ; Initialise the display
CALL OutMes ; Display fixed characters
GOTO OutVar ; Display an endless count
END ; of source code ;;;;;;;;;

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_82 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;****************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_83

BÀI 28 : CHƯƠNG TRÌNH HIỂN THỊ CHỮ A RA LED MATRIX

PHƯƠNG ÁN 1:

C3

27p
X1
4MHz
C2
U1
27p 13 33 H1
OSC1/CLKIN RB0/INT
14 34 H2
OSC2/CLKOUT RB1
35 H3
RB2
2 36 H4
RA0/AN0 RB3/PGM

C8
C7
C6
C5
C4
C3
C2
C1
3 37 H5
RA1/AN1 RB4
4 38 H6
RA2/AN2/VREF-/CVREF RB5
5 39 H7
RA3/AN3/VREF+ RB6/PGC
6 40 H8
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
C4 1
MCLR/Vpp/THV RC5/SDO
24
1u 25
RC6/TX/CK
26
RC7/RX/DT
19 C1
RD0/PSP0
20 C2
RD1/PSP1 C3
21
RD2/PSP2
R1 RD3/PSP3
22 C4
27 C5
10k RD4/PSP4

H8
H7
H6
H5
H4
H3
H2
H1
28 C6
RD5/PSP5
29 C7
RD6/PSP6
30 C8
RD7/PSP7
PIC16F877A

VCC

BẢNG MÃ LED CHỮ A ĐƯỢC THÀNH LẬP NHƯ SAU:

CỘT C1 C2 C3 C4 C5 C6 C7 C8 HEX
0 1 1 1 1 1 1 1
H1 0 0 1 0 0 0 0 0 20H
H2 0 1 0 1 0 0 0 0 50H
H3 1 0 0 0 1 0 0 0 88H
H4 1 0 0 0 1 0 0 0 88H
H5 1 1 1 1 1 0 0 0 F8H
H6 1 0 0 0 1 0 0 0 88H
H7 1 0 0 0 1 0 0 0 88H
H8 1 0 0 0 1 0 0 0 88H

PHƯƠNG PHÁP HIỂN THỊ: DỪ LIỆU BẢNG MÃ ĐƯA VÀO HÀNG, QUÉT CỘT.

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_84 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

TITLE "HIEN THI CHU A RA LED MA TRAN.ASM"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &
_HS_OSC & _LVP_OFF & _CPD_OFF
;================ ==============================================
COUNT1 EQU 0x20
COUNT2 EQU 0x21
COUNT EQU 0x22
BXOAY EQU 0x23
A EQU 0x24
DEM EQU 0x25
;================ ================================
;CHUONG TRINH CHINH
;=================== ============================
ORG 0x000
GOTOSTART
;=============================================
START
;===================================
;KHOI TAO PORT
;===========================================
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
CLRF TRISD
BCF STATUS,RP0
CLRF PORTB
CLRF PORTD
CLRF DEM
;============================================
;VONG LAP CHUONG TRINH
;===========================================
MAIN
CLRF DEM
CALL TABLE
MOVWF PORTB
MOVLW b'11111110'
MOVWF PORTD
BSF STATUS,0
LOOP
CALL DELAY
RLF PORTD,1
BTFSC STATUS,0
GOTOLOOP1

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_85

GOTOMAIN
LOOP1
INCF DEM
CALL TABLE
MOVWF PORTB
GOTOLOOP

;====================================================
;CAC CHUONG TRINH CON
;==================================================
TABLE

MOVF DEM,W
ADDWF PCL,1
DT 0x20,0x50,0x88,0x88,0x0F8,0x88,0x88,0x88

;======================== ===============================
DELAY
MOVLW 0xFF
MOVWF A
DEL1
DECFSZ A
GOTO DEL1
RETURN
END
;**********************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_86 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

PHƯƠNG ÁN 2:

C3

27p
X1
4MHz
C2
U1
27p 13 33 H1
OSC1/CLKIN RB0/INT

C1
C2
C3
C4
C5
C6
C7
C8
14 34 H2
OSC2/CLKOUT RB1
35 H3
RB2
2 36 H4
RA0/AN0 RB3/PGM
3 37 H5
RA1/AN1 RB4
4 38 H6
RA2/AN2/VREF-/CVREF RB5
5 39 H7
RA3/AN3/VREF+ RB6/PGC
6 40 H8
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
23
RC4/SDI/SDA
C4 1
MCLR/Vpp/THV RC5/SDO
24
1u 25
RC6/TX/CK
26
RC7/RX/DT
19 C1
RD0/PSP0
20 C2
RD1/PSP1
21 C3

H8
H7
H6
H5
H4
H3
H2
H1
RD2/PSP2
R1 RD3/PSP3
22 C4
10k 27 C5
RD4/PSP4
28 C6
RD5/PSP5
29 C7
RD6/PSP6
30 C8
RD7/PSP7
PIC16F877A

VCC

BẢNG MÃ LED CHỮ A ĐƯỢC THÀNH LẬP NHƯ SAU:

CỘT C1 C2 C3 C4 C5 C6 C7 C8
DỮ LIỆU 1 0 0 0 0 0 0 0
H8 1 1 0 1 1 1 1 1
H7 1 0 1 0 1 1 1 1
H6 0 1 1 1 0 1 1 1
H5 0 1 1 1 0 1 1 1
H4 0 0 0 0 0 1 1 1
H3 0 1 1 1 0 1 1 1
H2 0 1 1 1 0 1 1 1
H1 0 1 1 1 0 1 1 1
HEX C0 B7H 77H B7H C0H FFH FFH FFH
H

PHƯƠNG PHÁP HIỂN THỊ: DỪ LIỆU BẢNG MÃ ĐƯA VÀO CỘT, QUÉT HÀNG.

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_87

TITLE "LED MA TRAN HIEN THI CHU A.ASM"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC &
_LVP_OFF & _CPD_OFF
;===================== ================================================
COUNT1 EQU 0x20
COUNT2 EQU 0x21
COUNT EQU 0x22
BXOAYEQU 0x23
A EQU 0x24
DEM EQU 0x25

;========================== =========================================
;CHUONG TRINH CHINH
;============================= =======================================

ORG 0x000
GOTO START
;=============================================
START
;===================================
;KHOI TAO PORT
;===========================================
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
CLRF TRISD
BCF STATUS,RP0
CLRF PORTB
CLRF PORTD
;============================================
;VONG LAP CHUONG TRINH
;===========================================
MAIN
CLRF DEM
CALL TABLE
MOVWF PORTB
MOVLW b'00000001'
MOVWF PORTD
BCF STATUS,0
LOOP
CALL DELAY
RLF PORTD,1
BTFSS STATUS,0
GOTO LOOP1
GOTO MAIN
LOOP1
INCF DEM
CALL TABLE
MOVWF PORTB
GOTO LOOP

;====================================================
;CAC CHUONG TRINH CON

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_88 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;==================================================
TABLE

MOVF DEM,W
ADDWF PCL,1
DT 0xC0,0xB7,0x77,0xB7,0xC0,0xFF,0xFF,0xFF
;=================================================================
DELAY
MOVLW 0xFF
MOVWF A
DEL1
DECFSZ A
GOTO DEL1
RETURN
END

;****************************************************************************

BÀI 28B : CHƯƠNG TRÌNH HIỂN THỊ VÀ DỊCH CHỮ “SPKT” RA LED MATRIX

TITLE "LED MA TRAN DICH CHU SPKT.ASM"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &
_HS_OSC & _LVP_OFF & _CPD_OFF
;======================================================
COUNT1 EQU 0x20
COUNT2 EQU 0x21
COUNT EQU 0x22
BXOAY EQU 0x23
A EQU 0x24
DEM EQU 0x25
;==================================================
;CHUONG TRINH CHINH
;==================================================
ORG 0x000
GOTOSTART
ORG 0x008
;=======================================
START
;===================================
;KHOI TAO PORT
;=======================================
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISB
CLRF TRISD
BCF STATUS,RP0
;==========================================
;VONG LAP CHUONG TRINH

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_89

;==========================================
MAIN
CALL DICH_PHAI
CALL DICH_TRAI
GOTOMAIN
;==========================================
DICH_TRAI
MOVLW D'44'
MOVWF DEM
LOOP4
DECFSZ DEM
MOVLW D'5'
MOVWF COUNT1
LOOP1
MOVLW D'10'
MOVWF COUNT2
LOOP3
MOVLW H'80' ;SUA
MOVWF BXOAY
MOVF DEM,0
MOVWF COUNT
LOOP2
MOVF COUNT,0
CALL TABLE
MOVWF PORTB
MOVF BXOAY,0
MOVWF PORTD
CALL DELAY
MOVLW 0x00
MOVWF PORTD
DECF COUNT,0
XORLW D'0'
BTFSC STATUS,Z
GOTOLOOP11
DECF COUNT,1
RRF BXOAY ;CO SUA
GOTOLOOP2
LOOP11
DECFSZ COUNT2
GOTO LOOP3
DECFSZ COUNT1
GOTO LOOP1
MOVF DEM,0
XORLW D'1'
BTFSC STATUS,Z
GOTOEXIT

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_90 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

GOTOLOOP4
;=========================================
EXIT
RETURN
;=========================================
DICH_PHAI
MOVLW 0x00
MOVWF DEM
LOOPP4
INCF DEM,1
MOVLW D'5'
MOVWF COUNT1
LOOPP1
MOVLW D'10'
MOVWF COUNT2
LOOPP3
MOVLW H'01'
MOVWF BXOAY
MOVF DEM,0
MOVWF COUNT
LOOPP2
MOVF COUNT,0
CALL TABLE
MOVWF PORTB
MOVF BXOAY,0
MOVWF PORTD
CALL DELAY
MOVLW 0x00
MOVWF PORTD
INCF COUNT,0
XORLW D'44'
BTFSC STATUS,Z
GOTOLOOPP11
INCF COUNT,1
RLF BXOAY
GOTOLOOPP2
LOOPP11
DECFSZ COUNT2
GOTO LOOPP3
DECFSZ COUNT1
GOTO LOOPP1
MOVF DEM,0
XORLW D'43'
BTFSC STATUS,Z
GOTOEXIT
GOTOLOOPP4

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_91

;=================================================
;CAC CHUONG TRINH CON
;=================================================
TABLE
ADDWF PCL,1
DT 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
DT 0xff,0xff,0xcd,0xb6,0xb6,0xd9
DT 0xff,0xff,0x80,0xb7,0xb7,0xcf
DT 0xff,0xff,0x80,0xeb,0xdd,0xbe
DT 0xff,0xff,0xbf,0xbf,0x80,0xbf,0xbf
DT 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
;==========================================================
DELAY
MOVLW 0xFF
MOVWF A
DEL1
DECFSZ A
GOTO DEL1
RETURN
END
;=============================================================

*********************************************************************************

BÀI 29 : CHƯƠNG TRÌNH CANKEY HIỂN THỊ RA LED 7 DOẠN

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_92 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

CATOT CHUNG

VCC

Q1
2N2222
C2 C1
33p 33p R3R4R5R6R7R8R9 R10
X1 330R
330R
330R
330R
330R
330R
330R
RA0
Q2
1k
2N2222

G
C
D
A
B

E
F
CRYSTAL U1
13 33 A
14
OSC1/CLKIN RB0/INT
34 B RA1
R11
OSC2/CLKOUT RB1 Q3

VCC
35 C
RB2 1k 2N2222
RA0 2
RA0/AN0 RB3/PGM
36 D R14 R12 R13
RA1 3 37 E 10k 10k 10k
VCC RA2 RA1/AN1 RB4 F
4 38 R2
RA3 RA2/AN2/VREF-/CVREF RB5 G
5 39
RA4 RA3/AN3/VREF+ RB6/PGC RA2
6 40
RA4/T0CKI/C1OUT RB7/PGD
RA5 7 RD0
RA5/AN4/SS/C2OUT
15 RD1
1k Q4
RC0/T1OSO/T1CKI 2N2222
R1 8
RE0/AN5/RD RC1/T1OSI/CCP2
16 RD2
10k 9 17
RE1/AN6/WR RC2/CCP1
10 18
RESET RE2/AN7/CS RC3/SCK/SCL
23
RSET RSET RC4/SDI/SDA RA3
R15
1 24

3
MCLR/Vpp/THV RC5/SDO
25 1k
RC6/TX/CK
RC7/RX/DT
26 RD4
A 1 2 3
19 RD0
RD0/PSP0 RD1
20
RD1/PSP1
RD2/PSP2
RD3/PSP3
21
22
RD2
RD3
RD5
B 4 5 6
27 RD4
RD4/PSP4
28 RD5
RD5/PSP5
RD6/PSP6
RD7/PSP7
29
30
RD6
RD7
RD6
C 7 8 9
PIC16F877A
RD7
D 0 #

BÀI 29A: CHƯƠNG TRÌNH HIỂN THỊ GIÁ TRỊ QUÉT PHÍM MA TRẬN RA 2 LED 7 ĐOẠN, BAN ĐẦU
HIỂN THỊ SỐ 00, SAU KHI NHẤN PHÍM THÌ GIÁ TRỊ CỦA ĐƠN VỊ ĐƯỢC CHUYỂN SANG HÀNG
CHỤC, CÒN GIÁ TRỊ CỦA PHÍM NHẤN CHUYỂN SANG HÀNG ĐƠN VỈ.

TITLE "SCANKEY_ 2 LED 7 DOAN"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC
&_WRT_OFF & _LVP_OFF & _CPD_OFF
;--------------------------------------------------------------
PCL EQU 0x02
STATUS EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
PORTC EQU 0x07 ; 7-Segment display
PORTD EQU 0x08 ; 3x4 keypad
TRISA EQU 0x85
TRISB EQU 0x86
TRISC EQU 0x87 ; Data direction
TRISD EQU 0x88 ; registers
Key EQU 0x20 ; Count of keys
count1 EQU 0x21
counta EQU 0x22
countb EQU 0x23
DVI EQU 0x24

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_93

DVITAM EQU 0x25


CHUC EQU 0x26
CHUCTAM EQU 0x27
BIEN1 EQU 0x28
BIEN2 EQU 0x29
KEYSAVE EQU 0x30
;=============================================
ORG 0x0000
GOTOSTART
ORG 0x008

; Initialise ports.........................................
START
BANKSEL TRISC ; Display
CLRF TRISA
CLRF TRISC ;
CLRF TRISB
MOVLW B'00000111' ; Keypad
MOVWF TRISD ; bidirectional
BANKSEL PORTC ; Display off
CLRF PORTC ; initially
CLRF PORTB
CLRF PORTA
CLRF DVI
CLRF CHUC
CLRF DVITAM
GOTOMAIN ; jump to main
; Check a row of keys .....................................
row
INCF Key ; Count first key
BTFSS PORTD,0 ; Check key
GOTO GET_KEY ; and quit if on
INCF Key ; and repeat
BTFSS PORTD,1 ; for second
GOTO GET_KEY ; key
INCF Key ; and repeat
BTFSS PORTD,2 ; for third
GOTO GET_KEY ; key
GOTO next ; go for next row
; Scan the keypad..........................................
MAIN
MOVLW 0xFF
MOVWF PORTD
CLRF Key ; Zero key count
BSF 3,0 ; Set Carry Flag
BCF PORTD,4 ; Select first row PORTD = 11101111

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_94 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

newrow
GOTO row ; check row
next
BSF PORTD,3 ; Set fill bit
RLF PORTD ; Select next row
BTFSC 3,0 ; 0 into carry flag?
GOTO newrow ; if not, next row
GOTO NOT_KEY ; if so, start again

GET_KEY
CALL delay_50ms
MOVF DVI,W
MOVWF DVITAM
CLRW
MOVF Key,W
MOVWF DVI
CLRW
MOVF DVITAM,W
MOVWF Key
CLRW
MOVF Key,W
MOVWF CHUC
CLRW

NOT_KEY
CALL BCD_7DOAN
CALL HIENTHI
GOTOMAIN
;==============================
BCD_7DOAN
MOVF DVI,W
CALL table
MOVWF BIEN1
MOVF CHUC,W
CALL table
MOVWF BIEN2
RETURN
;==============================
HIENTHI
MOVF BIEN1,0
MOVWF PORTB
MOVLW B'000001'
MOVWF PORTA
CALL delay_1ms
MOVF BIEN2,0
MOVWF PORTB

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_95

MOVLW B'000010'
MOVWF PORTA
CALL delay_1ms
RETURN
;======================================
delay_1ms
MOVLW d'10'
MOVWF count1
d1
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN
;=====================================
delay_50ms
MOVLW d'50'
MOVWF count1
CALL d1
RETURN
; Display code table.......................................
table
ADDWF PCL ; and calculate jump
DT 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
; Output display code......................................

END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;***************************************************************
BÀI 29B: CHƯƠNG TRÌNH HIỂN THỊ GIÁ TRỊ QUÉT PHÍM MA TRẬN RA 4 LED 7 ĐOẠN, BAN ĐẦU
HIỂN THỊ SỐ 0000, SAU KHI NHẤN PHÍM THÌ GIÁ TRỊ CỦA PHÍM NHẤN ĐƯỢC DỊCH TỪ HÀNG DƠN
VỊ DẾN HÀNG NGHÌN SAU MỖI LẦN CÓ PHÍM DƯỢC NHẤN.

TITLE "SCANKEY_ 4 LED 7 DOAN"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC
&_WRT_OFF & _LVP_OFF & _CPD_OFF
;--------------------------------------------------------------
PCL EQU 0x02

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_96 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

STATUS EQU 0x03


PORTA EQU 0x05
PORTB EQU 0x06
PORTC EQU 0x07 ; 7-Segment display
PORTD EQU 0x08 ; 3x4 keypad
TRISA EQU 0x85
TRISB EQU 0x86
TRISC EQU 0x87 ; Data direction
TRISD EQU 0x88 ; registers
Key EQU 0x20 ; Count of keys
count1 EQU 0x21
counta EQU 0x22
countb EQU 0x23
DVI EQU 0x24
DVITAM EQU 0x25
CHUC EQU 0x26
CHUCTAM EQU 0x27
BIEN1 EQU 0x28
BIEN2 EQU 0x29
BIEN3 EQU 0x30
BIEN4 EQU 0x31
KEYSAVE EQU 0x32
TRAM EQU 0x33
NGHIN EQU 0x34
TRAMTAM EQU 0x35
NGHINTAM EQU 0x36
;=============================================
ORG 0x0000
GOTOSTART
ORG 0x008

; Initialise ports.........................................
START
BANKSEL TRISA ; CHON BANK1
CLRF TRISA ‘PORTA OUTPUT
CLRF TRISB ‘PORTB OUTPUT
MOVLW B'00000111' ; Keypad
MOVWF TRISD ; bidirectional
BANKSEL PORTB ; CHON BANK1
CLRF PORTB
CLRF PORTA
CLRF DVI
CLRF CHUC
CLRF TRAM
CLRF NGHIN
CLRF DVITAM

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_97

GOTO MAIN ; jump to main


; Check a row of keys .....................................
row
INCF Key ; Count first key
BTFSS PORTD,0 ; Check key
GOTO GET_KEY ; and quit if on
INCF Key ; and repeat
BTFSS PORTD,1 ; for second
GOTO GET_KEY ; key
INCF Key ; and repeat
BTFSS PORTD,2 ; for third
GOTO GET_KEY ; key
GOTO next ; go for next row
; Scan the keypad..........................................
MAIN
MOVLW 0xFF
MOVWF PORTD
CLRF Key ; Zero key count
BSF 3,0 ; Set Carry Flag
BCF PORTD,4 ; Select first row PORTD = 11101111
newrow
GOTO row ; check row
next
BSF PORTD,3 ; Set fill bit
RLF PORTD ; Select next row
BTFSC 3,0 ; 0 into carry flag?
GOTO newrow ; if not, next row
GOTO NOT_KEY ; if so, start again

GET_KEY
CALL delay_50ms
MOVF DVI,W
MOVWF DVITAM
MOVF CHUC,W
MOVWF CHUCTAM
MOVF TRAM,W
MOVWF TRAMTAM
MOVF Key,W
MOVWF DVI
MOVF DVITAM,W
MOVWF Key
MOVF Key,W
MOVWF CHUC
MOVF CHUCTAM,W
MOVWF Key
MOVF Key,W

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_98 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

MOVWF TRAM
MOVF TRAMTAM,W
MOVWF Key
MOVF Key,W
MOVWF NGHIN
NOT_KEY
CALL BCD_7DOAN
CALL HIENTHI
GOTOMAIN
;==============================
BCD_7DOAN
MOVF DVI,W
CALL table
MOVWF BIEN1
MOVF CHUC,W
CALL table
MOVWF BIEN2
MOVF TRAM,W
CALL table
MOVWF BIEN3
MOVF NGHIN,W
CALL table
MOVWF BIEN4
RETURN
;==============================
HIENTHI
MOVF BIEN1,0
MOVWF PORTB
MOVLW B'000001'
MOVWF PORTA
CALL delay_1ms
MOVF BIEN2,0
MOVWF PORTB
MOVLW B'000010'
MOVWF PORTA
CALL delay_1ms
MOVF BIEN3,0
MOVWF PORTB
MOVLW B'000100'
MOVWF PORTA
CALL delay_1ms
MOVF BIEN4,0
MOVWF PORTB
MOVLW B'001000'
MOVWF PORTA
CALL delay_1ms

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_99

RETURN
;======================================
delay_1ms
MOVLW d'10'
MOVWF count1
d1
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN
;=====================================
delay_50ms
MOVLW d'50'
MOVWF count1
CALL d1
RETURN
; Display code table.......................................
table
ADDWF PCL ; and calculate jump
DT 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
; Output display code......................................

END
;**********************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_100 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

BÀI 29B: CHƯƠNG TRÌNH HIỂN THỊ CHỮ “SPKT” DICH TỪ PHẢI QUA TRAI DÙNG
IC47HC595 DE DỊCH MÀU CAM, MÀU XANH, MÀU ĐỎ

H8
H7
H6
H5
H4
H3
H2
H1
H8
H7
H6
H5
H4
H3
H2
H1
H8
H7
H6
H5
H4
H3
H2
H1
H8
H7
H6
H5
H4
H3
H2
H1
C2 C3
27p 27p
X1

U6
DRT1 33
RB0/INT OSC1/CLKIN
13
4MHz
10K 34 14
RB1 OSC2/CLKOUT
35
RB2 VCC
Q0X1
Q1X1
Q2X1
Q3X1
Q4X1
Q5X1
Q6X1
Q7X1
Q0X2
Q1X2
Q2X2
Q3X2
Q4X2
Q5X2
Q6X2
Q7X2
Q0L1
Q1L1
Q2L1
Q3L1
Q4L1
Q5L1
Q6L1
Q7L1
Q0L2
Q1L2
Q2L2
Q3L2
Q4L2
Q5L2
Q6L2
Q7L2

36 2
RB3/PGM RA0/AN0
37 3
RB4 RA1/AN1
38 4
RB5 RA2/AN2/VREF-/CVREF

2
3
4
5
6
7
8
9
39 5
RB6/PGC RA3/AN3/VREF+
40 6

VCC
RB7/PGD RA4/T0CKI/C1OUT
7
RA5/AN4/SS/C2OUT
U5 U2
SER-IND 15
RC0/T1OSO/T1CKI R0
SER-INX 16 8
RC1/T1OSI/CCP2 RE0/AN5/RD 10k
Q0L2 15 11 SRCK Q0L1 15 11 SRCK SRCK 17 9
Q1L2 Q0 SH_CP SERD1 Q1L1 Q0 SH_CP SER-IND RCK RC2/CCP1 RE1/AN6/WR
1 14 1 14 18 10
Q2L2 Q1 DS Q2L1 Q1 DS G-D RC3/SCK/SCL RE2/AN7/CS
2 2 23
Q3L2 Q2 RCK Q3L1 Q2 RCK G-X RC4/SDI/SDA
3 12 3 12 24 1
Q4L2 Q3 ST_CP Q4L1 Q3 ST_CP SRCLR-D RC5/SDO MCLR/Vpp/THV
4 4 25
Q5L2 Q4 Q5L1 Q4 SRCLR-X RC6/TX/CK
5 5 26
Q5 Q5 RC7/RX/DT
Q6L2 6
Q6
Q6L1 6
Q6 C1
Q7L2 7 10 SRCLR-D Q7L1 7 10 SRCLR-D H1 19
Q7 MR Q7 MR RD0/PSP0 1u
9 13 G-D SERD1 9 13 G-D H2 20
Q7' OE Q7' OE RD1/PSP1
H3 21
H4 RD2/PSP2
74HC595 74HC595 22
H5 RD3/PSP3
27
U10 U11 H6 28
RD4/PSP4
Q0X2 SRCK Q0X115 SRCK H7 RD5/PSP5
15 11 11 29
Q1X2 Q0 SH_CP SERX1 Q1X1 1 Q0 SH_CP SER-INX H8 RD6/PSP6
1 14 14 30
Q2X2 Q1 DS Q2X1 2 Q1 DS RD7/PSP7
2
Q3X2 Q2 RCK Q3X1 3 Q2 RCK
3 12 12 PIC16F877A
Q4X2 Q3 ST_CP Q4X1 4 Q3 ST_CP
4
Q4 Q4
Q5X2 5 Q5X1 5
1

2
3
4
5
6
7
8
9
Q5 Q5
Q6X2 6 Q6X1 6
Q6 Q6
Q7X2 7 10 SRCLR-X Q7X1 7 10 SRCLR-X
Q7 MR Q7 MR
9 13 G-X SERX1 9 13 G-X
Q7' OE Q7' OE VCC
74HC595 74HC595 DRT2
10K

TITLE "LED MA TRAN DICH CHU SPKT 3 MAU IC74HC595.ASM"


PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON &
_HS_OSC & _LVP_OFF & _CPD_OFF
;========================================================
PORTC EQU 07H
TRISC EQU 87H
PORTD EQU 08H
TRISD EQU 88H
STATUS EQU 03H

COUNT1 EQU 0x20


COUNT2 EQU 0x21
COUNT EQU 0x22
BXOAY EQU 0x23
A EQU 0x24
DEM EQU 0x25
R0 EQU 0x26
R1 EQU 0x27
R2 EQU 0x28
R3 EQU 0x29
R4 EQU 0x30
R5 EQU 0x31

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_101

HANG EQU PORTD


SERD EQU 0 ;DATA VAO 2
SERX EQU 1 ;DATA VAO 1
SRCK EQU 2
RCK EQU 3
GD EQU 4
GX EQU 5
CLRD EQU 6
CLRX EQU 7

;=====================================
;CHUONG TRINH CHINH
;======================================
ORG 0x000
GOTOSTART
ORG 0x008
;=============================================
START
;===================================
;KHOI TAO PORT
;===========================================
BCF STATUS,RP1
BSF STATUS,RP0
CLRF TRISC
CLRF TRISD
BCF STATUS,RP0
;============================================
;VONG LAP CHUONG TRINH
;===========================================
MAIN
CALL CAM
CALL XANH
CALL DO
GOTOMAIN

;==================================================
XANH
BCF PORTC,SRCK
BCF PORTC,RCK
BSF PORTC,GD
BCF PORTC,CLRX
MOVLW 0x00
MOVWF DEM

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_102 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;---------------------------------------------------------------------
X33

MOVLW D'2'
MOVWF R0 ;CHU KY QUET
INCF DEM,1

;------------------------------------------------------------------------------------
X22
BSF PORTC,SERX ;NGO VAO DATA = 1

BCF PORTC,CLRX
BSF PORTC,CLRX ;CHO PHEP COT XANH

MOVLW D'16'
MOVWF R1 ;SO COT QUET 16
MOVF DEM,0
MOVWF COUNT
;------------------------------------------------------------------------------------------
X11
BSF PORTC,SRCK ;CK TAC DONG
BCF PORTC,SRCK

BSF PORTC,RCK
BCF PORTC,RCK
MOVF COUNT,0
CALL TABLE
MOVWF HANG

BCF PORTC,GX
CALL DELAY
BSF PORTC,GX
BCF PORTC,SERX

INCF COUNT,0
XORLW D'57'
BTFSC STATUS,Z
GOTOLOOP11
INCF COUNT,1
GOTOX11

LOOP11
DECFSZ R1
GOTOX11
DECFSZ R0
GOTOX22

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_103

MOVF DEM,0
XORLW D'56'
BTFSC STATUS,Z
GOTOEXIT
GOTOX33
;===========================================
EXIT
RETURN
;============================================
DO

BCF PORTC,SRCK
BCF PORTC,RCK
BSF PORTC,GX
BCF PORTC,GD
MOVLW 0x00
MOVWF DEM

;-------------------------------------------------------------------------------
D33

MOVLW D'2'
MOVWF R0 ;CHU KY QUET
INCF DEM,1

;-----------------------------------------------------------------------------------
D22
BSF PORTC,SERD ;NGO VAO DATA = 2

BCF PORTC,CLRD
BSF PORTC,CLRD ;CHO PHEP COT DO

MOVLW D'16'
MOVWF R1 ;SO COT QUET 16
MOVF DEM,0
MOVWF COUNT
;--------------------------------------------------------------------------------------
D11

BSF PORTC,SRCK ;CK TAC DONG


BCF PORTC,SRCK

BSF PORTC,RCK
BCF PORTC,RCK
MOVF COUNT,0
CALL TABLE

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_104 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

MOVWF HANG

BCF PORTC,GD
CALL DELAY
BSF PORTC,GD
BCF PORTC,SERD

INCF COUNT,0
XORLW D'57'
BTFSC STATUS,Z
GOTOLOOPD11
INCF COUNT,1
GOTOD11
LOOPD11
DECFSZ R1
GOTOD11
;------------------------------------------------------------------------------------
DECFSZ R0
GOTOD22
MOVF DEM,0
XORLW D'56'
BTFSC STATUS,Z
GOTOEXIT
GOTOD33

;====================================================
CAM

BCF PORTC,SRCK
BCF PORTC,RCK
BCF PORTC,GD
BCF PORTC,GX
BCF PORTC,CLRX
BCF PORTC,CLRD
MOVLW 0x00
MOVWF DEM

;-----------------------------------------------------------------------------------
C33

MOVLW D'2'
MOVWF R0 ;CHU KY QUET
INCF DEM,1

;-----------------------------------------------------------------------------------

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_105

C22
BSF PORTC,SERX ;NGO VAO DATA = 1
BSF PORTC,SERD ;NGO VAO DATA = 2
BCF PORTC,CLRX
BSF PORTC,CLRX ;CHO PHEP COT XANH
BCF PORTC,CLRD
BSF PORTC,CLRD ;CHO PHEP COT DO

MOVLW D'16'
MOVWF R1 ;SO COT QUET 16
MOVF DEM,0
MOVWF COUNT
;-------------------------------------------------------------------------------------
C11
BSF PORTC,SRCK ;CK TAC DONG
BCF PORTC,SRCK

BSF PORTC,RCK
BCF PORTC,RCK

MOVF COUNT,0
CALL TABLE
MOVWF HANG

BCF PORTC,GX
BCF PORTC,GD
CALL DELAY
BSF PORTC,GX
BSF PORTC,GD
BCF PORTC,SERX
BCF PORTC,SERD
INCF COUNT,0
XORLW D'57'
BTFSC STATUS,Z
GOTOLOOPC11
INCF COUNT,1
GOTOC11
;----------------------------------------------------------------------------
LOOPC11
DECFSZ R1
GOTOC11

DECFSZ R0
GOTOC22
MOVF DEM,0
XORLW D'56'

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_106 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

BTFSC STATUS,Z
GOTOEXIT
GOTOC33

;==================================================
;CAC CHUONG TRINH CON
;==================================================
TABLE
ADDWF PCL,1
DT 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
DT 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
DT 0xff,0xff,0xcd,0xb6,0xb6,0xd9
DT 0xff,0xff,0x80,0xb7,0xb7,0xcf
DT 0xff,0xff,0x80,0xeb,0xdd,0xbe
DT 0xff,0xff,0xbf,0xbf,0x80,0xbf,0xbf
DT 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
DT 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff
;===================================================
DELAY
MOVLW D'2'
MOVWF R4

DEL1
MOVLW D'100'
MOVWF A
DEL2
DECFSZ A
GOTO DEL2
DECFSZ R4
GOTO DEL1
RETURN
END
;*****************************************************

BÀI 30: THIẾT KẾ PHẦN CỨNG VỚI 2 LED 7 ĐOẠN VÀ 2 NÚT NHẤN UP_DOWN. THỰC HIỆN
CHƯƠNG TRÌNH KHI NHẤN UP (1 LẦN) SỐ HIỂN THỊ TRÊN LED TĂNG 1 ĐƠN VỊ ( KHI TĂNG NẾU
Ở 99 THÌ VỀ 0), KHI NHẤN DOWN (1 LẦN) SỐ HIỂN THỊ TRÊN LED GIẢM 1 ĐƠN VỊ ( KHI GIAM
NẾU Ở 00 THÌ VỀ 99).

HD:

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_107

C1

VCC
33p R3 R1
X1 R4
C2 CRYSTAL 10k 10k 10k UP ANOT CHUNG

33p

VCC
U1
13 33
DOWN
OSC1/CLKIN RB0/INT
R6 14
OSC2/CLKOUT RB1
34
10k 1 35
MCLR/Vpp/THV RB2
36
RB3/PGM
RA0 2 37
RA0/AN0 RB4
RA1 3 38
RA1/AN1 RB5
RA2 4 39
RA2/AN2/VREF- RB6/PGC
RA3 5 40
RA3/AN3/VREF+ RB7/PGD
RA4
RA5
6
RA4/T0CKI R9 A
7
RA5/AN4/SS RC0/T1OSO/T1CKI
15 R10 B
VCC
RC1/T1OSI/CCP2
16 R11
220R
C
8
RE0/AN5/RD RC2/CCP1
17 R12
220R
D
9
RE1/AN6/WR RC3/SCK/SCL
18 R13
220R
E
10 23 R14
220R
RE2/AN7/CS RC4/SDI/SDA
24 F
R15

G
C
D
Q3

A
B

E
220R

F
RC5/SDO
25 G
RC6/TX/CK R16
220R
P 2N2222
26 220R
RC7/RX/DT
220R
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27 Q4
RD4/PSP4 2N2222
28 R2
RD5/PSP5
29 RA0
RD6/PSP6
30 RA1
RD7/PSP7 1k
R20
1k
PIC16F877

TITLE " UP_DOWN .ASM"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON
&_HS_OSC & _LVP_OFF
;-----------------------------------------------------------------------------------
;Khai bao hang va cac bien
;-------------------------------------------------------------------------------
PORTA EQU 05H
TRISA EQU 85H
PORTB EQU 06H
TRISB EQU 86H
PORTC EQU 07H
TRISC EQU 87H
CBLOCK 0x020
COUNT1
COUNT2
COUNT3
CHUC
DVI
BIEN1
BIEN2
count1
counta
countb
ENDC

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_108 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

UP EQU 0
DOWN EQU 1
;==========================
ORG 0x000
CLRF STATUS
MOVLW 0x00
MOVWF PCLATH
GOTO START
;==========================
;KHAI BAO PORTB VÀ PORTD
;==========================
START
ORG 0x005
BCF STATUS,RP1
BCF STATUS,RP0
CLRF PORTB
CLRF PORTC
CLRF PORTA
BSF STATUS,RP0
MOVLW B'00001111'
MOVWF TRISB
CLRF TRISA
CLRF TRISC
BCF STATUS,RP0
;===========================
;CHUONG TRINH LAP VONG
;===========================

CLRF CHUC
CLRF DVI
MAIN
CALL BCD_7DOAN
CALL HIENTHI

BTFSC PORTB,UP
GOTO KHONG_NHAN_UP
CALL DELAY
BTFSS PORTB,UP
GOTO $-1
CALL DELAY
TANG
INCF DVI,1
MOVF DVI,0
XORLW D'10'
BTFSS STATUS,Z
GOTO MAIN

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_109

CLRF DVI
INCF CHUC,1
MOVF CHUC,0
XORLW D'10'
BTFSS STATUS,Z
GOTO MAIN
CLRF CHUC
;
==============================================
=
KHONG_NHAN_DOWN
GOTO MAIN
;
==============================================
====
KHONG_NHAN_UP

BTFSC PORTB,DOWN
GOTO KHONG_NHAN_DOWN
CALL DELAY
BTFSS PORTB,DOWN
GOTO $-1
CALL DELAY
GIAM
MOVF DVI,0
XORLW D'0'
BTFSS STATUS,Z
GOTO GIAM_DVI
MOVLW D'9'
MOVWF DVI
GOTO KTRA_CHUC
GIAM_DVI
DECFSZ DVI,1
NOP
GOTO MAIN
KTRA_CHUC
MOVF CHUC,0
XORLW D'0'
BTFSS STATUS,Z
GOTO GIAM_CHUC
MOVLW D'9'
MOVWF CHUC
GOTO MAIN
GIAM_CHUC
DECFSZ CHUC,1
NOP

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_110 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

GOTO MAIN

;=================================
BCD_7DOAN

MOVF DVI,0
CALL TABLE
MOVWF BIEN1
MOVF CHUC,0
CALL TABLE
MOVWF BIEN2
RETURN
;==============================
DELAY_HIENTHI

MOVLW D'2'
MOVWF COUNT1
DEL1
MOVLW D'10'
MOVWF COUNT2
DEL2
CALL HIENTHI
DECFSZ COUNT2
GOTO DEL2
DECFSZ COUNT1
GOTO DEL1
RETURN
;===============================
HIENTHI
MOVF BIEN1,0
MOVWF PORTC
MOVLW B'000001'
MOVWF PORTA
CALL delay_10ms
MOVF BIEN2,0
MOVWF PORTC
MOVLW B'000010'
MOVWF PORTA
CALL delay_10ms
RETURN
;======================================
;CHUONG TRINH DELAY
;===========================================

DELAY
MOVLW D'10'

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_111

MOVWF COUNT3
D1 DECFSZ COUNT3
GOTO D1
RETURN
;======================================
delay_10ms
MOVLW d'10'
MOVWF count1
d2
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
;
==============================================
===========
TABLE ADDWF PCL,1
DT 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90

END
;************************************************************
;=============khoi tao chuong
trinh=====================

TITLE " NGAT TIMER1 KIEN TRA SW TANG VA GIAM DEM 00


LEN 99 VA 99 VE 00.asm"
PROCESSOR P16F877A
INCLUDE <P16F877A.inc>
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF &_HS_OSC
&_LVP_OFF &_CPD_OFF &_BODEN_OFF
;============phan dat
bien=============================
count1 EQU 0x20
counta EQU 0x21 ; trình delay
countb EQU 0x22
hang_don_vi EQU 0x23
hang_chuc EQU 0x24
W_save EQU 0x25

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_112 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

PCLATH_save EQU 0x26


STATUS_save EQU 0x27
FSR_save EQU 0x28
DEM EQU 0x29
WS EQU 2

ORG 0x0004
GOTO ISR

;-----------------------------------------------------------------------------
; Chuong trinh ngat
;-----------------------------------------------------------------------------
ISR
;---------------------------------------------------------------------------
; doan chuong trinh bat buoc khi bat dau chuong trinh ngat
;--------------------------------------------------------------------------
MOVWF W_save
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_save
MOVF PCLATH,W
MOVWF PCLATH_save
CLRF PCLATH
MOVF FSR,W
MOVWF FSR_save
;--------------------------------------------------------------------------------
; Kiem tra co ngat
;--------------------------------------------------------------------------------
BTFSS PIR1,TMR1IF ; kiem tra co ngat timer1
GOTO EXIT_INT
BCF T1CON,TMR1ON ; tam thoi tat timer1 de khoi tao lai
;--------------------------------------------------------------------------------
; cac thao tac chinh cua chuong trinh ngat
;--------------------------------------------------------------------------------
CLRF TMR1L ; khoi tao cac gia tri chua trong
thanh
CLRF TMR1H ; ghi TMRH va TMRL
MOVLW 0x61 ; nap gia tri vao cac thanh ghi dem
cua Timer1
MOVWF TMR1H ; gia tri 25000 (25000 ->
61A8H)
MOVLW 0xA8
MOVWF TMR1L
BSF T1CON,TMR1ON ; Bat Timer1
BCF PIR1,TMR1IF ; xoa co ngat
;========================

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_113

BTFSS PORTB,WS
GOTO TANG
GIAM
MOVF hang_don_vi,0
XORLW D'0'
BTFSS STATUS,Z
GOTO GIAM_DVI
MOVLW D'9'
MOVWF hang_don_vi
GOTO KTRA_CHUC
GIAM_DVI
DECFSZ hang_don_vi,1
NOP
GOTO EXIT_INT
KTRA_CHUC
MOVF hang_chuc,0
XORLW D'0'
BTFSS STATUS,Z
GOTO GIAM_CHUC
MOVLW D'9'
MOVWF hang_chuc
GOTO EXIT_INT
GIAM_CHUC
DECFSZ hang_chuc,1
NOP
GOTO EXIT_INT
;========================================

TANG

INCF hang_don_vi,1
MOVLW D'10'
XORWF hang_don_vi,0
BTFSS STATUS,Z
GOTO EXIT_INT
CLRF hang_don_vi
INCF hang_chuc,1
MOVLW D'10'
XORWF hang_chuc,0
BTFSS STATUS,Z
GOTO EXIT_INT
CLRF hang_chuc

;--------------------------------------------------------------------------------------------
--------------------

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_114 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

; DOAN CHUUONG TRINH BAT BUOC KHI KE THUC CHUONG TRINH


NGAT
;--------------------------------------------------------------------------------------------
--------------------
EXIT_INT

MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH
SWAPF STATUS_save,W
MOVWF STATUS
SWAPF W_save,1
SWAPF W_save,0
RETFIE
;---------------------------
ORG 0x0000
GOTO START
ORG 0x050
;--------------------------------------------------------------------------------------------
-------
; Chuong trình chính
;--------------------------------------------------------------------------------------------
-------
START
;---------------------------------------------------------------
; khoi tao cac port dieu khien
;---------------------------------------------------------------
BCF STATUS,RP1
BSF STATUS,RP0
MOVLW 0x00 ; PORTA <-output
MOVWF TRISA
MOVLW 0x00 ; PORTC <-output
MOVWF TRISC
BCF STATUS,RP0
;-----------------------------------------------------------------
; Khoi tao Timer1
;-----------------------------------------------------------------
CLRF T1CON
CLRF INTCON
CLRF TMR1H
CLRF TMR1L
BSF STATUS,RP0 ; Chon BANK1
CLRF PIE1
BSF PIE1,TMR1IE ; Cho phep ngat Timer1
BCF STATUS,RP0 ; ChoN BANK0

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_115

CLRF PIR1 ; xoa tat ca cac co ngat


MOVLW 0x30 ; prescaler 1:8, xung dem la xung
lenh, tam thoi
MOVWF T1CON ; tat Timer1
MOVLW 0x61 ; nap gia tri vao cac thanh ghi dem
cua Timer1
MOVWF TMR1H ; gia tri 25000 (25000 ->
61A8H)
MOVLW 0xA8
MOVWF TMR1L
BSF INTCON,TMR1IE ; Cho phep ngat Timer1
BSF INTCON,PEIE ; Cho phep ngat ngoai vi
BSF INTCON,GIE ; Cho phep ngat toan cuc
BSF T1CON,TMR1ON ; Bat Timer1
;
==============================================
======
CLRF hang_chuc
CLRF hang_don_vi
CLRF DEM
;----------------------------------------------
MAIN
CALL hien_thi
GOTO MAIN
;-------------------------------------
hien_thi
MOVF hang_don_vi,0
CALL TABEL
MOVWF PORTC
MOVLW b'000001'
MOVWF PORTA
CALL delay_1ms
MOVF hang_chuc,0
CALL TABEL
MOVWF PORTC
MOVLW b'000010'
MOVWF PORTA
CALL delay_1ms
RETURN
;--------------------------------------------------------------------------------------------
------------
; CAC CHUONG TRINH CON DUNG CHO CHUONG TRINH CON HIEN THI
;--------------------------------------------------------------------------------------------
------------
TABEL ADDWF PCL,1
DT 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_116 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;================================
delay_1ms
MOVLW d'10'
MOVWF count1
d2 MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1 ; delay 1 ms
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
END
;
**************************************************************************
*

BÀI 31: CHƯƠNG TRÌNH DỌC ADC HIỂN THỊ RA LCD

C1

33p
X1
CRYSTAL
C2
U1 LCD1
33p 13 33 LM016L
R1 14
OSC1/CLKIN RB0/INT
34
OSC2/CLKOUT RB1
1 35
10k MCLR/Vpp/THV RB2
36
RB3/PGM
2 37 +5V
RA0/AN0 RB4
3 38
RA1/AN1 RB5
+5V 4 39
RA2/AN2/VREF- RB6/PGC
VDD
VSS

VEE

V=5 5 40
RW
RS

D0
D1
D2
D3
D4
D5
D6
D7

RA3/AN3/VREF+ RB7/PGD
E

6
RA4/T0CKI
7 15
RA5/AN4/SS RC0/T1OSO/T1CKI RV2
1
2
3

4
5
6

7
8
9
10
11
12
13
14

+5V 16
RC1/T1OSI/CCP2
8 17
56%

RE0/AN5/RD RC2/CCP1
9 18
RE1/AN6/WR RC3/SCK/SCL
10 23
RE2/AN7/CS RC4/SDI/SDA
24 1k
RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT
+0.10
+88.8 19
RV1 Volts
RD0/PSP0
20
RD1/PSP1 VSS
21
RD2/PSP2
(+) 22
RD3/PSP3
V=4.9 27
98%

RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
1k
+4.90
+88.8 PIC16F877
Volts

VSS

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_117

TITLE " DOC ADC HIEN THI LCD 2.55volts"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC
&_WRT_OFF & _LVP_OFF & _CPD_OFF
; Clock = XT 4MHz, standard fuse settings

; LABEL EQUATES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Timer1 EQU 20 ; 1ms count register


TimerX EQU 21 ; Xms count register

Select EQU 22 ; Copy of RS bit


OutCod EQU 23 ; Temp store for output

RS EQU 1 ; Register select output bit


E EQU 2 ; Display data strobe
PORTD EQU 0x8
TRISD EQU 0x88
PORTC EQU 0x7
TRISC EQU 0x87
STATUS EQU 0x03

count EQU 30 ; Counter for ADC setup delay


ADbin EQU 31 ; Binary input value
huns EQU 32 ; Hundreds digit in decimal value
tens EQU 33 ; Tens digit in decimal value
ones EQU 34 ; Ones digit in decimal value
; PROGRAM BEGINS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0 ; Default start address
NOP ; required for ICD mode
; Port & display setup -------------------------------------------------
BANKSEL TRISC ; Select bank 1
CLRF TRISD ; Display port is output
MOVLW B'00000011' ; Analogue input setup code
MOVWF ADCON1 ; Left justify result,
; Port A = analogue inputs
BANKSEL PORTC ; Select bank 0
CLRF PORTD ; Clear display outputs
MOVLW B'01000001' ; Analogue input setup code
MOVWF ADCON0 ; f/8, RA0, done, enable
CALL Inid ; Initialise the display
; MAIN LOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_118 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

start
CALL getADC ; read input
CALL condec ; convert to decimal
CALL putLCD ; display input
GOTO start ; jump to main loop
; SUBROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Read ADC input and store ---------------------------------------------
getADC
BSF ADCON0,GO ; start ADC..
wait
BTFSC ADCON0,GO ; ..and wait for finish
GOTO wait
MOVF ADRESH,W ; store result high byte
RETURN
; Convert input to decimal ---------------------------------------------
condec
MOVWF ADbin ; get ADC result
CLRF huns ; zero hundreds digit
CLRF tens ; zero tens digit
CLRF ones ; zero ones digit
; Calclulate hundreds --------------------------------------------------
BSF STATUS,C ; set carry for subtract
MOVLW D'100' ; load 100
sub1
SUBWF ADbin ; and subtract from result
INCF huns ; count number of loops
BTFSC STATUS,C ; and check if done
GOTO sub1 ; no, carry on
ADDWF ADbin ; yes, add 100 back on
DECF huns ; and correct loop count
; Calculate tens digit -------------------------------------------------
BSF STATUS,C ; repeat process for tens
MOVLW D'10' ; load 10
sub2
SUBWF ADbin ; and subtract from result
INCF tens ; count number of loops
BTFSC STATUS,C ; and check if done
GOTO sub2 ; no, carry on
ADDWF ADbin ; yes, add 100 back on
DECF tens ; and correct loop count
MOVF ADbin,W ; load remainder
MOVWF ones ; and store as ones digit
RETURN ; done
; Output to display ----------------------------------------------------

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_119

putLCD
BCF Select,RS ; set display command mode
MOVLW 080 ; code to home cursor
CALL Send ; output it to display
BSF Select,RS ; and restore data mode
; Convert digits to ASCII and display ----------------------------------
MOVLW 030 ; load ASCII offset
ADDWF huns ; convert hundreds to ASCII
ADDWF tens ; convert tens to ASCII
ADDWF ones ; convert ones to ASCII

MOVLW 'U' ; load volts code


CALL Send
MOVLW '' ; load space code
CALL Send ; and output
MOVLW '=' ; load volts code
CALL Send
MOVLW '' ; load space code
CALL Send ; and output
MOVF huns,W ; load hundreds code
CALL Send ; and send to display
MOVLW '.' ; load point code
CALL Send ; and output
MOVF tens,W ; load tens code
CALL Send ; and output
MOVF ones,W ; load ones code
CALL Send ; and output
MOVLW '' ; load space code
CALL Send ; and output
MOVLW 'V' ; load volts code
CALL Send
MOVLW 'O' ; load space code
CALL Send ; and output
MOVLW 'L' ; load volts code
CALL Send
MOVLW 'T' ; load space code
CALL Send ; and output
MOVLW 'S' ; load volts code
CALL Send
RETURN ; done

;====================================
; INCLUDED ROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 1ms delay with 1us cycle time (1000 cycles)-------------------

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_120 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

Onems
MOVLW D'249' ; Count for 1ms delay
MOVWF Timer1 ; Load count
Loop1
NOP ; Pad for 4 cycle loop
DECFSZ Timer1 ; Count
GOTO Loop1 ; until Z
RETURN ; and finish
; Delay Xms, X received in W -----------------------------------
Xms
MOVWF TimerX ; Count for X ms
LoopX
CALL Onems ; Delay 1ms
DECFSZ TimerX ; Repeat X times
GOTO LoopX ; until Z
RETURN ; and finish
; Generate data/command clock siganl E -------------------------
PulseE
BSF PORTD,E ; Set E high
CALL Onems ; Delay 1ms
BCF PORTD,E ; Reset E low
CALL Onems ; Delay 1ms
RETURN ; done
;==============================================
Send
MOVWF OutCod ; Store output code
ANDLW 0F0 ; Clear low nybble
MOVWF PORTD ; Output high nybble
BTFSC Select,RS ; Test RS bit
BSF PORTD,RS ; and set for data
CALL PulseE ; and clock display
CALL Onems ; wait 1ms for display
SWAPF OutCod ; Swap low/high nybbles
MOVF OutCod,W ; Retrieve output code
ANDLW 0F0 ; Clear low nybble
MOVWF PORTD ; Output low nybble
BTFSC Select,RS ; Test RS bit
BSF PORTD,RS ; and set for data
CALL PulseE ; and clock display
CALL Onems ; wait 1ms for display
RETURN ; done
;======================================================
Inid
MOVLW D'100' ; Load count 100ms delay
CALL Xms ; and wait for display
MOVLW 0F0 ; Mask for select code

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_121

MOVWF Select ; High nybble not masked


MOVLW 0x30 ; Load initial nibble
MOVWF PORTD ; and output it to display
CALL PulseE ; Latch initial code
MOVLW D'5' ; Set delay 5ms
CALL Xms ; and wait
CALL PulseE ; Latch initial code again
CALL Onems ; Wait 1ms
CALL PulseE ; Latch initial code again
BCF PORTD,4 ; Set 4-bit mode
CALL PulseE ; Latch it
MOVLW 0x28 ; Set 4-bit mode, 2 lines
CALL Send ; and send code
MOVLW 0x08 ; Switch off display
CALL Send ; and send code
MOVLW 0x01 ; Clear display
CALL Send ; and send code
MOVLW 0x06 ; Enable cursor auto inc
CALL Send ; and send code
MOVLW 0x80 ; Zero display address
CALL Send ; and send code
MOVLW 0x0C ; Turn on display
CALL Send ; and send code
RETURN ; Done
END
;*********************************************************************

TITLE " DOC ADC HIEN THI LCD 4.000volts"


processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC
&_WRT_OFF & _LVP_OFF & _CPD_OFF
; Clock = XT 4MHz, standard fuse settings

; LABEL EQUATES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RS EQU 1 ; Register select output bit


E EQU 2 ; Display data strobe

PORTD EQU 0x8


TRISD EQU 0x88
PORTC EQU 0x7
TRISC EQU 0x87
STATUS EQU 0x03

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_122 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

Timer1 EQU 20 ; 1ms count register


TimerX EQU 21 ; Xms count register
Select EQU 22 ; Copy of RS bit
OutCod EQU 23 ; Temp store for output
count EQU 24 ; Counter for ADC setup delay
ADbin EQU 25 ; Binary input value
huns EQU 26 ; Hundreds digit in decimal value
tens EQU 27 ; Tens digit in decimal value
ones EQU 28 ; Ones digit in decimal value
ADhi EQU 29
ADlo EQU 30
thos EQU 31
; PROGRAM BEGINS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0 ; Default start address
NOP ; required for ICD mode
; Port & display setup -------------------------------------------------
BANKSEL TRISC ; Select bank 1
CLRF TRISD ; Display port is output
MOVLW B'10000011' ; Analogue input setup code
MOVWF ADCON1 ; Left justify result,
; Port A = analogue inputs
BANKSEL PORTC ; Select bank 0
CLRF PORTD ; Clear display outputs
MOVLW B'01000001' ; Analogue input setup code
MOVWF ADCON0 ; f/8, RA0, done, enable
CALL Inid ; Initialise the display
; MAIN LOOP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
start
CALL getADC ; read input
CALL con4 ; convert to decimal
CALL putLCD ; display input
GOTO start ; jump to main loop
; SUBROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Read ADC input and store ---------------------------------------------
getADC
MOVLW 007 ; load counter
MOVWF count
down
DECFSZ count ;and delay 20us
GOTO down
BSF ADCON0,GO ; start ADC..
wait
BTFSC ADCON0,GO ; ..and wait for finish
GOTO wait
RETURN
;-----------------------------------------------------------

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_123

; Convert 10-bit input to decimal


;-----------------------------------------------------------
con4
MOVF ADRESH,W ; get ADC result
MOVWF ADhi ; high bits
BANKSEL ADRESL ; in bank 1
MOVF ADRESL,W ; get ADC result
BANKSEL ADRESH ; default bank 0
MOVWF ADlo ; low byte
; Multiply by 4 for result 0 - 4096 by shifting left.........
BCF STATUS,C ; rotate 0 into LSB and
RLF ADlo ; shift low byte left
BTFSS STATUS,C ; carry out?
GOTO rot1 ; no, leave carry clear
BSF STATUS,C ; rotate 1 into LSB and
rot1
RLF ADhi ; shift high byte left
BCF STATUS,C ; rotate 0 into LSB
RLF ADlo ; rotate low byte left again
BTFSS STATUS,C ; carry out?
GOTO rot2 ; no, leave carry clear
BSF STATUS,C ; rotate 1 into LSB and
rot2
RLF ADhi ; shift high byte left
; Clear BCD registers........................................
clrbcd
CLRF thos ; zero thousands digit
CLRF huns ; zero hundreds digit
CLRF tens ; zero tens digit
CLRF ones ; zero ones digit
; Calclulate thousands low byte .............................
tholo
MOVF ADhi,F ; check high byte
BTFSC STATUS,Z ; high byte zero?
GOTO hunlo ; yes, next digit
BSF STATUS,C ; set carry for subtract
MOVLW 0E8 ; load low byte of 1000
SUBWF ADlo ; and subtract low byte
BTFSC STATUS,C ; borrow from high bits?
GOTO thohi ; no, do high byte
DECF ADhi ; yes, subtract borrow
; Calculate thousands high byte..............................
thohi
BSF STATUS,C ; set carry for subtract
MOVLW 003 ; load high byte of 1000
SUBWF ADhi ; subtract from high byte

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_124 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

BTFSC STATUS,C ; result negative?


GOTO incth ; no, inc digit and repeat
ADDWF ADhi ; yes, restore high byte
; Restore remainder when done ...............................
BCF STATUS,C ; clear carry for add
MOVLW 0E8 ; load low byte of 1000
ADDWF ADlo ; add to low byte
BTFSC STATUS,C ; carry out?
INCF ADhi ; yes, inc high byte
GOTO hunlo ; and do next digit
; Increment thousands digit and repeat.......................
incth
INCF thos ; inc digit
GOTO tholo ; and repeat

; Calclulate hundreds .......................................


hunlo
MOVLW 064 ; load 100
BSF STATUS,C ; set carry for subtract
SUBWF ADlo ; and subtract low byte
BTFSC STATUS,C ; result negative?
GOTO inch ; no, inc hundreds & repeat
MOVF ADhi,F ; yes, test high byte
BTFSC STATUS,Z ; zero?
GOTO remh ; yes, done
DECF ADhi ; no, subtract borrow
inch
INCF huns ; inc hundreds digit
GOTO hunlo ; and repeat
remh
ADDWF ADlo ; restore onto low byte
; Calculate tens digit......................................
subt
MOVLW D'10' ; load 10
BSF STATUS,C ; set carry for subtract
SUBWF ADlo ; and subtract from result
BTFSS STATUS,C ; and check if done
GOTO remt ; yes, restore remainder
INCF tens ; no, count number of loops
GOTO subt ; and repeat
; Restore remainder.........................................
remt
ADDWF ADlo ; yes, add 10 back on
MOVF ADlo,W ; load remainder
MOVWF ones ; and store as ones digit
RETURN ; done

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_125

;-----------------------------------------------------------
; Output to display
;-----------------------------------------------------------
putLCD
BCF Select,RS ; set display command mode
MOVLW 080 ; code to home cursor
CALL Send ; output it to display
BSF Select,RS ; and restore data mode
; Convert digits to ASCII and display.......................
MOVLW 030 ; load ASCII offset
ADDWF thos ; convert thousands to ASCII
ADDWF huns ; convert hundreds to ASCII
ADDWF tens ; convert tens to ASCII
ADDWF ones ; convert ones to ASCII

MOVLW 'U' ; load volts code


CALL Send
MOVLW '' ; load space code
CALL Send ; and output
MOVLW '=' ; load volts code
CALL Send
MOVLW '' ; load space code
CALL Send ; and output
MOVF thos,W ; load thousands code
CALL Send ; and send to display
MOVLW '.' ; load point code
CALL Send ; and output
MOVF huns,W ; load hundreds code
CALL Send ; and send to display
MOVF tens,W ; load tens code
CALL Send ; and output
MOVF ones,W ; load ones code
CALL Send ; and output
MOVLW '' ; load space code
CALL Send ; and output
MOVLW 'V' ; load volts code
CALL Send ; and output
MOVLW 'o' ; load volts code
CALL Send ; and output
MOVLW 'l' ; load volts code
CALL Send ; and output
MOVLW 't' ; load volts code
CALL Send ; and output
MOVLW 's' ; load volts code
CALL Send ; and output
RETURN ; done

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_126 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;====================================
; INCLUDED ROUTINES ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 1ms delay with 1us cycle time (1000 cycles)-------------------
Onems
MOVLW D'249' ; Count for 1ms delay
MOVWF Timer1 ; Load count
Loop1
NOP ; Pad for 4 cycle loop
DECFSZ Timer1 ; Count
GOTO Loop1 ; until Z
RETURN ; and finish
; Delay Xms, X received in W -----------------------------------
Xms
MOVWF TimerX ; Count for X ms
LoopX
CALL Onems ; Delay 1ms
DECFSZ TimerX ; Repeat X times
GOTO LoopX ; until Z
RETURN ; and finish
; Generate data/command clock siganl E -------------------------
PulseE
BSF PORTD,E ; Set E high
CALL Onems ; Delay 1ms
BCF PORTD,E ; Reset E low
CALL Onems ; Delay 1ms
RETURN ; done
;==============================================
Send
MOVWF OutCod ; Store output code
ANDLW 0F0 ; Clear low nybble
MOVWF PORTD ; Output high nybble
BTFSC Select,RS ; Test RS bit
BSF PORTD,RS ; and set for data
CALL PulseE ; and clock display
CALL Onems ; wait 1ms for display
SWAPF OutCod ; Swap low/high nybbles
MOVF OutCod,W ; Retrieve output code
ANDLW 0F0 ; Clear low nybble
MOVWF PORTD ; Output low nybble
BTFSC Select,RS ; Test RS bit
BSF PORTD,RS ; and set for data
CALL PulseE ; and clock display
CALL Onems ; wait 1ms for display

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_127

RETURN ; done
;======================================================
Inid
MOVLW D'100' ; Load count 100ms delay
CALL Xms ; and wait for display
MOVLW 0F0 ; Mask for select code
MOVWF Select ; High nybble not masked
MOVLW 0x30 ; Load initial nibble
MOVWF PORTD ; and output it to display
CALL PulseE ; Latch initial code
MOVLW D'5' ; Set delay 5ms
CALL Xms ; and wait
CALL PulseE ; Latch initial code again
CALL Onems ; Wait 1ms
CALL PulseE ; Latch initial code again
BCF PORTD,4 ; Set 4-bit mode
CALL PulseE ; Latch it
MOVLW 0x28 ; Set 4-bit mode, 2 lines
CALL Send ; and send code
MOVLW 0x08 ; Switch off display
CALL Send ; and send code
MOVLW 0x01 ; Clear display
CALL Send ; and send code
MOVLW 0x06 ; Enable cursor auto inc
CALL Send ; and send code
MOVLW 0x80 ; Zero display address
CALL Send ; and send code
MOVLW 0x0C ; Turn on display
CALL Send ; and send code
RETURN ; Done

END ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;**************************************************************************

BÀI 32: CHƯƠNG TRÌNH HIỂN THỊ GIÁ TRỊ QUÉT PHÍM MA TRẬN 16 BIT RA 2 LED 7 ĐOẠN, BAN
ĐẦU HIỂN THỊ SỐ 00, SAU KHI NHẤN PHÍM THÌ GIÁ TRỊ CỦA ĐƠN VỊ ĐƯỢC CHUYỂN SANG HÀNG
CHỤC, CÒN GIÁ TRỊ CỦA PHÍM NHẤN CHUYỂN SANG HÀNG ĐƠN VỈ.

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_128 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

CATOT CHUNG

VCC

Q1
2N2222
C2 C1
33p 33p R3R4R5R6R7R8R9 R10
X1 330R
330R
330R
330R
330R
330R
330R
RA0
Q2
1k
2N2222

G
C
D
A

E
F
CRYSTAL U1

VCC
13 33 A
14
OSC1/CLKIN RB0/INT
34 B RA1
R11
OSC2/CLKOUT RB1
35 C Q3
RB2 1k
RA0 2 36 D R14 R12 R13 R16 2N2222
RA0/AN0 RB3/PGM
RA1 3 37 E 10k 10k 10k 10k
VCC RA1/AN1 RB4
RA2 4 38 F
RA3 5
RA2/AN2/VREF-/CVREF RB5
39 G
R2
RA3/AN3/VREF+ RB6/PGC
RA4 6 40 RA2
RA4/T0CKI/C1OUT RB7/PGD
RA5 7 RD0
RA5/AN4/SS/C2OUT
15
1k Q4
RC0/T1OSO/T1CKI 2N2222
R1 8
RE0/AN5/RD RC1/T1OSI/CCP2
16 RD1
10k 9 17
RE1/AN6/WR RC2/CCP1
10 18 RD2
RESET RE2/AN7/CS RC3/SCK/SCL
23
RSET RSET
RC4/SDI/SDA
RD3 RA3
R15
1 24
MCLR/Vpp/THV RC5/SDO
25 1k
RC6/TX/CK
26
RC7/RX/DT
19 RD0
RD0/PSP0
20 RD1
0 1 2 3
RD1/PSP1
21 RD2
RD2/PSP2
22 RD3
RD3/PSP3
27 RD4 RD4
RD4/PSP4
28 RD5
4 5 6 7
RD5/PSP5
29 RD6
RD6/PSP6
30 RD7
RD7/PSP7
RD5
PIC16F877A
8 9 A B

RD6
C D E F

RD7

;CHUONG TRINH SCAN_KEY 16 BIT


;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TITLE "SCANKEY_ 2 LED 7 DOAN"
processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC
&_WRT_OFF & _LVP_OFF & _CPD_OFF
;--------------------------------------------------------------
PCL EQU 0x02
STATUS EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
PORTC EQU 0x07 ; 7-Segment display
PORTD EQU 0x08 ; 3x4 keypad
TRISA EQU 0x85
TRISB EQU 0x86
TRISC EQU 0x87 ; Data direction
TRISD EQU 0x88 ; registers
KEY EQU 0x20 ; Count of keys
count1 EQU 0x21
counta EQU 0x22
countb EQU 0x23
DVI EQU 0x24
DVITAM EQU 0x25

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_129

CHUC EQU 0x26


CHUCTAM EQU 0x27
BIEN1 EQU 0x28
BIEN2 EQU 0x29
KEYSAVE EQU 0x30
;=============================================
ORG 0x0000
GOTOSTART
ORG 0x008

; Initialise ports.........................................
START
BANKSEL TRISC ; Display
CLRF TRISA
CLRF TRISB
MOVLW B'000001111' ; Keypad
MOVWF TRISD ; bidirectional
BANKSEL PORTC ; Display off
CLRF PORTC ; initially
CLRF PORTB
CLRF PORTA
CLRF DVI
CLRF CHUC
CLRF DVITAM
GOTOMAIN ; jump to main
; Check a row of keys .....................................

; Scan the keypad..........................................


ROW
INCF KEY ; Count first key
BTFSS PORTD,0 ; Check key
GOTO GET_KEY ; and quit if on
INCF KEY ; and repeat
BTFSS PORTD,1 ; for second
GOTO GET_KEY ; key
INCF KEY ; and repeat
BTFSS PORTD,2 ; for third
GOTO GET_KEY ; key
INCF KEY ; and repeat
BTFSS PORTD,3 ; for third
GOTO GET_KEY ; key
GOTO NEXT ; go for next row
; Scan the keypad..........................................
MAIN
MOVLW 0xFF
MOVWF PORTD

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_130 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

CLRF KEY ; Zero key count


BSF 3,0 ; Set Carry Flag
BCF PORTD,4 ; Select first row PORTD = 11101111
NEWROW
GOTO ROW ; check row
NEXT
RLF PORTD ; Select next row
BTFSC 3,0 ; 0 into carry flag?
GOTO NEWROW ; if not, next row
GOTO NOT_KEY ; if so, start again
; quit with key count
;===================================================

GET_KEY
CALL delay_50ms
CALL HIENTHI
CALL delay_50ms
CALL HIENTHI
MOVF DVI,W
MOVWF DVITAM
CLRW
MOVF KEY,W
MOVWF DVI
CLRW
MOVF DVITAM,W
MOVWF KEY
CLRW
MOVF KEY,W
MOVWF CHUC
CLRW

NOT_KEY
CALL BCD_7DOAN
CALL HIENTHI
GOTOMAIN
;==============================
BCD_7DOAN
MOVF DVI,W
CALL table
MOVWF BIEN1
MOVF CHUC,W
CALL table
MOVWF BIEN2
RETURN
;==============================

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_131

HIENTHI
MOVF BIEN1,0
MOVWF PORTB
MOVLW B'000001'
MOVWF PORTA
CALL delay_1ms
MOVF BIEN2,0
MOVWF PORTB
MOVLW B'000010'
MOVWF PORTA
CALL delay_1ms
RETURN
;======================================
delay_1ms
MOVLW d'10'
MOVWF count1
d1
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN
;=====================================
delay_50ms
MOVLW d'50'
MOVWF count1
CALL d1
RETURN
; Display code table.......................................
table
ADDWF PCL ; and calculate jump
DT 0xC0,0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80
DT 0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
; Output display code......................................

END
;************************************************************
BÀI 32B: CHƯƠNG TRÌNH HIỂN THỊ GIÁ TRỊ QUÉT PHÍM MA TRẬN 16 BIT RA 4 LED 7 ĐOẠN, BAN
ĐẦU HIỂN THỊ SỐ 0000, SAU KHI NHẤN PHÍM THÌ GIÁ TRỊ CỦA PHÍM NHẤN ĐƯỢC DỊCH TỪ HÀNG
DƠN VỊ DẾN HÀNG NGHÌN SAU MỖI LẦN CÓ PHÍM DƯỢC NHẤN.

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_132 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

;CHUONG TRINH SCAN_KEY 16 BIT


;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TITLE "SCANKEY_ 4 LED 7 DOAN"
processor p16f877a
include <p16f877a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC
&_WRT_OFF & _LVP_OFF & _CPD_OFF
;--------------------------------------------------------------
PCL EQU 0x02
STATUS EQU 0x03
PORTA EQU 0x05
PORTB EQU 0x06
PORTC EQU 0x07 ; 7-Segment display
PORTD EQU 0x08 ; 3x4 keypad
TRISA EQU 0x85
TRISB EQU 0x86
TRISC EQU 0x87 ; Data direction
TRISD EQU 0x88 ; registers
KEY EQU 0x20 ; Count of keys
count1 EQU 0x21
counta EQU 0x22
countb EQU 0x23
DVI EQU 0x24
DVITAM EQU 0x25
CHUC EQU 0x26
CHUCTAM EQU 0x27
BIEN1 EQU 0x28
BIEN2 EQU 0x29
BIEN3 EQU 0x30
BIEN4 EQU 0x31
KEYSAVE EQU 0x32
TRAM EQU 0x33
NGHIN EQU 0x34
TRAMTAM EQU 0x35
NGHINTAM EQU 0x36
;=============================================
ORG 0x0000
GOTOSTART
ORG 0x008

; Initialise ports.........................................
START
BANKSEL TRISC ; Display
CLRF TRISA

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_133

CLRF TRISB
MOVLW B'000001111' ; Keypad
MOVWF TRISD ; bidirectional
BANKSEL PORTC ; Display off
CLRF PORTC ; initially
CLRF PORTB
CLRF PORTA
CLRF DVI
CLRF CHUC
CLRF DVITAM
GOTOMAIN ; jump to main
; Check a row of keys .....................................

; Scan the keypad..........................................


ROW
INCF KEY ; Count first key
BTFSS PORTD,0 ; Check key
GOTO GET_KEY ; and quit if on
INCF KEY ; and repeat
BTFSS PORTD,1 ; for second
GOTO GET_KEY ; key
INCF KEY ; and repeat
BTFSS PORTD,2 ; for third
GOTO GET_KEY ; key
INCF KEY ; and repeat
BTFSS PORTD,3 ; for third
GOTO GET_KEY ; key
GOTO NEXT ; go for next row
; Scan the keypad..........................................
MAIN
MOVLW 0xFF
MOVWF PORTD
CLRF KEY ; Zero key count
BSF 3,0 ; Set Carry Flag
BCF PORTD,4 ; Select first row PORTD = 11101111
NEWROW
GOTO ROW ; check row
NEXT
RLF PORTD ; Select next row
BTFSC 3,0 ; 0 into carry flag?
GOTO NEWROW ; if not, next row
GOTO NOT_KEY ; if so, start again
; quit with key count
;============

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_134 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

GET_KEY
CALL HIENTHI
CALL delay_50ms
CALL HIENTHI
MOVF DVI,W
MOVWF DVITAM
MOVF CHUC,W
MOVWF CHUCTAM
MOVF TRAM,W
MOVWF TRAMTAM
MOVF KEY,W
MOVWF DVI
MOVF DVITAM,W
MOVWF KEY
MOVF KEY,W
MOVWF CHUC
MOVF CHUCTAM,W
MOVWF KEY
MOVF KEY,W
MOVWF TRAM
MOVF TRAMTAM,W
MOVWF KEY
MOVF KEY,W
MOVWF NGHIN
NOT_KEY
CALL BCD_7DOAN
CALL HIENTHI
GOTOMAIN
;==============================
BCD_7DOAN
MOVF DVI,W
CALL table
MOVWF BIEN1
MOVF CHUC,W
CALL table
MOVWF BIEN2
MOVF TRAM,W
CALL table
MOVWF BIEN3
MOVF NGHIN,W
CALL table
MOVWF BIEN4
RETURN
;==============================
HIENTHI
MOVF BIEN1,0

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A Trang_135

MOVWF PORTB
MOVLW B'000001'
MOVWF PORTA
CALL delay_1ms
MOVF BIEN2,0
MOVWF PORTB
MOVLW B'000010'
MOVWF PORTA
CALL delay_1ms
MOVF BIEN3,0
MOVWF PORTB
MOVLW B'000100'
MOVWF PORTA
CALL delay_1ms
MOVF BIEN4,0
MOVWF PORTB
MOVLW B'001000'
MOVWF PORTA
CALL delay_1ms
RETURN
;======================================
delay_1ms
MOVLW d'10'
MOVWF count1
d1
MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_0
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_0
DECFSZ count1,1
GOTO d1
RETURN
;=====================================
delay_50ms
MOVLW d'50'
MOVWF count1
CALL d1
RETURN
; Display code table.......................................
table
ADDWF PCL ; and calculate jump

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3


Trang_136 TRƯỜNG ĐH CÔNG NGHỆ SÀI GÒN_ÔN TẬP PIC16F877A

DT 0xC0,0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80
DT 0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
; Output display code......................................

END
;************************************************************************

hungxuanvuongstu1@gmail.com LỚP ĐĐT307.3

You might also like