Interupsi-Timer

PROJECT JAM DIGITAL COUNTER UP


Gambar 6.4. Format tampilan jam, menit dan detik


;Percobaan 6.1.1

;Timer dengan counting UP

;Rencanakan program assembly untuk pembuatan jam digital JJ:MM:DD


;========================================================
;Project Jam Digital Counter Up
;Dengan menggunakan LCD Character
;Visit elektronika-elektronika.blogspot.com
;=========================================================

pencacah20 equ 70h
menit equ 72h
jam equ 73h
menit1 equ 74h
menit10 equ 75h
jam1 equ 76h
jam10 equ 77h
detik equ 78h
detik1 equ 79h
detik10 equ 7ah
dispclr equ 00000001b
funcset equ 00111000b
entrmod equ 00000110b
dispon equ 00001100b
org 0h
ljmp start
;=============================
;Lokasi vektor interupsi TF1
;=============================
org 3h
reti
org 0bh
ajmp timerinterrupt
org 13h
reti
org 23h
reti
Start: mov pencacah20,#20
mov detik,#0
mov jam,#0
mov menit,#0
acall perbaruitampilan
anl TMOD,#11110000b
orl TMOD,#00000001b
mov tl0,#0afh
mov th0,#03ch
setb ET0
setb EA
setb TR0
acall init_lcd
;
;======================================================
;Sub rutine berikut digunakan untuk menampilan display
;Jam, Menit dan Detik dengan format JJ:MM:DD
;Perhatikan bahwa Looping forever akan terjadi pada
;subrutine ini. Dan display akan diperbaruhi apabila
;subrutine ini mendapatkan interupsi dari timer 1 TF1
;=====================================================
scandisplay:
mov r1,#8ch
acall write_inst
mov r1,detik1
acall write_data
;
mov r1,#8bh
acall write_inst
mov r1,detik10
acall write_data
;
mov r1,#89h
acall write_inst
mov r1,menit1
acall write_data
;
mov r1,#88h
acall write_inst
mov r1,menit10
acall write_data
;
mov r1,#86h
acall write_inst
mov r1,jam1
acall write_data
;
mov r1,#85h
acall write_inst
mov r1,jam10
acall write_data
sjmp scandisplay
;

write_inst:
clr P1.0
mov P0,R1
setb P1.1
acall delay
clr P1.1
ret
;
write_data:
setb P1.0
mov P0,R1
setb P1.1
acall delay
clr P1.1
ret
;
delay: mov R0,#0
delay1: mov R2,#50
djnz R2,$
djnz R0,delay1
ret
;
;================================
;PROCEDURE INISIALISAS
; LCD KARAKTER 2 X 16
;===============================
init_lcd:
mov r1,#dispclr
acall write_inst
mov r1,#funcset
acall write_inst
mov r1,#dispon
acall write_inst
mov r1,#entrmod
acall write_inst
ret
;
;==============================================================
;Instruksi berikut digunakan untuk memberikan layanan
;interupsi, dan akan terjadi setiap 0.05 detik.
;dan data 50.000 ( 3CAFh ) diloadkan ke TL1 dan TH1
;setiap subrutine ini dilayani.
;Pada subrutine ini pencacah20 akan didecrement sampai
;menghasilkan nilai Pencacah20=0, yang terjadi setiap
;20 X 50000 uS = 20 X 0,05s = 1 s,apabila ini terjadi maka
;akan dipanggil subrutine jamdigital, untuk melakukan increment
;data detik, menit, atau jam
;==============================================================
timerinterrupt:
mov tl0,#0afh
mov th0,#03ch
djnz pencacah20,selesaiinterupsi
mov pencacah20,#20
acall jamdigital
selesaiinterupsi:
reti
;
jamdigital:
inc detik
mov a,#60
cjne a,detik,perbaruitampilan
mov detik,#0
;
satumenit:
inc menit
mov A,#60
cjne A,menit,perbaruitampilan
mov menit,#0
;
satujam:
inc jam
mov A,#24
cjne A,jam,perbaruitampilan
mov jam,#10

perbaruitampilan:
mov a,detik
mov b,#10
div ab
mov detik1,b
mov detik10,a
;
mov a,menit
mov b,#10
div ab
mov menit1,b
mov menit10,a
;
mov a,jam
mov b,#10
div ab
mov jam1,b
mov jam10,a
;
mov a,#30h
add a,Detik1
mov detik1,a
;
mov a,#30h
add a,Detik10
mov detik10,a
;
mov a,#30h
add a,menit1
mov menit1,a
;
mov a,#30h
add a,menit10
mov menit10,a
;
mov a,#30h
add a,jam1
mov jam1,a
;
mov a,#30h
add a,jam10
mov jam10,a
;
ret
end

Post a Comment

0 Comments