Welcome

Pages

Tuesday, April 26, 2011

PENERJEMAH DAN PEMBUAT SANDI MORSE PRAMUKA BERBASIS MIKROKONTROLER AT89C51










Alat ini digunakan untuk penerjemah dan pembuat sandi morse pramuka berbasis mikrokontroler AT89C51, dimana mikrokontroler digunakan untuk memuat program dan menterjemahkan masukan yang terjadi. Tampilan LCD menghasilkan penerjemahan dari masukan. Layar LCD akan menampilkan huruf abjad atau sandi morse sesuai dengan masukan perintah yang diberikan.




List Program
;======================================================
; Program KODE MORSE
; aT89a51
; INTERFACE KEYBOARD PS2
;======================================================
data_m1 bit 20h.0
data_m2 bit 20h.1
data_m3 bit 20h.2
data_m4 bit 20h.3
data_m5 bit 20h.4

DataKeyboard equ 30h
Datamorse equ 20h

KbdData bit P3.2
KbdClock bit P3.3

rs_LCD bit p1.1
en_LCD bit p1.0
;======================================================
; Program Utama
;======================================================
org 00h
mov datamorse,#0ffh

call hapus_tampilan

call init_LCD

call tulis_atas_1
call tulis_bawah_1

call tunda_long

start: mov datamorse,#0ffh
call tulis_atas_2
call tulis_bawah_2

mulai: JB KbdClock,$
call ambilkeyboard
jnc mulai
clr a
mov a,datakeyboard
sjmp Tombol_1

Tombol_1: cjne a,#'1',Tombol_2
ajmp abjad_ke_morse

Tombol_2: cjne a,#'2',selesai_scan
ajmp morse_ke_abjad

selesai_scan:
clr c
sjmp mulai

abjad_ke_morse:
call tulis_atas_3
call tulis_bawah_3
sjmp awalan_abjad

morse_ke_abjad:
call tulis_atas_4
call tulis_bawah_4
jmp awalan_morse

awalan_abjad:
JB KbdClock,$ ; tunggu bit kbdclock, sampai 0
call ambilKeyboard ; panggil ambil keyboard
jnc awalan_abjad ; lompat ke awalan jika C = 1
call Tampil ; jika C = 0 panggil subrutin lcd out
clr C
mov a,DataKeyboard
mov r3,#16
mov r1,#0c0h
scan_A: cjne a,#'A',scan_B
call TUlis_char_A
jmp awalan_abjad
scan_B: cjne a,#'B',scan_C
call TUlis_char_B
jmp awalan_abjad
scan_C: cjne a,#'C',scan_D
call TUlis_char_C
jmp awalan_abjad
scan_D: cjne a,#'D',scan_E
call TUlis_char_D
jmp awalan_abjad
scan_E: cjne a,#'E',scan_F
call TUlis_char_E
jmp awalan_abjad
scan_F: cjne a,#'F',scan_G
call TUlis_char_F
jmp awalan_abjad
scan_G: cjne a,#'G',scan_H
call TUlis_char_G
jmp awalan_abjad
scan_H: cjne a,#'H',scan_I
call TUlis_char_H
jmp awalan_abjad
scan_I: cjne a,#'I',scan_J
call TUlis_char_I
jmp awalan_abjad
scan_J: cjne a,#'J',scan_K
call TUlis_char_J
jmp awalan_abjad
scan_K: cjne a,#'K',scan_L
call TUlis_char_K
jmp awalan_abjad
scan_L: cjne a,#'L',scan_M
call TUlis_char_L
jmp awalan_abjad
scan_M: cjne a,#'M',scan_N
call TUlis_char_M
jmp awalan_abjad
scan_N: cjne a,#'N',scan_O
call TUlis_char_N
jmp awalan_abjad
scan_O: cjne a,#'O',scan_P
call TUlis_char_O
jmp awalan_abjad
scan_P: cjne a,#'P',scan_Q
call TUlis_char_P
jmp awalan_abjad
scan_Q: cjne a,#'Q',scan_R
call TUlis_char_Q
jmp awalan_abjad
scan_R: cjne a,#'R',scan_S
call TUlis_char_R
jmp awalan_abjad
scan_S: cjne a,#'S',scan_T
call TUlis_char_S
jmp awalan_abjad
scan_T: cjne a,#'T',scan_U
call TUlis_char_T
jmp awalan_abjad
scan_U: cjne a,#'U',scan_V
call TUlis_char_U
jmp awalan_abjad
scan_V: cjne a,#'V',scan_W
call TUlis_char_V
jmp awalan_abjad
scan_W: cjne a,#'W',scan_X
call TUlis_char_W
jmp awalan_abjad
scan_X: cjne a,#'X',scan_Y
call TUlis_char_X
jmp awalan_abjad
scan_Y: cjne a,#'Y',scan_Z
call TUlis_char_Y
jmp awalan_abjad
scan_Z: cjne a,#'Z',scan_0
call TUlis_char_Z
jmp awalan_abjad
scan_0: cjne a,#'0',scan_1
call TUlis_char_0
jmp awalan_abjad
scan_1: cjne a,#'1',scan_2
call TUlis_char_1
jmp awalan_abjad
scan_2: cjne a,#'2',scan_3
call TUlis_char_2
jmp awalan_abjad
scan_3: cjne a,#'3',scan_4
call TUlis_char_3
jmp awalan_abjad
scan_4: cjne a,#'4',scan_5
call TUlis_char_4
jmp awalan_abjad
scan_5: cjne a,#'5',scan_6
call TUlis_char_5
jmp awalan_abjad
scan_6: cjne a,#'6',scan_7
call TUlis_char_6
jmp awalan_abjad
scan_7: cjne a,#'7',scan_8
call TUlis_char_7
jmp awalan_abjad
scan_8: cjne a,#'8',scan_9
call TUlis_char_8
jmp awalan_abjad
scan_9: cjne a,#'9',scan_out
call TUlis_char_9
jmp awalan_abjad
scan_out: cjne a,#00h,LANJUTAN
jmp start

