MOVLW b'11111110'
MOVWF PORTB
CALL delay_1ms
RETURN
;--------------------------------------------------------------------------------------------------------
; Caùc chöông trình con duøng cho chöông trình con hien_thi
;--------------------------------------------------------------------------------------------------------
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'1'
MOVWF count1
d2 MOVLW 0xC7
MOVWF counta
MOVLW 0x01
MOVWF countb
delay_1
DECFSZ counta,1
GOTO $+2
DECFSZ countb,1
GOTO delay_1
DECFSZ count1,1
GOTO d2
RETURN
END
Timer2 cuõng laø boä ñeám 8 bit ñöôïc hoã trôï theâm thanh ghi so saùnh PR2 vaø hai boä chia
taàn soá postscaler prescaler giuùp ta linh ñoäng hôn trong vieäc taïo ra khoaûng thôøi gian delay
thích hôïp cho öùng duïng. Thanh ghi ñieàu khieån Timer2 laø thanh ghi T2CON. Chöông trình treân
khoâng coù gì môùi, noù chæ giuùp ta oân laïi moät soá ñaëc ñieåm cuûa Timer2 vaø caùch khôûi taïo noù.
ÖÙng duïng 4.8: ÖÙng duïng PIC16F877A vaø caùc LED 7 ñoaïn ñeå laøm ñoàng hoà.
Vôùi hai ví duï treân ta coù theå naém baét ñöôïc caùc khaùi nieäm cô baûn veà taùc duïng ñònh thôøi
duøng Timer, vaø moät trong nhöõng öùng duïng phoå bieán nhaát cuûa cheá ñoä ñònh thôøi laø laøm ñoàng hoà
ñieän töû. Ta coù theå söû duïng baát cöù Timer naøo cuûa vi ñieàu khieån ñeå phuïc vuï cho öùng duïng naøy,
tuy nhieân ñeå coù moät caùch nhìn toång quaùt hôn veà caùc Timer, laàn naøy ta seõ söû duïng Timer1.
Baây giôø ta seõ tieán haønh töøng böôùc ñeå thöïc hieän thaønh coâng öùng duïng naøy.
Tröôùc tieân laø vaán ñeà veà caáu truùc phaàn cöùng, ñeå hieån thò ñöôïc giôø, phuùt, giaây ta caàn
ñeán 6 LED 7 ñoaïn, caùch keát noái hoaøn toaøn töông töï nhö caùc öùng duïng söû duïng 2 LED ôû ví duï
4.7, chæ vieäc noái theâm 4 LED 7 ñoaïn maéc song song vôùi hai LED tröôùc ñoù vaø keát noái theâm 4
“coâng taéc” duøng BJT vaøo PORTB ñeå ñieàu khieån queùt LED.
Tieáp theo laø vaán ñeà veà chöông trình vieát cho vi ñieàu khieån. Caùch “phaân coâng” ñoái vôùi
chöông trình seõ khoâng coù gì thay ñoåi, töùc laø chöông trình chính seõ laøm nhieäm vuï hieån thò LED
vaø chöông trình ngaét seõ thöïc hieän coâng vieäc caäp nhaät caùc giaù trò caàn hieån thò. Tuy nhieân coù
moät soá vaán ñeà phaùt sinh nhö sau:
Thöù nhaát, laøm sao taïo ra thôøi gian ñònh thôøi 1 giaây?? Timer ta söû duïng laø
Timer1 16 bit vôùi boä chia taàn soá prescaler coù caùc tæ soá chia laø 1:1, 1:2, 1:4, 1:8 vaø ñöôïc ñieàu
khieån bôûi thanh ghi T1CON (xem laïi Timer1 ñeå bieát theâm chi tieát). Giaù trò ñeám toái ña cuûa
Timer1 seõ laø 65534, trong khi neáu ta söû duïng oscillator 4 MHz (moãi xung leänh coù thôøi gian 1
uS) thì Timer1 caàn phaûi ñeám ñeán giaù trò 1 000 000, vaø neáu ta coù huy ñoäng toái ña khaû naêng
chia taàn soá cuûa prescaler (1:8 ) thì giaù trò ñeám cuõng phaûi ñaït ñeán 1 000 000/8 = 125 000 (vaãn
coøn lôùn hôn raát nhieàu so vôùi giaù trò ñeám toái ña cuûa Timer1. Moät giaûi phaùp cho vaán ñeà naøy laø
duøng theâm moät thanh ghi ñeám phuï( thanh ghi count). Cuï theå nhö sau: ta cho Timer1 ñeám töø 0
ñeán 25000, do ñoù ta caàn 5 laàn ñeám nhö vaäy (5 laàn ngaét Timer1 xaûy ra) ñeå ñaït ñöôïc giaù trò
ñeám 125 000. Nhö vaäy tröôùc khi caäp nhaät giaù trò giaây, ta caàn kieåm tra xem bieán phuï count ñaõ
baèng 5 hay chöa, neáu baèng roài thì môùi taêng giaù trò giaây vaø reset laïi bieán count.
Thöù hai, laøm sao caäp nhaät giaù trò giôø??? Caùc giaù trò phuùt vaø giaây taêng töø 0 ñeán
60 neân thuaät toaùn duøng ñeå caäp nhaät laø töông ñoái ñôn giaûn (töông töï nhö thuaät toaùn ôû öùng duïng
4.7, chæ coù ñieàu ta khoâng so saùnh haøng chuïc vôùi 10 maø so saùnh vôùi 6), coøn giaù trò giôø chæ taêng
töø 0 ñeán 24. Giaûi thuaät ñeà ra laø ta khoâng caäp nhaät töøng haøng ñôn vò vaø haøng chuïc cuûa giaù trò
giôø nhö ñoái voái phuùt vaø giaây, thay vaøo ñoù giaù trò giôø seõ ñöôïc caäp nhaät vaøo moät thanh ghi, sau
ñoù duøng thuaät toaùn taùch haøng chuïc vaø haøng ñôn vò cuûa giôø nhö ôû öùng duïng 4.6 (chöông trình
4.3.2) ñeå hieån thò caùc giaù trò thanh ghi chöùa giaù trò giôø ra LED 7 ñoaïn.
Ñeán ñaây ta ñaõ coù theå vieát chöông trình cho öùng duïng theo caùc giaûi thuaät ñeà ra ôû treân.
Chöông trình cuï theå seõ ñöôïc vieát nhö sau:
------------------------------------------------------------------------------------------------------------
; Ghi chuù veà chöông trình
;-----------------------------------------------------------------------------------------------------------
; Chöông trình 4.5.3
; Chöông trình öùng duïng PIC16F877A vaø LED 7 ñoaïn ñeå laøm ñoàng hoà ñieän töû
; Timer söû duïng: Timer1
;------------------------------------------------------------------------------------------------------------
; Khai baùo vi ñieàu khieån
;------------------------------------------------------------------------------------------------------------
processor 16f877a
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 ; Caùc thanh ghi duøng cho
counta EQU 0x21 ; chöông trình con delay_1ms
countb EQU 0x22
hang_don_vi_giay EQU 0x23 ; Caùc thanh ghi chöùa caùc giaù trò
hang_chuc_giay EQU 0x24 ; giôø, phuùt, giaây caàn hieån thò
hang_don_vi_phut EQU 0x25
hang_chuc_phut EQU 0x26
gio EQU 0x27
hang_don_vi_gio EQU 0x28
hang_chuc_gio EQU 0x29
count EQU 0x30 ; Caùc thanh ghi phuï
display_reg EQU 0x31
xx EQU 0x32
xx1 EQU 0x33
W_save EQU 0x34 ; Caùc thanh ghi duøng ñeå löu laïi giaù
PCLATH_save EQU 0x35 ; trò caùc thanh ghi quan troïng khi
STATUS_save EQU 0x36 ; thöïc thi chöông trình ngaét
FSR_save EQU 0x37
ORG 0x0004
GOTO ISR
;-----------------------------------------------------------------------------
; Chöông trình ngaét
;-----------------------------------------------------------------------------
ISR
;---------------------------------------------------------------------------
; Ñoaïn chöông trình baét buoäc khi baét ñ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
;--------------------------------------------------------------------------------
; Kieåm tra caùc côø ngaét
;--------------------------------------------------------------------------------
BTFSS PIR1,TMR1IF ; kieåm tra côø ngaét cuûa Timer1
GOTO exit_int
BCF T1CON,TMR1ON ; taïm thôøi taét Timer1 ñeå khôûi taïo laïi
;--------------------------------------------------------------------------------
; Caùc thao taùc chính cuûa chöông trình ngaét
;--------------------------------------------------------------------------------
CLRF TMR1L ; Khôûi taïo laïi caùc giaù trò chöùa trong thanh
CLRF TMR1H ; ghi TMRH vaø TMRL
MOVLW 0x61 ; Ñöa vaøo caùc thanh ghi ñeám cuûa Timer1
MOVWF TMR1H ; giaù trò 25000 (25000 -> 61A8h)
MOVLW 0xA8
MOVWF TMR1L
BSF T1CON,TMR1ON ; Baät Timer1
BCF PIR1,TMR1IF ; xoùa côø ngaét ñeå tieáp tuïc nhaän bieát thôøi ñieåm tieáp
; theo ngaét xaûy ra
INCF count ; bieán ñeám phuï
MOVLW d'5' ; so saùnh count vôùi giaù trò 5
XORWF count,0
BTFSS STATUS,Z
GOTO exit_int ; neáu chöa baèng 5, thoaùt khoûi ngaét
CLRF count ; neáu ñaõ baèng 5, reset laïi bieán count
INCF hang_don_vi_giay,1 ; taêng haøng ñôn vò cuûa bieán giaây
MOVLW 0x0A ; so saùnh vôùi 10
XORWF hang_don_vi_giay,0 ; caäp nhaät haøng chuïc cuûa giaù trò giaây
BTFSS STATUS,Z
GOTO exit_int
CLRF hang_don_vi_giay
INCF hang_chuc_giay,1
MOVLW 0x06 ; so saùnh giaù trò haøng chuïc giaây vôùi 6
XORWF hang_chuc_giay,0
BTFSS STATUS,Z
GOTO exit_int
CLRF hang_chuc_giay ; caäp nhaät giaù trò phuùt
INCF hang_don_vi_phut,1
MOVLW 0x0A ; so saùnh haøng ñôn vò cuûa giaù trò phuùt vôùi 10
XORWF hang_don_vi_phut,0
BTFSS STATUS,Z
GOTO exit_int
CLRF hang_don_vi_phut
INCF hang_chuc_phut,1
MOVLW 0x06 ; so saùnh haøng chuïc cuûa giaù trò phuùt vôùi 6
XORWF hang_chuc_phut,0
BTFSS STATUS,Z
GOTO exit_int
CLRF hang_chuc_phut
INCF gio,1 ; caäp nhaät giaù trò giôø
MOVLW 0x18
XORWF gio,0
BTFSS STATUS,Z
GOTO exit_int
CLRF gio
GOTO exit_int
;----------------------------------------------------------------------------------------------------------------
; Ñoaïn chöông trình baét buoäc duøng ñeå keát thuùc chöông trình ngaét
;----------------------------------------------------------------------------------------------------------------
exit_int
MOVF FSR_save,W
MOVWF FSR
MOVF PCLATH_save,W
MOVWF PCLATH