Prinsip kerja dari rangkaian kontrol jam digital dengan menggunakan komunikasi paralel PC adalah, mengontrol nilai bit jam, menit, dan detik yang ditampilkan pada seven segment dengan menggunakan botton atau tombol dengan menggunakan pemrograman visual basic.
PORT A kita hubungkan dengan 7S-DETIK, PORT B kita hubungkan dengan 7S-MENIT dan PORT C kita hubungkan dengan 7S-JAM. Nilai bit pada 7S-DETIK dan 7S-MENIT merupakan up-counter dengan modulo 60, sedangkan 7S-JAM merupakan up-counter modulo 24. Pertama kita setting nilai detik, menit, dan jam sesuai dengan jam yang sesungguhnya. Untuk mensettingnya kita menggunakan tombol pada visual basic, sehingga pada visual basic ada tombol detik, menit, jam, run dan reset yang mempunyai nilai output yang berbedah. Nilai output tombol detik 01H, tombol menit 02H, tombol jam 04H, tombol RUN 08H dan tombol RESET 10H.
Karena output LPT kita hubungkan dengan port 1 maka output LPT sebagai nilai input port 1. Selanjutnya dilakukan pengecekan apabila nilai input 01H maka nilai detik bertambah 1 dengan menggunakan perintah INC, apabila nilai input 02H nilai menit bertambah 1, dan apabila nilai input 04H maka nilai jam yang bertambah 1. Ketika nilai detik, menit, dan jam sudah sama seperti nilai yang sebenarnya maka program akan berjalan secara otomatis. Apabila 7S-DETIK sudah mencapai nilai 60 maka nilai menit bertambah 1 secara otomatis dan nilai detik dimulai dari 0 lagi. Selanjutnya apabila nilai menit sudah mencapai hitungan 60 maka nilai jam bertambah 1 secara otomatis dan nilai menit dimulai dari 0 lagi. Sedangkan apabila nilai jam sudah mencapai hitungan 24 maka nilai menit dan detik dimulai dari nilai 0 lagi, yaitu sama dengan jam yang sesungguhnya. Dibawah ini adalah progrom DT-51 yang kita gunakan
Program assembly
$MOD51
;==============================================
; Program control jam digital pada display
; 7 Segment menggunakan control paralel
;==============================================
org 4000h
mov a,#01h
mov (5000h),a
mov a,#01h
mov (6000h),a
mov a,#80h
mov dptr,#2003h
movx @dptr,a
mov 30h,#0ah
mov 40h,#0h
mov 50h,#0ah
mov 60h,#0h
awal: jb p1.2,run
mov 10h,#0ah
mov 20h,#0h
mov b,#10h
jmp awal
detik: mov 10h,#0ah
mov 20h,#0h
mov b,#10h
jb p1.0,lompatreset
run: clr a
lup: mov dptr,#2000h
movx @dptr,a
acall delay
inc a
jb p1.0,lompatreset
cjne a,10h,lup
mov a,10h
add a,b
cjne a,#06ah,ok
jmp menit
ok: mov 10h,a
mov a,20h
add a,b
mov 20h,a
jmp lup
menit: jb p1.0,reset
mov a,(5000h)
mov dptr,#2001h
movx @dptr,a
inc a
jb p1.0,reset
mov (5000h),a
cjne a,#59h,lompat
call delay
jmp resetjam
lompat: cjne a,30h,detik
mov (5000h),a
mov a,30h
add a,b
cjne a,#06ah,ok1
jmp jam
ok1: mov 30h,a
mov a,40h
add a,b
mov 40h,a
mov (5000h),a
jmp menit
lompatdetik: jmp detik
lompatreset: jmp reset
jam: jb p1.0,lompatreset
mov a,(6000h)
mov dptr,#2002h
movx @dptr,a
inc a
mov (6000h),a
cjne a,50h,detik
mov a,50h
add a,b
cjne a,#02ah,ok2
jmp akhir
akhir: jb p1.0,lompatreset
mov a,(6000h)
mov dptr,#2002h
movx @dptr,a
acall delay
inc a
mov (6000h),a
cjne a,#24h,lompatdetik
jmp detik
ok2: mov 50h,a
mov a,60h
add a,b
mov 60h,a
mov (6000h),a
jmp jam
reset: mov a,#00h
mov dptr,#2000h
movx @dptr,a
clr a
mov dptr,#2001h
movx @dptr,a
clr a
mov a,#01h
mov (5000h),a
clr a
mov dptr,#2002h
movx @dptr,a
clr a
mov a,#01h
mov (6000h),a
jmp detik
resetjam: clr a
mov dptr,#2000h
movx @dptr,a
clr a
mov dptr,#2001h
movx @dptr,a
clr a
mov a,#00h
mov (5000h),a
mov 30h,#0ah
mov 40h,#0h
mov 50h,#0ah
mov 60h,#0h
jmp jam
delay: mov r7,#01h
del1: mov r6,#0ffh
del2: mov r5,#0ffh
djnz r5,$
djnz r6,del2
djnz r7,del1
ret
end
Program VB
Private Declare Function PortInp Lib “io.dll” (ByVal Port As Integer) As Byte
Private Declare Sub PortOut Lib “io.dll” (ByVal Port As Integer, ByVal Value As Byte)
Private Declare Sub Sleep Lib “Kernel32″ (ByVal dwMilliseconds As Long)
Private Sub Command1_Click()
Port1 = 888
PortOut Port1, 1
Sleep (100)
PortOut Port1, 0
End Sub
Private Sub Command2_Click()
Port1 = 888
PortOut Port1, 2
Sleep (100)
PortOut Port1, 0
End Sub
Private Sub Command3_Click()
Port1 = 888
PortOut Port1, 4
Sleep (100)
PortOut Port1, 0
End Sub
Private Sub Command3_Click()
Port1 = 888
PortOut Port1, 8
Sleep (100)
PortOut Port1, 0
End Sub
Private Sub Command3_Click()
Port1 = 888
PortOut Port1, 10
Sleep (100)
PortOut Port1, 0
End Sub
Private Sub Form_Load()