lanjutan:
clr c
jmp awalan_abjad

awalan_morse:
JB KbdClock,$ ; tunggu bit kbdclock, sampai 0
call ambilKeyboard ; panggil ambil keyboard
jnc awalan_morse ; lompat ke awalan jika C = 1
call tampil_b1
clr C
mov a,DataKeyboard
jmp scanning_morse_1

m2: JB KbdClock,$ ; tunggu bit kbdclock, sampai 0
call ambilKeyboard ; panggil ambil keyboard
jnc m2 ; lompat ke awalan jika C = 1
call tampil_b2
clr C
mov a,DataKeyboard
jmp scanning_morse_2

m3: JB KbdClock,$ ; tunggu bit kbdclock, sampai 0
call ambilKeyboard ; panggil ambil keyboard
jnc m3 ; lompat ke awalan jika C = 1
call tampil_b3
clr C
mov a,DataKeyboard
jmp scanning_morse_3

m4: JB KbdClock,$ ; tunggu bit kbdclock, sampai 0
call ambilKeyboard ; panggil ambil keyboard
jnc m4 ; lompat ke awalan jika C = 1
call tampil_b4
clr C
mov a,DataKeyboard
jmp scanning_morse_4

m5: JB KbdClock,$ ; tunggu bit kbdclock, sampai 0
call ambilKeyboard ; panggil ambil keyboard
jnc m5 ; lompat ke awalan jika C = 1
call tampil_b5
clr C
mov a,DataKeyboard
jmp scanning_morse_5


;======================================================
;Subrutine scaning morse
;======================================================
scanning_morse_1:
scan_titik_1:
cjne a,#'.',scan_garis_1
clr data_m1 ; nolkan bit
call tampil_b1
jmp m2
scan_garis_1:
cjne a,#'-',scan_hasil_1
setb data_m1 ; buat logika 1 bit
call tampil_b1
jmp m2
scan_hasil_1:
cjne a,#'=',ulangi_scan_titik_1
jmp mulai_konversi_1
ulangi_scan_titik_1:
jmp awalan_morse

scanning_morse_2:
scan_titik_2:
cjne a,#'.',scan_garis_2
clr data_m2 ; nolkan bit
call tampil_b2
jmp m3
scan_garis_2:
cjne a,#'-',scan_hasil_2
setb data_m2 ; buat logika 1 bit
call tampil_b2
jmp m3
scan_hasil_2:
cjne a,#'=',ulangi_scan_titik_2
jmp mulai_konversi_1
ulangi_scan_titik_2:
jmp m2

scanning_morse_3:
scan_titik_3:
cjne a,#'.',scan_garis_3
clr data_m3 ; nolkan bit
call tampil_b3
jmp m4
scan_garis_3:
cjne a,#'-',scan_hasil_3
setb data_m3 ; buat logika 1 bit
call tampil_b3
jmp m4
scan_hasil_3:
cjne a,#'=',ulangi_scan_titik_3
jmp mulai_konversi_2
ulangi_scan_titik_3:
jmp m3

