Rabu, 09 Februari 2011

JAM DIGITAL

  1. 1. Pendahuluan
Dalam praktikum kali ini praktikan akan membuat suatu aplikasi sederhana dari berbagai kompetensi yang telah dipelajari pada praktikum sismik sebelumnya. Praktikan memilih membuat suatu jam digital dengan input 4×4 keypad dan output LCD. Diharapkan setelah praktikum ini praktikan dapat mengaplikasikan ilmu yang telah dipelajari pada praktikum sebelumnya
  1. 2. Spesifikasi Minimum Aplikasi

  • Aplikasi menggunakan mikrokontroller AT89S51
  • keadaan awal tampilan pada LCD saat  program saat pertama kali dijalankan adalah 00:00:00
  • Untuk menampilkan kursor, digunakan 1 keypad
  • Untuk mengubah angka, digunakan 1 keypad yang akan menambahkan angka 1 demi satu.
  • Untuk memindahkan kursor, digunakan 1 keypad.
  • Untuk menghilangkan kursor, digunakan 1 buah keypad.
  • Untuk mereset tampilan LCD menjadi 00: 00:00, digunakan 1 buah keypad.
Berikut ini merupakan hardware rancangan jam digital yang dipakai:

Desain sismin dengan mikrokontroler AT89S51
perancangan keypad 4×4
Berikut ini merupakan program jam digital dengan ASM51:
$mod51
;built-in routine
;initlcd  equ 0740h
;commandlcd equ 07b0h
;writelcd equ 07d0h
;setddram equ 0850h
;command word
;displayclear  equ 01h
;deccursor  equ 04h
;inccursor  equ 06h
Counter20  equ 70h
second     equ 71h
minute     equ 72h
hour       equ 73h
secondOnes equ 74h
secondTens equ 75h
minuteOnes equ 76h
minutetens equ 77h
hourOnes   equ 78h
hourTens   equ 79h
;
;  cseg
org 0h
ljmp start
;=============================
;vektor interrupt TF0 location
;=============================
org 0bh
Ljmp timerinterrupt
;
Start:
mov p0,#0ffh
mov counter20,#20
mov second,#0
mov minute,#0
mov hour,#0
call UpdateDisplay
mov TMOD,#00000001b
mov tl0,#0b0h
mov th0,#03ch
setb ET0
setb EA
setb TR0
call init_lcd
;        lcall initlcd
;        lcall delay
;
;========================================================
;This subroutine will display Digital Clock as HH:MM:SS
;as you have seen, this subroutine execute every time
;========================================================
scandisplay:
;        mov a,#08h
;        lcall setddram
;        lcall delay
;        mov a,#deccursor
;        lcall commandlcd
;        lcall delay
mov r1,#8ch
acall write_inst
mov r1,secondones
acall write_data
;        mov a,secondones
;        lcall writelcd
;        lcall delay
mov r1,#8bh
acall write_inst
mov r1,secondtens
acall write_data
;        mov a,secondtens
;        lcall writelcd
;        lcall delay
;
;        mov a,#3ah
;        lcall writelcd
;        lcall delay
mov r1,#89h
acall write_inst
mov r1,minuteones
acall write_data
;        mov a,minuteones
;        lcall writelcd
;        lcall delay
;
mov r1,#88h
acall write_inst
mov r1,minutetens
acall write_data
;        mov a,minutetens
;        lcall writelcd
;        lcall delay
;
;        mov a,#3ah
;        lcall writelcd
;        lcall delay
;
mov r1,#86h
acall write_inst
mov r1,hourones
acall write_data
;        mov a,hourones
;        lcall writelcd
;        lcall delay
;
mov r1,#85h
acall write_inst
mov r1,hourtens
acall write_data
;        mov a,hourtens
;        lcall writelcd
;        lcall delay
;====================
;Check for keypad input
;====================
mov p1,#0feh
jnb p1.4,inchour
jnb p1.5,dechour
mov p1,#0fdh
jnb p1.4,incminute
jnb p1.5,decminute
mov p1,#0fbh
jnb p1.4,incsecond
jnb p1.5,decsecond
sjmp scandisplay
inchour:
inc hour
lcall delay
sjmp scandisplay
dechour:
dec hour
sjmp scandisplay
incminute:
inc minute
sjmp scandisplay
decminute:
dec minute
sjmp scandisplay
incsecond:
inc second
sjmp scandisplay
decsecond:
dec second
sjmp scandisplay
;
Init_lcd:
mov r1,#00000001b ;Display clear
acall write_inst  ;
mov r1,#00111000b ;Function set,
;Data 8 bit,2 line font 5×7
acall write_inst  ;
mov r1,#00001100b ;Display on,
;cursor off,cursor blink off
acall write_inst
mov r1,#00000110b ;Entry mode, Set increment
acall write_inst
ret
Write_inst:
clr p3.0  ; RS = p3.0 = 0, write mode instruction
mov p2,R1 ; D7 s/d D0 = p1 = R1
setb p3.1 ; EN = 1 = p3.1
call delay; call delay time
clr p3.1  ; EN = 0 = p3.1
ret
Write_data:
setb p3.0 ; RS = p3.0 = 1, write mode data
mov p2,R1 ; D7 s/d D0 = p1 = R1
setb p3.1 ; EN = 1 = p3.1
call delay; call delay time
clr p3.1  ; EN = 0 = p3.1
ret
delay: mov R0,#0
delay1:mov R7,#0fh
djnz R7,$
djnz R0,delay1
ret
;
;===================================================
;this subroutine will execute every 0,05 second
;after 20 interruption, Digital clock will be updated
;===================================================
timerinterrupt:
mov tl0,#0B0h
mov th0,#03Ch
djnz counter20,EndInterrupt
mov counter20,#20
mov a,#24
cjne a,hour,DigitalClock
sjmp reset
EndInterrupt:
reti
;
;===================================================
;This subroutine below, will process digital clock
;and updates value for second, minute, hour
;===================================================
DigitalClock:
OneSecond:
inc second
mov a,#60
cjne a,second,UpdateDisplay
mov second,#0
;
OneMinute:
inc minute
mov A,#60
cjne A,minute,UpdateDisplay
mov minute,#0
;
OneHour:
inc hour
mov A,#24
cjne A,hour,UpdateDisplay
mov hour,#0
mov minute,#0
mov second,#0
;
UpdateDisplay:
mov a,second
mov b,#10
div ab
mov secondOnes,b
mov secondTens,a
;
mov a,minute
mov b,#10
div ab
mov minuteOnes,b
mov minutetens,a
;
mov a,hour
mov b,#10
div ab
mov hourOnes,b
mov hourTens,a
;
mov a,#30h
add a,secondOnes
mov secondOnes,a
;
mov a,#30h
add a,secondTens
mov secondTens,a
;
mov a,#30h
add a,minuteOnes
mov minuteOnes,a
;
mov a,#30h
add a,minutetens
mov minutetens,a
;
mov a,#30h
add a,hourOnes
mov hourOnes,a
;
mov a,#30h
add a,hourTens
mov hourTens,a
;
reti
reset:
mov hour,#0
sjmp DigitalClock
END
———————————————————————————-
Dan tampilan dalam software simulasi ISIS adalah sebagai berikut:
gambar simulasi dalam ISIS
Selamat mencoba buat kawan-kawan yang ingin membuat jam digital dengan AT89S51 ^^

Tidak ada komentar:

Posting Komentar