scanning_morse_4:
scan_titik_4:
cjne a,#'.',scan_garis_4
clr data_m4 ; nolkan bit
call tampil_b4
jmp m5
scan_garis_4:
cjne a,#'-',scan_hasil_4
setb data_m4 ; buat logika 1 bit
call tampil_b4
jmp m5
scan_hasil_4:
cjne a,#'=',ulangi_scan_titik_4
jmp mulai_konversi_3
ulangi_scan_titik_4:
jmp m4

scanning_morse_5:
scan_titik_5:
cjne a,#'.',scan_garis_5
clr data_m5 ; nolkan bit
call tampil_b5
jmp mulai_konversi_5
scan_garis_5:
cjne a,#'-',scan_hasil_5
setb data_m5 ; buat logika 1 bit
call tampil_b5
jmp mulai_konversi_5
scan_hasil_5:
cjne a,#'=',ulangi_scan_titik_5
jmp mulai_konversi_4
ulangi_scan_titik_5:
jmp m5

;============================================
;Subrutine AmbilKeyboard
;===========================================
AmbilKeyboard:
call ambil_scancode ; panggil ambil scan code rutin
tunggu_tombol_dilepas :
cjne a,#0F0h,kybd_tidakLepas ; cek a = 0f0h ? jika tidak lompat
; ke sub kybd_tidaklepas
JB KbdClock,$ ; tunggu bit kbdclock hingga 0
call ambil_Scancode ; panggil sub ambil scan kode
Setb C ; c = 1
call Konversi_Scancode ; panggil sub konversi scan kode
ret
Kybd_tidakLepas:
Clr C
ret
;======================================================
;Subrutine Konversi_ScanCode
;======================================================
Ambil_scanCode:
clr A ; hapus a
Jnb KbdClock,$ ; tunggu kbdclock = 1
mov R2,#08h ; isi R0 dengan nilai 8
Ambil_ScanCode2:
Jb KbdClock,$ ; tunggu kbdclock = 0
Mov C,KbdData ; kopi kbd data ke bit C
Rr A ; putar ke kanan isi akumulator
mov acc.7,C ; kopi isi bit C ke accumulator bit ke 7
Jnb KbdClock,$ ; tunggu kbdclock = 1
Djnz R2,Ambil_ScanCode2 ; kurangi dengan 1 (r0 = 8) sampai 0 jika
; blm 8X lompat sub ambil scankode2
Jb KbdClock,$ ; tunggu kbdclock = 0
Jnb KbdClock,$ ; tunggu kbdclock = 1
Jb KbdClock,$ ; tunggu kbdclock = 0
Jnb KbdClock,$ ; tunggu kbdclock = 1
ret

Konversi_ScanCode:
Mov DPTR,#TableKeyboard ; tabel di kopi ke DPTR
movc A,@A+DPTR
mov datakeyboard,A ; copy a ke ram datakeyboard
ret
;======================================================
; Subrutin Inisialisasi LCD
;======================================================
Init_lcd:
mov r1,#00000001b ;Display clear
acall write_inst
mov r1,#00111000b ;Function set, Data 8 bit,2 line font 5x7
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
;======================================================
; Subrutin Instruksi LCD
;======================================================
Tampil:
mov R1,#0c4h ; copy 0c1H ke Register 1
call write_inst ; panggil sub write inst
mov R1,30H ; copy datakeyboard ke Register 1
call write_data ; panggil sub write data
ret
Tampil_b1:
mov R1,#0c0h ; copy 0c0H ke Register 1
call write_inst ; panggil sub write inst
mov R1,30H ; copy datakeyboard ke Register 1
call write_data ; panggil sub write data
ret
Tampil_b2:
mov R1,#0c1h ; copy 0c1H ke Register 1
call write_inst ; panggil sub write inst
mov R1,30H ; copy datakeyboard ke Register 1
call write_data ; panggil sub write data
ret
Tampil_b3:
mov R1,#0c2h ; copy 0c2H ke Register 1
call write_inst ; panggil sub write inst
mov R1,30H ; copy datakeyboard ke Register 1
call write_data ; panggil sub write data
ret
Tampil_b4:
mov R1,#0c3h ; copy 0c3H ke Register 1
call write_inst ; panggil sub write inst
mov R1,30H ; copy datakeyboard ke Register 1
call write_data ; panggil sub write data
ret
Tampil_b5:
mov R1,#0c4h ; copy 0c4H ke Register 1
call write_inst ; panggil sub write inst
mov R1,30H ; copy datakeyboard ke Register 1
call write_data ; panggil sub write data
ret

No comments: