Belajar interface Modem Wavecom dengan AT89S52


Susahnya belajar interface gara2 yang banyak dipasaran konektor modem ini sekarang sudah menggunakan USB. padahal untuk komunikasi mikrokontroler menggunakan komunikasi serial atau yang sering disebut konektor pin db9/com, untuk pemrogramannya sih lebih enak hanya standar seial baudrate dan komunikasi datanya format text atau ascii tidak seperti komunikasi menggunakan handphone yang menggunakan PDU. Setelah itu saya nekat membeli modem ini yang usb karena tidak ada lagi yang jual db9 harganya sekitar 325 ribuan, gara2 susah dan tidak tahu sama sekali cara komunikasi usb lama sekali modem tidak bisa terpakai……
ini foto modemnmnya

Setelah lihat2 tutorial kebanyakan modemnya masih yang serial, kemudian saya membeli konverter usb ke rs232 dengan berharap bisa langsung dikomunikasikan… tetapi apa yang terjadi malah tidak bisaaaaaa…
Proses I.
Kemudian tetap semangat search di google ternyata ada salah satu web yang memperlihatkan cara koneksi modem ini secara langsung (TTL) yaitu tidak melewati konverter/konektor seperti usb dan rs 232 tetapi harus membongkar modem wavecom. kemudian saya bongkar modemnya dan saya contoh tutorialnya dengan cara menjumper titik konektor tx dan rx (TTL) modem. Hasilnya waow hebat saya dapat menjumpernya dengan kabel, saya sangan senang sekali akhirnya dapat dengan mudah mengkoneksikan modem ini dengan mikrokontroler tanpa melalui konektor db9, pakai usbpun bisa. eh malah jumperannya coplok gara2 kesenggol dan pin konektor TTLnya pun rusakkkk…..
contoh koneksi TTL nyontoh di web orang

Koneksi Modem ke komputer

cara setting baudrate:
1. hubungkan usb modem ke cpu
2. cari com yang terdeteksi pada komputer misal com 8
3. setting default wavecom 115200
4. ketik AT kemudian enter jika balasan ok berarti sudah konek
5. untuk bisa komunikasi dengan mikro baudrate harus dirubah ke 19200/ lainnya.
6. ketik at+ipr=19200 kemudian enter
tutup hyperterminal kemudian buka kembali dari awal setting baudrate 19200….
7. balasan ok kemudian menghilangkan echo ketik ATE0 enter
8. Settingan harus disimpan ke eeprom wavecom dengan cara ketik AT&W kemudian enter.
9. Modem siap dikomunikasikan dengan mikro

Untuk rangkaiannya bikin sendiri cm konek ke tx dan rx mikrokontroler
contoh listing program assembly kirim at command ke modem melalui mikro at89s52

;#########################################################################;
; Program SMS controler 2 titik lampu menggunakan 2 buah relai
; Mikrokontroler at89s52
; modem wavecom1206b
;#########################################################################;
LED bit P1.2
Relai_1 bit p2.0
Relai_2 bit p2.1

data_pesan equ 30h
;#########################################################################;
ORG 00H

clr led
call tunda_long
setb led
call tunda_long
clr led
call tunda_long
call initial
;#########################################################################;
; program_utama loop
;#########################################################################;
Program_utama: call kirim_ate0
call tunda_long
call Kirim_at

tunggu_1: jnb ri,$
clr ri
mov A,sbuf
cjne A,#’O’,tunggu_1
jnb ri,$
clr ri
mov A,sbuf
tunggu_2: cjne A,#’K’,tunggu_2
call tunda_long
jmp kirim_pesan

Kirim_pesan: call kirim_sms
tunggu_sms_1: jnb ri,$
clr ri
mov A,sbuf
cjne A,#’>’,tunggu_sms_1
call tunda_long
call Kirim_isi_sms
tunggu_sms_2: jnb ri,$
clr ri
mov A,sbuf
cjne A,#’>’,tunggu_sms_2
call tunda_long
call Kirim_ctrlz
setb led
jmp $

Looping: jnb ri,$
clr ri
mov A,sbuf
mov @R0,a
cjne A,#’K’,tunggu_2
ret
;#########################################################################;
Print_At: db ‘at’,13,10,0
Print_Ate0: db ‘ate0′,13,10,0
Print_sms: db ‘at+cmgs=083840377711′,13,10,0
Print_isi_sms: db ‘Tes sms nganggo modem wavecom’,13,10,0
;#########################################################################;
; INISIALISASI BAUT RATE 19200
;#########################################################################;
INITIAL: MOV SCON,#50H ;INISIALISASI BAUD RATE 19200
MOV TMOD,#20H
Mov 87h,#80h
MOV TH1,#0FdH
SETB TR1
RET
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>HAPUS SMS DI LOKASI INBOX INDEX 1>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Kirim_at: MOV DPTR,#print_at ;KIRIM PRINTAH ‘AT+CMGD=1′
jmp tunggu_at
Kirim_ate0: MOV DPTR,#print_ate0
jmp tunggu_at
Kirim_sms: MOV DPTR,#Print_sms
jmp tunggu_at
Kirim_isi_sms: MOV DPTR,#Print_isi_sms
jmp tunggu_at

Kirim_ctrlz: mov A,#26
clr ti
mov sbuf,a
ret

Tunggu_at: CLR A ;KOSONGKAN ACC
MOVC A,@A+DPTR ;AMBIL DATA TABEL YANG DITUNJUK DPTR
CLR TI ;AKTIVASI KIRIM SERIAL
MOV SBUF,A ;KIRIMKAN DATA
JNB TI,$ ;TUNGGU SELESAI DIKIRIM
INC DPTR ;NAIKKAN PENUNJUK TABEL
CJNE A,#00,Tunggu_at ;TUNGGU SEMUA KARAKTER DIKIRIM
ret
;#########################################################################;
; TUNDA WAKTU
;#########################################################################;
TUNDA_LONG: MOV R5,#010H
JJz: CALL TUNDA
DJNZ R5,JJz
RET
TUNDA: MOV R7,#100
LD1: DJNZ R6,$
DJNZ R7,LD1
RET
end

bersambung

Dotmatrix 8×8 + eeprom + keyboard ps/2


Assalamu’alaikum

Sudah lama tidak update, berhubung banyak yang menginginkan software menginput dotmatrix pakai keyboard saya coba upload tema tentang dotmatrix 8×8 ini.
semua alat yang saya upload itu sudah pernah dibikin semua dan banyak yang mengira programnya saya hilangkan padahal itu semua sudah sy kasih yang benar baik hardware maupun programnya. bahkan ada yang cuma minta file hexnya. padahal sudah saya beri file master.asmnya atau file.a51.
dotmatrix ini saya gunakan jenis 8×8 warna merah dan saya pakai 1 pcb total 5 dotmatrix jadi keseluruhan kolom matrixnya adalah 8×5= 40 kolom. memori penyimpanan karakter huruf yang diketik melalui keyboard langsung disimpan ke eeprom at24c64 bisa save sampai 2000 karakter tulisan. program ini baru bisa menampilkan karakter huruf font 5×7. dan sudah bisa menampilkan jam / kalender insyaalloh. untuk penjelasan tentang keyboard pokoknya setiap tanda huruf memiliki scankode hexa sendiri jadi mikrokontroler tinggal membaca data dan mengkonversikannya saja ke dalam bentuk ascii. untuk huruf besar dan kecil berbeda, untuk huruf besar harus menekan capslock pada keyboard dan jika untuk menginput huruf kecil tekan lagi key capslock.

Pcbnya terdiri dari 2 bagian yaitu bagian master dan slave, karena saya menggunakan komunikasi antar port mikrokontroler tetapi secara paralel. untuk melihat port 0 (nol) sebagai transfer data 8 bit dan port enable slave 1 dan slave 2. panjang kolom adalah 96 kolom.
Sebelah kiri sendiri adalah master dan kekanan slave 2 pcb jadi total 3 pcb dengan 3 mikrokontroler.
download file pcb eagle + listing program update 05-11-12 tampil hari jam
tanggal bulan tahun + running text disini:

http://www.4shared.com/rar/p3ujeI03/Pcb_Matrix.html

untuk driver barisnya saya gunakan ic 4094 yang dihubungkan ke transistor, dan driver kolomnya juga menggunakan ic 4094 tetapi duhubungkan ke uln2803.

dan ini saya tampilkan foto alat teman yang sudah jadi merakit alat ini, ini kiriman dari
irwanelectronic@ymail.com

spesifikasinya:
1. modul dotmatrix 8 baris x 96 kolom dotmatrix merah/hijau.
2. Input teks keyboard ps/2.
3. bisa input karakter lebih dari 5000 karakter.
4. Bisa setting jam,menit,hari,tanggal,bulan,tahun realtime.
5. +++ program bahasa assembly +++ PCB desain.
6. Antarmuka rtc ds1307 + eeprom at24c64 + keyboardps/2.
Foto alat jika pesan :

beirkut ini listing programnya
Update bisa tampilkan jam kalender + running text

Program Master
;##########################################################################
; Inisialisasi Port
; Program Running Text Pake IC 4094
; Dotmatrix 8×8 mikrokontroler at89s52
; Bisa manampilkan jam +_ kalender
; Menggunakan rtcds1307 + scanning antar mikrokontroler
; 7 baris + 96 kolom
; http://www.mikrokontrolerat89s52.wordpress.com 16-sep-2012
;##########################################################################
CD4094_CP_2 BIT P1.2
CD4094_D_2 BIT P1.1
CD4094_Str_2 BIT P1.0

CD4094_CP_1 BIT P2.0
CD4094_D_1 BIT P2.1
CD4094_Str_1 BIT P2.2

I2C_SDA BIT P1.3
I2C_SCL BIT P1.4
KbdData bit P3.3
KbdClock bit P3.2

Free_1 equ 1ah
Free_2 equ 1bh
Free_3 equ 1ch
Free_4 equ 1dh
DPTR_HIGH equ 1eh
DPTR_LOW equ 1fh
tmp equ 20h

LEDDigit1 DATA 21h
LEDDigit2 DATA 22h
LEDDigit3 DATA 23h
LEDDigit4 DATA 24h
LEDDigit5 DATA 25h
LEDDigit6 DATA 26h
LEDDigit7 DATA 27h
LEDDigit8 DATA 28h
LEDDigit9 DATA 29h
LEDDigit10 DATA 2ah

RTCDetik DATA 2bh ;00
RTCMenit DATA 2ch ;01
RTCjam DATA 2dh ;02
RTCHari DATA 2eh ;03
RTCTanggal DATA 2fh ;04
RTCBulan DATA 30h ;05
RTCTahun DATA 31h ;06
RTCControl DATA 32h ;07

Alamat_eh equ 33h
Alamat_el equ 34h
data_keyboard equ 35h
ketik equ 36h
temp_detik equ 37h
flag_interupsi equ 38h

Data_matrix_1 equ 128
Data_matrix_2 equ 134
Data_matrix_3 equ 140
Data_matrix_4 equ 146
Data_matrix_5 equ 152
Data_matrix_6 equ 158
Data_matrix_7 equ 164
Data_matrix_8 equ 170
Data_matrix_9 equ 176
Data_matrix_10 equ 182
Data_matrix_11 equ 188
Data_matrix_12 equ 194
Data_matrix_13 equ 200
Data_matrix_14 equ 206
Data_matrix_15 equ 212
Data_matrix_16 equ 218
Data_matrix_17 equ 224
Data_matrix_18 equ 230
Data_matrix_19 equ 236
Data_matrix_20 equ 242
Data_matrix_21 equ 248

Data_slave_1 equ 160
Data_slave_2 equ 192

enable_1 bit p3.0
enable_2 bit p3.1

enable_3 bit p3.6
enable_4 bit p3.7
;##########################################################################
; Alamat eeprom
;##########################################################################
WRTCMD EQU 11010000b ;WRITE DATA COMMAND Note 3
RRDCMD EQU 11010001b ;READ DATA COMMAND Note 3
WTCMD EQU 10100000B ;WRITE DATA COMMAND Note 3
RDCMD EQU 10100001B ;READ DATA COMMAND Note 3
RDEND EQU 01000000B ;READ HIGH-ENDURANCE BLOCK NUMBER COMMAND
BYTCNT EQU 8
BYTSTR equ 19h ;STORAGE FOR READ DATA

Shift equ 12h
Caps equ 58h
enter equ 5ah
Ctrl equ 14h
Tambah equ 55h
Kurang equ 4eh

data_huruf equ 0
;##########################################################################
; Program Awal
;##########################################################################
ORG 0
JMP MULAI ;Lompati Interupt Vector Table

ORG 13h
mov flag_interupsi,#0ffh
reti

;—– Program Utama mulai dari siniO
ORG 30h
mov flag_interupsi,#00h
;call tulis_rtc_detik

MULAI: MOV IE,#10000001b ;Hidupkan Interupsi INT0
clr a
call Hapus_tampilan
call Tunda1Detik
;##########################################################################
; Program Utama
;##########################################################################
ProgramLoop: mov A,flag_interupsi
cjne A,#0ffh,restart_awal
MOV IE,#00000000b ;Matikan Interupsi INT0
jmp looping_keyboard

restart_awal: clr a
call Hapus_tampilan
call display_5
mov DPTR,#jam_digital
call tampil_15_huruf
call refresh_jam
call rolling_text

mov free_2,#0
looP_display: call refresh_jam
djnz free_2,looP_display
looP_display2: call refresh_jam
djnz free_2,looP_display2
call Display_jalan

Display_kalender: mov DPTR,#Kalender
call tampil_15_huruf
call refresh_kalender
call rolling_text
mov free_2,#0
looP_kalender: ;call refresh_kalender
djnz free_2,looP_kalender
call Display_jalan
mov A,flag_interupsi
cjne A,#0ffh,Program_running_text
MOV IE,#00000000b ;Matikan Interupsi INT0
jmp looping_keyboard

;##########################################################################
Program_running_text:
call Hapus_tampilan
call display_5
call maco_eeprom_2
call maco_eeprom_4
call rolling_text

jalan_ke_kiri: mov free_1,#6
jalan_ke_kiri_lagi:call geser_kiri
mov free_2,#2 ; kecepatan running

looP_display_2: call display_5
djnz free_2,looP_display_2
Program_running_2:djnz free_1,jalan_ke_kiri_lagi
mov dph,DPTR_high
mov dpl,DPTR_low
call baca_eeprom
mov A,tmp
inc dptr
cjne a,#0ffh,lanjutkan
clr a
call hapus_tampilan
jmp MULAI

lanjutkan: call konversi_m_17
mov DPTR_high,dph
mov DPTR_low,dpl
sjmp jalan_ke_kiri
;##########################################################################
Display_jalan: mov free_3,#20
Jalan_jam: mov free_1,#6
Mlaku_jam: call geser_kiri
mov free_2,#1
looP_jam_2: call display_5
djnz free_2,looP_jam_2
call display_5
djnz free_1,Mlaku_jam
mov A,#’ ‘
call Konversi_m_21
djnz free_3,Jalan_jam
ret
;##########################################################################
refresh_jam: call readallrtc
call StreamRTC
mov A,rtchari
call konversi_hari

mov A,Leddigit1
call konversi_m_9
mov A,Leddigit2
call konversi_m_10

mov A,Leddigit3
call konversi_m_12
mov A,Leddigit4
call konversi_m_13

mov A,Leddigit5
call konversi_m_15
mov A,Leddigit6
call konversi_m_16
call display_5
ret

refresh_kalender: call readallrtc
call Streamkalender
mov A,Leddigit7
call konversi_m_1
mov A,Leddigit8
call konversi_m_2

mov A,rtcbulan
call konversi_bulan

mov A,Leddigit9
call konversi_m_15
mov A,Leddigit10
call konversi_m_16

call display_5
ret
;##########################################################################
konversi_hari: cjne A,#1,konversi_hari_2
mov DPTR,#Minggu
call Konvert_matrix_h
ret
konversi_hari_2: cjne A,#2,konversi_hari_3
mov DPTR,#Senin
call Konvert_matrix_h
ret
konversi_hari_3: cjne A,#3,konversi_hari_4
mov DPTR,#Selasa
call Konvert_matrix_h
ret
konversi_hari_4: cjne A,#4,konversi_hari_5
mov DPTR,#rabu
call Konvert_matrix_h
ret
konversi_hari_5: cjne A,#5,konversi_hari_6
mov DPTR,#kamis
call Konvert_matrix_h
ret
konversi_hari_6: cjne A,#6,konversi_hari_7
mov DPTR,#jumat
call Konvert_matrix_h
ret
konversi_hari_7: cjne A,#7,konversi_hari_8
mov DPTR,#Sabtu
call Konvert_matrix_h
konversi_hari_8: ret

Minggu: db ‘Minggu’,0ffh
Senin : db ‘Senin ‘,0ffh
Selasa: db ‘Selasa’,0ffh
Rabu : db ‘Rabu ‘,0ffh
Kamis : db ‘Kamis ‘,0ffh
Jumat: db ‘Jum`at’,0ffh
Sabtu : db ‘Sabtu ‘,0ffh

Konvert_matrix_h: clr a
movc A,@A+DPTR
call konversi_m_1
call salin_ke_a
call konversi_m_2
call salin_ke_a
call konversi_m_3
call salin_ke_a
call konversi_m_4
call salin_ke_a
call konversi_m_5
call salin_ke_a
call konversi_m_6
ret
;##########################################################################
konversi_bulan: cjne A,#1h,konversi_bulan_2
mov DPTR,#Januari
call Konvert_matrix_b
ret
konversi_bulan_2: cjne A,#2h,konversi_bulan_3
mov DPTR,#Februari
call Konvert_matrix_b
ret
konversi_bulan_3: cjne A,#3h,konversi_bulan_4
mov DPTR,#Maret
call Konvert_matrix_b
ret
konversi_bulan_4: cjne A,#4h,konversi_bulan_5
mov DPTR,#April
call Konvert_matrix_b
ret
konversi_bulan_5: cjne A,#5h,konversi_bulan_6
mov DPTR,#Mei
call Konvert_matrix_b
ret
konversi_bulan_6: cjne A,#6h,konversi_bulan_7
mov DPTR,#juni
call Konvert_matrix_b
ret
konversi_bulan_7: cjne A,#7h,konversi_bulan_8
mov DPTR,#Juli
call Konvert_matrix_b
ret
konversi_bulan_8: cjne A,#8h,konversi_bulan_9
mov DPTR,#Agustus
call Konvert_matrix_b
ret
konversi_bulan_9: cjne A,#9h,konversi_bulan_10
mov DPTR,#September
call Konvert_matrix_b
ret
konversi_bulan_10: cjne A,#10h,konversi_bulan_11
mov DPTR,#Oktober
call Konvert_matrix_b
ret
konversi_bulan_11: cjne A,#11h,konversi_bulan_12
mov DPTR,#November
call Konvert_matrix_b
ret
konversi_bulan_12: cjne A,#12h,konversi_bulan_13
mov DPTR,#Desember
call Konvert_matrix_b
konversi_bulan_13:ret

Januari: db ‘Januari ‘,0ffh
Februari : db ‘Februari’,0ffh
Maret: db ‘Maret ‘,0ffh
April : db ‘April ‘,0ffh
Mei : db ‘Mei ‘,0ffh
Juni: db ‘Juni ‘,0ffh
Juli : db ‘Juli ‘,0ffh
Agustus: db ‘Agustus ‘,0ffh
September: db ‘Septembr’,0ffh
Oktober: db ‘Oktober ‘,0ffh
November: db ‘November’,0ffh
Desember: db ‘Desember’,0ffh

Konvert_matrix_b: clr a
movc A,@A+DPTR
call konversi_m_4
call salin_ke_a
call konversi_m_5
call salin_ke_a
call konversi_m_6
call salin_ke_a
call konversi_m_7
call salin_ke_a
call konversi_m_8
call salin_ke_a
call konversi_m_9
call salin_ke_a
call konversi_m_10
call salin_ke_a
call konversi_m_11
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

Jb KbdClock,$
Jnb KbdClock,$
Jb KbdClock,$
Jnb KbdClock,$
ret
Konversi_ScanCode:Mov DPTR,#TableKeyboard
movc A,@A+DPTR
mov data_keyboard,A
ret
Konversi_ScanCode_2:
Mov DPTR,#TableKeyboard2
movc A,@A+DPTR
mov data_keyboard,A
ret
;##########################################################################
; Subrutine AmbilKeyboard
;##########################################################################
looping_keyboard: mov DPTR,#pesan
call tampil_15_huruf
call display_5
mov DPTR,#data_huruf
mov alamat_eh,dph
mov alamat_el,dpl
mov ketik,#17

loop_keyboard: call display_5
call Delay_keyboard
cek_keyboard: JB KbdClock,tungggu_ketik
jmp ambilkeyboard

tungggu_ketik: djnz R5,cek_keyboard
djnz R6,cek_keyboard
djnz R7,cek_keyboard
jmp loop_keyboard

AmbilKeyboard: call ambil_scancode
tunggu_tombol_dilepas :
cjne a,#caps,cek_dilepas_1
jmp Kybd_caps_dtkn_1
cek_dilepas_1: cjne a,#0F0h,kybd_caps
JB KbdClock,$
call ambil_Scancode
call Konversi_Scancode
clr a
mov r1,data_keyboard
call tulis_ke_eeprom
call maco_eeprom
mov free_2,#1
looP_tampil2: call display_5
djnz free_2,looP_tampil2
jmp loop_keyboard
;##########################################################################
Kybd_caps: cjne a,#caps,Kybd_enter
Kybd_caps_dtkn_1: mov free_2,#100
looP_tampilc: call display_5
djnz free_2,looP_tampilc

loop_key_caps: JB KbdClock,$
call ambil_scancode
cek_key_caps: cjne a,#caps,Kybd_caps_1
Key_caps_dtkn: mov free_2,#100
looP_tampiln: call display_5
djnz free_2,looP_tampiln
JB KbdClock,$
jmp loop_keyboard

Kybd_caps_1: cjne a,#0F0h,looP_display4
JB KbdClock,$
call ambil_scancode

Kybd_caps_2: call Konversi_Scancode_2
clr a
mov r1,data_keyboard
call tulis_ke_eeprom
call maco_eeprom

looP_display4: call display_5
call Delay_keyboard
cek_keyboard2: JB KbdClock,tungggu_ketik2
call ambil_scancode
cek_keyboard3: cjne a,#caps,Kybd_caps_3
jmp Key_caps_dtkn
Kybd_caps_3: cjne a,#0F0h,cek_key_caps
JB KbdClock,$
call ambil_scancode
jmp Kybd_caps_2

tungggu_ketik2: djnz R5,cek_keyboard2
djnz R6,cek_keyboard2
djnz R7,cek_keyboard2
jmp looP_display4
;##########################################################################
Kybd_enter: cjne a,#enter,Kybd_ctrl
mov r1,#0ffh
call tulis_ke_eeprom
selesai: mov DPTR,#pesan2
call tampil_15_huruf
mov free_2,#0
tunggu_selesai: call display_5
djnz free_2,tunggu_selesai
mov flag_interupsi,#00h
jmp ProgramLoop
;##########################################################################
; Subrutine Setting Waktu
;##########################################################################
Scan_keyboard_jump:jmp loop_keyboard

Kybd_ctrl: cjne a,#ctrl,Scan_keyboard_jump
mov DPTR,#pesan3
call tampil_15_huruf
mov free_2,#0
tunggu_selesai_jam:
call display_5
djnz free_2,tunggu_selesai_jam
mov DPTR,#jam_digital
call tampil_15_huruf
call refresh_jam

Loop_jam: call refresh_jam
call Delay_keyboard
Cek_k_jam: JB KbdClock,tunggu_ketik_j
call ambil_scancode
Tambah_jam: cjne a,#tambah,kurang_jam
call up_jam
jmp loop_jam
Kurang_jam: cjne a,#kurang,cek_out_j
call down_jam
jmp loop_jam
tunggu_ketik_j: djnz R5,Cek_k_jam
djnz R6,Cek_k_jam
djnz R7,Cek_k_jam
jmp Loop_jam

cek_out_j: cjne a,#enter,Loop_jam
mov DPTR,#pesan4
call tampil_15_huruf
mov free_2,#0
tunggu_selesai_mnt:call display_5
djnz free_2,tunggu_selesai_mnt
mov DPTR,#jam_digital
call tampil_15_huruf

Loop_Mnt: call refresh_jam
call Delay_keyboard
Cek_k_Mnt: JB KbdClock,tunggu_ketik_m
call ambil_scancode
Tambah_Mnt: cjne a,#tambah,kurang_Mnt
call up_Menit
jmp loop_Mnt
Kurang_Mnt: cjne a,#kurang,cek_out_m
call down_Menit
jmp loop_Mnt
tunggu_ketik_m: djnz R5,Cek_k_Mnt
djnz R6,Cek_k_Mnt
djnz R7,Cek_k_Mnt
jmp Loop_Mnt
cek_out_m: cjne a,#enter,Loop_Mnt
call tulis_rtc_detik

mov DPTR,#pesan5
call tampil_15_huruf
mov free_2,#0
tunggu_selesai_hri:call display_5
djnz free_2,tunggu_selesai_hri
mov DPTR,#jam_digital
call tampil_15_huruf

Loop_Hri: call refresh_jam
call Delay_keyboard
Cek_k_Hri: JB KbdClock,tunggu_ketik_h
call ambil_scancode
Tambah_Hri: cjne a,#tambah,kurang_Hri
call up_hari
jmp loop_Hri
Kurang_Hri: cjne a,#kurang,cek_out_h
call down_hari
jmp loop_Hri
tunggu_ketik_h: djnz R5,Cek_k_Hri
djnz R6,Cek_k_Hri
djnz R7,Cek_k_Hri
jmp Loop_Hri
cek_out_h: cjne a,#enter,Loop_Hri

mov DPTR,#pesan6
call tampil_15_huruf
mov free_2,#0
tunggu_selesai_tgl:call display_5
djnz free_2,tunggu_selesai_tgl
mov DPTR,#kalender
call tampil_15_huruf

Loop_tgl: call refresh_kalender
call Delay_keyboard
Cek_k_tgl: JB KbdClock,tunggu_ketik_t
call ambil_scancode
Tambah_tgl: cjne a,#tambah,kurang_tgl
call up_tgl
jmp loop_tgl
Kurang_tgl: cjne a,#kurang,cek_out_t
call down_tgl
jmp loop_tgl
tunggu_ketik_t: djnz R5,Cek_k_tgl
djnz R6,Cek_k_tgl
djnz R7,Cek_k_tgl
jmp Loop_tgl
cek_out_t: cjne a,#enter,Loop_tgl

mov DPTR,#pesan7
call tampil_15_huruf
mov free_2,#0
tunggu_selesai_bln:call display_5
djnz free_2,tunggu_selesai_bln
mov DPTR,#kalender
call tampil_15_huruf

Loop_bln: call refresh_kalender
call Delay_keyboard
Cek_k_bln: JB KbdClock,tunggu_ketik_b
call ambil_scancode
Tambah_bln: cjne a,#tambah,kurang_bln
call up_bln
jmp loop_bln
Kurang_bln: cjne a,#kurang,cek_out_b
call down_bln
jmp loop_bln
tunggu_ketik_b: djnz R5,Cek_k_bln
djnz R6,Cek_k_bln
djnz R7,Cek_k_bln
jmp Loop_bln
cek_out_b: cjne a,#enter,Loop_bln

mov DPTR,#pesan8
call tampil_15_huruf
mov free_2,#0
tunggu_selesai_thn:call display_5
djnz free_2,tunggu_selesai_thn
mov DPTR,#kalender
call tampil_15_huruf

Loop_thn: call refresh_kalender
call Delay_keyboard
Cek_k_thn: JB KbdClock,tunggu_ketik_n
call ambil_scancode
Tambah_thn: cjne a,#tambah,kurang_thn
call up_thn
jmp loop_thn
Kurang_thn: cjne a,#kurang,cek_out_n
call down_thn
jmp loop_thn
tunggu_ketik_n: djnz R5,Cek_k_thn
djnz R6,Cek_k_thn
djnz R7,Cek_k_thn
jmp Loop_thn
cek_out_n: cjne a,#enter,Loop_thn

jmp selesai
;##########################################################################
Delay_keyboard: mov R5,#0
mov R6,#200
mov R7,#1
ret
;##########################################################################
; Edit RTC
;##########################################################################
up_jam: MOV A,RTCJam
CJNE A,#23h,Up_jam2
MOV A,#0
Jmp Up_jam3
Up_jam2: add a,#1
Up_jam3: da a
MOV RTCJam,A
call tulis_rtc_jam
ret

down_jam: MOV A,rtcjam
call konvert_dec
CJNE A,#0ffh,down_jam2
MOV A,#23
down_jam2: call konvert_hex
MOV RTCJam,A
call tulis_rtc_jam
ret

up_menit: MOV A,RTCmenit
CJNE A,#59h,Up_menit2
MOV A,#0
Jmp Up_menit3
Up_menit2: add a,#1
Up_menit3: da a
MOV RTCmenit,A
call tulis_rtc_menit
ret

down_menit: MOV A,rtcmenit
call konvert_dec
CJNE A,#0ffh,down_menit2
MOV A,#59
down_menit2: call konvert_hex
MOV RTCmenit,A
call tulis_rtc_menit
ret

up_tgl: MOV A,RTCtanggal
CJNE A,#31h,Up_tgl2
MOV A,#1
Jmp Up_tgl3
Up_tgl2: add a,#1
Up_tgl3: da a
MOV RTCtanggal,A
call tulis_rtc_tgl
ret

down_tgl: MOV A,rtctanggal
call konvert_dec
CJNE A,#00h,down_tgl2
MOV A,#31
down_tgl2: call konvert_hex
MOV RTCtanggal,A
call tulis_rtc_tgl
ret

up_hari: MOV A,RTChari
CJNE A,#7h,Up_hari2
MOV A,#1
Jmp Up_hari3
Up_hari2: add a,#1
Up_hari3: da a
MOV RTChari,A
call tulis_rtc_hari
ret

down_hari: MOV A,rtchari
call konvert_dec
CJNE A,#00h,down_hari2
MOV A,#7
down_hari2: call konvert_hex
MOV RTChari,A
call tulis_rtc_hari
ret

up_bln: MOV A,RTCbulan
CJNE A,#12h,Up_bln2
MOV A,#1
Jmp Up_bln3
Up_bln2: add a,#1
Up_bln3: da a
MOV RTCbulan,A
call tulis_rtc_bln
ret

down_bln: MOV A,rtcbulan
call konvert_dec
CJNE A,#00h,down_bln2
MOV A,#12
down_bln2: call konvert_hex
MOV RTCbulan,A
call tulis_rtc_bln
ret

up_thn: MOV A,RTCtahun
CJNE A,#99h,Up_thn2
MOV A,#0
Jmp Up_thn3
Up_thn2: add a,#1
Up_thn3: da a
MOV RTCtahun,A
call tulis_rtc_thn
ret

down_thn: MOV A,rtctahun
call konvert_dec
CJNE A,#0ffh,down_thn2
MOV A,#99
down_thn2: call konvert_hex
MOV RTCtahun,A
call tulis_rtc_thn
ret
;##########################################################################
konvert_dec: mov DPTR,#tabel_dec
movc A,@A+DPTR
dec a
ret
konvert_hex: mov DPTR,#tabel_hex
movc A,@A+DPTR
ret

;##########################################################################
tulis_ke_eeprom: mov dph,alamat_eh
mov dpl,alamat_el
mov r3,dph
mov r4,dpl
mov dptr_high,dph
mov DPTR_low,dpl
call Tulis_eeprom
inc dptr
mov alamat_eh,dph
mov alamat_el,dpl
ret

maco_eeprom: djnz ketik,maco_eeprom_2
mov dph,DPTR_high
mov dpl,DPTR_low
call baca_eeprom
mov ketik,#1
call geser_kiri
call geser_kiri
call geser_kiri
call geser_kiri
call geser_kiri
call geser_kiri
call maco_eeprom_3
ret

maco_eeprom_2: mov DPTR,#data_huruf
call baca_eeprom
mov A,tmp
call konversi_m_1
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_2
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_3
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_4
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_5
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_6
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_7
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_8
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_9
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_10
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_11
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_12
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_13
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_14
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_15
inc dptr
call baca_eeprom
maco_eeprom_3: mov A,tmp
call konversi_m_16
inc dptr
call baca_eeprom
ret

maco_eeprom_4: mov A,tmp
call konversi_m_17
inc dptr
call baca_eeprom
mov A,tmp
call konversi_m_18
inc dptr
call baca_eeprom
ret
;##########################################################################
; KONVERSI 1 ASCII KE DATA DOT MATRIK
;##########################################################################
Konversi_m_1: mov R0,#Data_matrix_1
call scan_huruf
ret
Konversi_m_2: mov R0,#Data_matrix_2
call scan_huruf
ret
Konversi_m_3: mov R0,#Data_matrix_3
call scan_huruf
ret
Konversi_m_4: mov R0,#Data_matrix_4
call scan_huruf
ret
Konversi_m_5: mov R0,#Data_matrix_5
call scan_huruf
ret
Konversi_m_6: mov R0,#Data_matrix_6
call scan_huruf
ret
Konversi_m_7: mov R0,#Data_matrix_7
call scan_huruf
ret
Konversi_m_8: mov R0,#Data_matrix_8
call scan_huruf
ret
Konversi_m_9: mov R0,#Data_matrix_9
call scan_huruf
ret
Konversi_m_10: mov R0,#Data_matrix_10
call scan_huruf
ret
Konversi_m_11: mov R0,#Data_matrix_11
call scan_huruf
ret
Konversi_m_12: mov R0,#Data_matrix_12
call scan_huruf
ret
Konversi_m_13: mov R0,#Data_matrix_13
call scan_huruf
ret
Konversi_m_14: mov R0,#Data_matrix_14
call scan_huruf
ret
Konversi_m_15: mov R0,#Data_matrix_15
call scan_huruf
ret
Konversi_m_16: mov R0,#Data_matrix_16
call scan_huruf
ret
Konversi_m_17: mov R0,#Data_matrix_17
call scan_huruf
ret
Konversi_m_18: mov R0,#Data_matrix_18
call scan_huruf
ret
Konversi_m_19: mov R0,#Data_matrix_19
call scan_huruf
ret
Konversi_m_20: mov R0,#Data_matrix_20
call scan_huruf
ret
Konversi_m_21: mov R0,#Data_matrix_21
call scan_huruf
ret
;##########################################################################
tampil_15_huruf: clr a
movc A,@A+DPTR
call konversi_m_1
call salin_ke_a
call konversi_m_2
call salin_ke_a
call konversi_m_3
call salin_ke_a
call konversi_m_4
call salin_ke_a
call konversi_m_5
call salin_ke_a
call konversi_m_6
call salin_ke_a
call konversi_m_7
call salin_ke_a
call konversi_m_8
call salin_ke_a
call konversi_m_9
call salin_ke_a
call konversi_m_10
call salin_ke_a
call konversi_m_11
call salin_ke_a
call konversi_m_12
call salin_ke_a
call konversi_m_13
call salin_ke_a
call konversi_m_14
call salin_ke_a
call konversi_m_15
call salin_ke_a
call konversi_m_16
call salin_ke_a
call konversi_m_17
call salin_ke_a
call konversi_m_18
call salin_ke_a
call konversi_m_19
call salin_ke_a
call konversi_m_20
call salin_ke_a
call konversi_m_21
ret
;##########################################################################
salin_ke_a: inc dptr
clr a
movc A,@A+DPTR
ret
;##########################################################################
; Geser ke kiri
;##########################################################################
Geser_kiri: mov R7,#128
mov R1,#data_matrix_1
mov R0,#data_matrix_1+1
Geser_kirii: mov a,@r0
mov @R1,a
inc r0
inc r1
djnz R7,Geser_kirii
ret
;##########################################################################
Geser_ram: mov a,@r0
mov @r1,a
ret
;##########################################################################
; Rolling
;##########################################################################
Rolling_text: call rolling
call rolling
call rolling
call rolling
call rolling
call rolling
call rolling
call rolling
ret

Rolling: mov r0,#data_matrix_1
mov free_1,#128
Rolling_2: mov a,@r0
rl a
mov @r0,a
inc r0
djnz free_1,rolling_2
mov free_2,#25
rolling_3: call display_5
djnz free_2,rolling_3
ret
;##########################################################################
; Tampilan Dotmatrix
;##########################################################################
Display_5: mov R1,#data_matrix_1
mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_4: call Rutin_4
mov A,tmp
rr a
djnz R3,tunggu_4

Display_3: mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_3: call Rutin_3
mov A,tmp
rr a
djnz R3,tunggu_3

Display_2: mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_2: call Rutin_2
mov A,tmp
rr a
djnz R3,tunggu_2

Display_1: mov R3,#8
MOV A,#10000000b
tunggu_1: call Rutin_1
mov A,tmp
rr a
djnz R3,tunggu_1

kirim_1: clr enable_1
jb enable_2,$
setb enable_1
setb enable_2
mov R7,#32
mov R1,#data_slave_1
jmp copy_data_1
copy_data_1: mov p0,@r1
inc r1
djnz R7,copy_data_1

kirim_2: clr enable_3
jb enable_4,$
setb enable_3
setb enable_4
mov R7,#32
mov R1,#data_slave_2
jmp copy_data_2
copy_data_2: mov p0,@r1
inc r1
djnz R7,copy_data_2
ret
;##########################################################################
Rutin_1: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
ret
Rutin_2: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
ret
Rutin_3: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
ret
Rutin_4: mov tmp,a
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
ret
;##########################################################################
Display_Ascii_2: mov A,@r1
rl a
cpl a
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2
call Tunda1Detik
inc r1
mov A,#00h
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2
Ret
;##########################################################################
Hapus_tampilan: CLR CD4094_CP_1
Clr CD4094_Str_1
Call ClrDispLED_1
mov r3,#4
ulangi_1: MOV A,#00h
Call CD4094_Shift_1
djnz r3,ulangi_1
SetB CD4094_Str_1
Clr CD4094_Str_1
Ret

ClrDispLED_1: MOV A,#0FFh
CD4094_Shift_1: MOV R4,#8
CD4094_ShLoop_1: RLC A
MOV CD4094_D_1,C
SetB CD4094_CP_1
CLR CD4094_CP_1
DJNZ R4,CD4094_ShLoop_1
Ret

ClrDispLED_2: MOV A,#0FFh
CD4094_Shift_2: MOV R4,#8
CD4094_ShLoop_2: RLC A
MOV CD4094_D_2,C
SetB CD4094_CP_2
CLR CD4094_CP_2
DJNZ R4,CD4094_ShLoop_2
Ret
;##########################################################################
; Delay
;##########################################################################
Tunda1Detik: MOV R7,#5
Tunda1DetikL2: MOV R6,#5
Tunda1DetikL1: MOV R5,#5
DJNZ R5,$
DJNZ R6,Tunda1DetikL1
DJNZ R7,Tunda1DetikL2
Ret

;##########################################################################
; Data Pesan
;##########################################################################
Pesan: db ‘ Masukkan Teks ‘,0ffh
Pesan2: db ‘ Selesai Edit ‘,0ffh
Pesan3: db ‘ Setting Jam ‘,0ffh
Pesan4: db ‘ Setting Menit ‘,0ffh
Pesan5: db ‘ Setting Hari ‘,0ffh
Pesan6: db ‘ Setting Tanggal’,0ffh
Pesan7: db ‘ Setting Bulan ‘,0ffh
Pesan8: db ‘ Setting Tahun ‘,0ffh

Jam_digital: db ‘ , : : ‘,0ffh
Kalender: db ‘ 20 ‘,0ffh
;==============================================================;
; pengendali Bus IIC disusun oleh
; Dhanny Dhuzell 2008 Bandar Lampung
; Single Master Sudah diuji-coba dan sangat baik
; Bandwidth sekitar 80 kHz (Mode-Normal-Speed)
; Modul ini butuh “ErrorsEqu.inc”
;==============================================================;
Err_DL_WrongCommand EQU 1
Err_DL_BadConvert EQU 2
Err_DL_OutOfMemory EQU 3
Err_DL_InvalidCheckSum EQU 4
Err_DL_InvalidCmdFormat EQU 5
Err_DL_WriteFail EQU 6
Err_DL_VerifyGotError EQU 7

Err_IIC_BusFailToStart EQU 11
Err_IIC_InvalidSlaAddr EQU 12
Err_IIC_InvalidAddress EQU 13
Err_IIC_PrematureNOACK EQU 14

Delay_3MC:
NOP
NOP
NOP
ret

Delay_4Mc:
NOP
NOP
NOP
NOP
ret

Release_SCL_High:
SETB I2C_SCL
JNB I2C_SCL,$
ret

;==============================================================;
I2C_Start: SetB I2C_SDA
SetB I2C_SCL
JNB I2C_SDA, I2C_BusBusy
JNB I2C_SCL, I2C_BusBusy
Clr I2C_SDA
Push ACC
POP ACC
Clr I2C_SCL
Push ACC
POP ACC
Clr C
Ret
I2C_BusBusy: SetB C
Ret

;==============================================================;
I2C_Stop: Clr I2C_SDA
call Release_SCL_High
call Delay_3MC
SetB I2C_SDA
Ret

;==============================================================;
I2C_SendByte: PUSH B
MOV B,#8

I2C_SendByteL: RLC A ;1MC |
MOV I2C_SDA,C ;2MC |
call Release_SCL_High
call Delay_3MC
Clr I2C_SCL ;1MC +-+
DJNZ B,I2C_SendByteL ;2MC |

call Release_SCL_High
call Delay_4Mc
MOV C,I2C_SDA ;1MC | read ACK/NOACK
Clr I2C_SCL ;1MC +-+
call Delay_3MC
POP B ;2MC |
RET

; Low = 6MC High = 5MC

;==============================================================;
I2C_GetByte: PUSH B
PUSH PSW ;Save CY
MOV B,#8
SetB I2C_SDA ;1MC |

I2C_GetByteL: call Release_SCL_High
call Delay_3Mc
MOV C,I2C_SDA ;1MC |
RLC A ;1MC |
Clr I2C_SCL ;1MC +-+
call Delay_3MC
DJNZ B,I2C_GetByteL ;2MC |

POP PSW ;1MC | Load CY
MOV I2C_SDA,C ;2MC |
call Release_SCL_High
call Delay_3MC
Clr I2C_SCL ;1MC +-+
SetB I2C_SDA ;1MC |
NOP
NOP
POP B ;1MC | Load CY
RET

; Low = 6MC High = 5MC
;==============================================================;

;==============================================================;
I2C_WriteByte: Call I2C_Start
JC l_ERROR1
Clr ACC.0
Call I2C_SendByte ;Send SlaveAddress
JC l_ERROR2
MOV A,B
Call I2C_SendByte ;Send Word Address
JC l_ERROR3
MOV A,R1
Call I2C_SendByte ;Send Data Byte
JC l_ERROR4
Call I2C_Stop
Clr C
Call I2C_WriteDelay
Clr A
MOV B,A ;max 5mS
I2C_WriteByteL: DJNZ ACC,I2C_WriteByteL
DJNZ B,I2C_WriteByteL
Ret
; ACC = SlaveAddress, B = WordAddress, R1 = Data byte

;==============================================================;
I2C_ReadByte: Call I2C_Start
JC l_ERROR1
MOV DPL,A ;Save SlaveAddress
Clr ACC.0
Call I2C_SendByte ;Send SlaveAddress
JC l_ERROR2
MOV A,B
Call I2C_SendByte ;Send Word Address
JC l_ERROR3

Call I2C_Start
JC l_ERROR1
MOV A,DPL ;Load SlaveAddress again
SetB ACC.0
Call I2C_SendByte ;Send SlaveAddress
JC l_ERROR2

SetB C ;Set to NOACK
Call I2C_GetByte ;Get Data Byte
Call I2C_Stop
Clr C
Ret

; ACC = SlaveAddress, B = WordAddress

;==============================================================;
I2C_WriteData: Call I2C_Start
JC l_ERROR1
Clr ACC.0
Call I2C_SendByte ;Send SlaveAddress
JC l_ERROR2
MOV A,B
Call I2C_SendByte ;Send Word Address
JC l_ERROR3
I2C_WriteDataL: MOV A,@R1
call I2C_SendByte ;Send Data Byte
INC R1
JC l_ERROR4
DJNZ R2,I2C_WriteDataL
I2C_WriteDataE: Call I2C_Stop
Clr C
Call I2C_WriteDelay
I2C_WriteDelay: Clr A
MOV B,A ;max 5mS (( 2 *256 ) * 256 )
I2C_WriteDataF: DJNZ ACC,I2C_WriteDataF
DJNZ B,I2C_WriteDataF
Ret

; ACC = SlaveAddress, B = WordAddress, R1 = DataMemoryOffset, R2 = Counter,

;==============================================================;
l_ERROR1: MOV A,#Err_IIC_BusFailToStart
Call I2C_Stop
Ret
l_ERROR2: MOV A,#Err_IIC_InvalidSlaAddr
Call I2C_Stop
Ret
l_ERROR3: MOV A,#Err_IIC_InvalidAddress
Call I2C_Stop
Ret
l_ERROR4: MOV A,#Err_IIC_PrematureNOACK
Call I2C_Stop
Ret

;==============================================================;
I2C_ReadData: Call I2C_Start
JC l_ERROR1
MOV DPL,A ;Save SlaveAddress
Clr ACC.0
Call I2C_SendByte ;Send SlaveAddress
JC l_ERROR2
MOV A,B
Call I2C_SendByte ;Send Word Address
JC l_ERROR3

Call I2C_Start
JC l_ERROR1
MOV A,DPL ;Load SlaveAddress again
SetB ACC.0
Call I2C_SendByte ;Send SlaveAddress
JC l_ERROR2

DEC R2
I2C_ReadDataL: Clr C ;Set to ACK
Call I2C_GetByte ;Get Data Byte
MOV @R1,A
INC R1
DJNZ R2,I2C_ReadDataL
SetB C ;Set to NOACK
Call I2C_GetByte ;Get Data Byte
MOV @R1,A
Call I2C_Stop
Clr C
Ret

; ACC = SlaveAddress, B = WordAddress, R1 = DataMemoryOffset, R2 = Counter
;##########################################################################
; Tulis / baca rtc
;##########################################################################
Tulis_rtc_hari: MOV A,#11010000b
mov B,#03h ;Alamat
mov R1,rtchari ;datanya
Call I2C_WriteByte
JC Error_hari_rtc
ret
Error_hari_rtc: jmp Tulis_rtc_hari

Tulis_rtc_jam: MOV A,#11010000b
mov B,#02h ;Alamat
mov R1,rtcjam ;datanya
Call I2C_WriteByte
JC Error_Jam_rtc
ret
Error_Jam_rtc: jmp Tulis_rtc_jam

Tulis_rtc_menit: MOV A,#11010000b
mov B,#01h
mov R1,rtcmenit
Call I2C_WriteByte
JC Error_menit_rtc
ret
Error_menit_rtc: jmp Tulis_rtc_menit

Tulis_rtc_Detik: MOV A,#11010000b
mov B,#00h
mov R1,#00h
Call I2C_WriteByte
JC Error_Detik_rtc
ret
Error_Detik_rtc: jmp Tulis_rtc_Detik

Tulis_rtc_tgl: MOV A,#11010000b
mov B,#04h
mov R1,rtctanggal
Call I2C_WriteByte
JC Error_tgl_rtc
ret
Error_tgl_rtc: jmp Tulis_rtc_tgl

Tulis_rtc_bln: MOV A,#11010000b
mov B,#05h
mov R1,rtcbulan
Call I2C_WriteByte
JC Error_bln_rtc
ret
Error_bln_rtc: jmp Tulis_rtc_bln

Tulis_rtc_thn: MOV A,#11010000b
mov B,#06h
mov R1,rtctahun
Call I2C_WriteByte
JC Error_thn_rtc
ret
Error_thn_rtc: jmp Tulis_rtc_thn

;##########################################################################
; Ambil data RTC simpan ke RAM mikro
;##########################################################################
StreamRTC: MOV A,rtcjam
SWAP A
ANL A,#00Fh
Call GetLEDNum
mov leddigit1,a

MOV A,rtcjam
ANL A,#00Fh
Call GetLEDNum
mov leddigit2,a

MOV A,rtcmenit
SWAP A
ANL A,#00Fh
Call GetLEDNum
mov leddigit3,a
MOV A,rtcmenit
ANL A,#00Fh
Call GetLEDNum
mov leddigit4,a

MOV A,rtcdetik
SWAP A
ANL A,#00Fh
Call GetLEDNum
mov leddigit5,a
MOV A,rtcdetik
ANL A,#00Fh
Call GetLEDNum
mov leddigit6,a
Ret

Streamkalender: mOV A,rtctanggal
SWAP A
ANL A,#00Fh
Call GetLEDNum
mov leddigit7,a

MOV A,rtctanggal
ANL A,#00Fh
Call GetLEDNum
mov leddigit8,a

MOV A,rtctahun
SWAP A
ANL A,#00Fh
Call GetLEDNum
mov leddigit9,a
MOV A,rtctahun
ANL A,#00Fh
Call GetLEDNum
mov leddigit10,a
ret
;##########################################################################
; Konversi ke tampilan 7 segment
;##########################################################################
GetLEDNum: Inc A
MOVC A,@A+PC
Ret

CharLED1: DB ‘0’ ;0
DB ‘1’ ;1
DB ‘2’ ;2
DB ‘3’ ;3
DB ‘4’ ;4
DB ‘5’ ;5
DB ‘6’ ;6
DB ‘7’ ;7
DB ‘8’ ;8
DB ‘9’ ;9
DB ‘A’ ;A
DB ‘B’ ;B
DB ‘C’ ;C
DB ‘D’ ;D
DB ‘E’ ;E
DB ‘F’ ;F

ReadAllRTC: MOV A,#11010001b ;SlaveAddress
MOV B,#0
MOV R1,#RTCDetik
MOV R2,#9
Call I2C_ReadData ; ACC = SlaveAddress, B = WordAddress, R1 = DataMemoryOffset, R2 = Counter
ret
;##########################################################################
; The next four routines are used with the the 24xx32 or 24xx65 only.
; These parts require two address bytes, and these routines send the
; second byte out. Other than this, these routines are the same as the
; previous four.
;##########################################################################
; THIS ROUTINE READS A BYTE OF DATA FROM EEPROM
; From EEPROM current address pointer.
; Returns the data byte in R1
;##########################################################################
CREAD: MOV A,#RDCMD ;LOAD READ COMMAND
CALL OUTS ;SEND IT
CALL IN ;READ DATA
MOV tmp,A ;STORE DATA
CALL STOP ;SEND STOP CONDITION
RET

;##########################################################################
; This routine writes a byte of data to EEPROM
; This routine is for the 24LC32 or 24LC65
; The EEPROM address is assumed to be in R3:R4
; The DATA to be written is assumed to be in R1
;##########################################################################
Tulis_eeprom: MOV A,#WTCMD ;LOAD WRITE COMMAND
CALL OUTS ;SEND IT
MOV A,R3 ;GET HI BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,R4 ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,R1 ;GET DATA
CALL OUT ;SEND IT
CALL STOP ;SEND STOP CONDITION
RET

;##########################################################################
; THIS ROUTINE READS A BYTE OF DATA FROM THE EEPROM
; This routine is for the 24CL32 or 24LC65
; The EEPROM address is in R3:R4
; Returns the data byte in R1
;##########################################################################
Baca_eeprom: call baca_eeprom_2
call baca_eeprom_2
call baca_eeprom_2
call baca_eeprom_2
call baca_eeprom_2
call baca_eeprom_2
call baca_eeprom_2
ret

baca_eeprom_2: mov r3,dph
mov r4,dpl
MOV A,#WTCMD ;LOAD WRITE COMMAND TO SEND ADDRESS
CALL OUTS ;SEND IT
MOV A,R3 ;GET HI BYTE ADDRESS
CALL OUT ;SEND IT
MOV A,R4 ;GET LOW BYTE ADDRESS
CALL OUT ;SEND IT
CALL CREAD ;GET DATA BYTE
RET

;##########################################################################
; THIS ROUTINE SENDS OUT CONTENTS OF THE ACCUMULATOR
; to the EEPROM and includes START condition. Refer to the data sheets
; for discussion of START and STOP conditions.
;##########################################################################
OUTS: MOV R2,#8 ;LOOP COUNT — EQUAL TO BIT COUNT
SETB I2C_SDA ;INSURE DATA IS HI
SETB I2C_SCL ;INSURE CLOCK IS HI
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
CLR I2C_SDA ;START CONDITION — DATA = 0
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
CLR I2C_SCL ;CLOCK = 0
OTSLP: RLC A ;SHIFT BIT
JNC BITLS
SETB I2C_SDA ;DATA = 1
JMP OTSL1 ;CONTINUE
BITLS: CLR I2C_SDA ;DATA = 0
OTSL1: SETB I2C_SCL ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
CLR I2C_SCL ;CLOCK LOW
DJNZ R2,OTSLP ;DECREMENT COUNTER
SETB I2C_SDA ;TURN PIN INTO INPUT
NOP ;NOTE 1
NOP ;NOTE 2
NOP
SETB I2C_SCL ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
CLR I2C_SCL
RET
;##########################################################################
; THIS ROUTINE SENDS OUT CONTENTS OF ACCUMLATOR TO EEPROM
; without sending a START condition.
;##########################################################################
OUT: MOV R2,#8 ;LOOP COUNT — EQUAL TO BIT COUNT
OTLP: RLC A ;SHIFT BIT
JNC BITL
SETB I2C_SDA ;DATA = 1
JMP OTL1 ;CONTINUE
BITL: CLR I2C_SDA ;DATA = 0
OTL1: SETB I2C_SCL ;CLOCK HI
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
CLR I2C_SCL ;CLOCK LOW
DJNZ R2,OTLP ;DECREMENT COUNTER
SETB I2C_SDA ;TURN PIN INTO INPUT
NOP ;NOTE 1
NOP ;NOTE 2
NOP
SETB I2C_SCL ;CLOCK ACK
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
CLR I2C_SCL
RET
;##########################################################################
; THIS ROUTINE READS IN A BYTE FROM THE EEPROM
; and stores it in the accumulator
;##########################################################################
IN: MOV R2,#8 ;LOOP COUNT
SETB I2C_SDA ;SET DATA BIT HIGH FOR INPUT
INLP: CLR I2C_SCL ;CLOCK LOW
NOP ;NOTE 1
NOP
NOP
NOP
NOP ;NOTE 2
NOP
SETB I2C_SCL ;CLOCK HIGH
CLR C ;CLEAR CARRY
JNB I2C_SDA,INL1 ;JUMP IF DATA = 0
CPL C ;SET CARRY IF DATA = 1
INL1: RLC A ;ROTATE DATA INTO ACCUMULATOR
DJNZ R2,INLP ;DECREMENT COUNTER
CLR I2C_SCL ;CLOCK LOW
RET
STOP: CLR I2C_SDA ;STOP CONDITION SET DATA LOW
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
SETB I2C_SCL ;SET CLOCK HI
NOP ;NOTE 1
NOP
NOP
NOP ;NOTE 2
NOP
SETB I2C_SDA ;SET DATA HIGH
RET

;##########################################################################
; Konversi Ascii ke Dot Matrix
; Dibuat oleh Sindhu Harimukti
; Jumat 03 agustus 2012
;##########################################################################
Scan_Huruf:
H_SPASI: cjne a,#’ ‘,T_1
call dorong_DPTR
mov DPTR,#data_spasi
jmp Ambil_data_matrix
T_1: cjne a,#’!’,T_2
call dorong_DPTR
mov DPTR,#data_T_1
jmp Ambil_data_matrix
T_2: cjne a,#'”‘,T3
call dorong_DPTR
mov DPTR,#data_T_2
jmp Ambil_data_matrix
T3: cjne a,#’#’,T4
call dorong_DPTR
mov DPTR,#data_T3
jmp Ambil_data_matrix
T4: cjne a,#’$’,T5
call dorong_DPTR
mov DPTR,#data_T4
jmp Ambil_data_matrix
T5: cjne a,#’ ‘,T6
call dorong_DPTR
mov DPTR,#data_T5
jmp Ambil_data_matrix
T6: cjne a,#’&’,T7
call dorong_DPTR
mov DPTR,#data_T6
jmp Ambil_data_matrix
T7: cjne a,#’ ‘,T8
call dorong_DPTR
mov DPTR,#data_T7
jmp Ambil_data_matrix
T8: cjne a,#'(‘,T9
call dorong_DPTR
mov DPTR,#data_T8
jmp Ambil_data_matrix
T9: cjne a,#’)’,T10
call dorong_DPTR
mov DPTR,#data_T9
jmp Ambil_data_matrix
T10: cjne a,#’*’,T11
call dorong_DPTR
mov DPTR,#data_T10
jmp Ambil_data_matrix
T11: cjne a,#’+’,T12
call dorong_DPTR
mov DPTR,#data_T11
jmp Ambil_data_matrix
T12: cjne a,#’,’,T13
call dorong_DPTR
mov DPTR,#data_T12
jmp Ambil_data_matrix
T13: cjne a,#’-‘,T14
call dorong_DPTR
mov DPTR,#data_T13
jmp Ambil_data_matrix
T14: cjne a,#’.’,T15
call dorong_DPTR
mov DPTR,#data_T14
jmp Ambil_data_matrix
T15: cjne a,#’/’,A0
call dorong_DPTR
mov DPTR,#data_T15
jmp Ambil_data_matrix
A0: cjne a,#’0′,A1
call dorong_DPTR
mov DPTR,#data_A0
jmp Ambil_data_matrix
A1: cjne a,#’1′,A2
call dorong_DPTR
mov DPTR,#data_A1
jmp Ambil_data_matrix
A2: cjne a,#’2′,A3
call dorong_DPTR
mov DPTR,#data_A2
jmp Ambil_data_matrix
A3: cjne a,#’3′,A4
call dorong_DPTR
mov DPTR,#data_A3
jmp Ambil_data_matrix
A4: cjne a,#’4′,A5
call dorong_DPTR
mov DPTR,#data_A4
jmp Ambil_data_matrix
A5: cjne a,#’5′,A6
call dorong_DPTR
mov DPTR,#data_A5
jmp Ambil_data_matrix
A6: cjne a,#’6′,A7
call dorong_DPTR
mov DPTR,#data_A6
jmp Ambil_data_matrix
A7: cjne a,#’7′,A8
call dorong_DPTR
mov DPTR,#data_A7
jmp Ambil_data_matrix
A8: cjne a,#’8′,A9
call dorong_DPTR
mov DPTR,#data_A8
jmp Ambil_data_matrix
A9: cjne a,#’9′,A10
call dorong_DPTR
mov DPTR,#data_A9
jmp Ambil_data_matrix
A10: cjne a,#':’,A11
call dorong_DPTR
mov DPTR,#data_A10
jmp Ambil_data_matrix
A11: cjne a,#';’,A12
call dorong_DPTR
mov DPTR,#data_A11
jmp Ambil_data_matrix
A12: cjne a,#”,A15
call dorong_DPTR
mov DPTR,#data_A14
jmp Ambil_data_matrix
A15: cjne a,#’?’,A16
call dorong_DPTR
mov DPTR,#data_A15
jmp Ambil_data_matrix
A16: cjne a,#’@’,H_AK
call dorong_DPTR
mov DPTR,#data_A16
jmp Ambil_data_matrix
H_AK: cjne a,#’A’,H_BK
call dorong_DPTR
mov DPTR,#data_H_AK
jmp Ambil_data_matrix
H_BK: cjne a,#’B’,H_CK
call dorong_DPTR
mov DPTR,#data_H_BK
jmp Ambil_data_matrix
H_CK: cjne a,#’C’,H_DK
call dorong_DPTR
mov DPTR,#data_H_CK
jmp Ambil_data_matrix
H_DK: cjne a,#’D’,H_EK
call dorong_DPTR
mov DPTR,#data_H_DK
jmp Ambil_data_matrix
H_EK: cjne a,#’E’,H_FK
call dorong_DPTR
mov DPTR,#data_H_EK
jmp Ambil_data_matrix
H_FK: cjne a,#’F’,H_GK
call dorong_DPTR
mov DPTR,#data_H_FK
jmp Ambil_data_matrix
H_GK: cjne a,#’G’,H_HK
call dorong_DPTR
mov DPTR,#data_H_GK
jmp Ambil_data_matrix
H_HK: cjne a,#’H’,H_IK
call dorong_DPTR
mov DPTR,#data_H_HK
jmp Ambil_data_matrix
H_IK: cjne a,#’I’,H_JK
call dorong_DPTR
mov DPTR,#data_H_IK
jmp Ambil_data_matrix
H_JK: cjne a,#’J’,H_KK
call dorong_DPTR
mov DPTR,#data_H_JK
jmp Ambil_data_matrix
H_KK: cjne a,#’K’,H_LK
call dorong_DPTR
mov DPTR,#data_H_KK
jmp Ambil_data_matrix
H_LK: cjne a,#’L’,H_MK
call dorong_DPTR
mov DPTR,#data_H_LK
jmp Ambil_data_matrix
H_MK: cjne a,#’M’,H_NK
call dorong_DPTR
mov DPTR,#data_H_MK
jmp Ambil_data_matrix
H_NK: cjne a,#’N’,H_OK
call dorong_DPTR
mov DPTR,#data_H_NK
jmp Ambil_data_matrix
H_OK: cjne a,#’O’,H_PK
call dorong_DPTR
mov DPTR,#data_H_OK
jmp Ambil_data_matrix
H_PK: cjne a,#’P’,H_QK
call dorong_DPTR
mov DPTR,#data_H_PK
jmp Ambil_data_matrix
H_QK: cjne a,#’Q’,H_RK
call dorong_DPTR
mov DPTR,#data_H_QK
jmp Ambil_data_matrix
H_RK: cjne a,#’R’,H_SK
call dorong_DPTR
mov DPTR,#data_H_RK
jmp Ambil_data_matrix
H_SK: cjne a,#’S’,H_TK
call dorong_DPTR
mov DPTR,#data_H_SK
jmp Ambil_data_matrix
H_TK: cjne a,#’T’,H_UK
call dorong_DPTR
mov DPTR,#data_H_TK
jmp Ambil_data_matrix
H_UK: cjne a,#’U’,H_VK
call dorong_DPTR
mov DPTR,#data_H_UK
jmp Ambil_data_matrix
H_VK: cjne a,#’V’,H_WK
call dorong_DPTR
mov DPTR,#data_H_VK
jmp Ambil_data_matrix
H_WK: cjne a,#’W’,H_XK
call dorong_DPTR
mov DPTR,#data_H_WK
jmp Ambil_data_matrix
H_XK: cjne a,#’X’,H_YK
call dorong_DPTR
mov DPTR,#data_H_XK
jmp Ambil_data_matrix
H_YK: cjne a,#’Y’,H_ZK
call dorong_DPTR
mov DPTR,#data_H_YK
jmp Ambil_data_matrix
H_ZK: cjne a,#’Z’,H_K1
call dorong_DPTR
mov DPTR,#data_H_ZK
jmp Ambil_data_matrix
H_K1: cjne a,#’[',H_K2
call dorong_DPTR
mov DPTR,#data_H_K1
jmp Ambil_data_matrix
H_K2: cjne a,#'Y',H_K3
call dorong_DPTR
mov DPTR,#data_H_K2
jmp Ambil_data_matrix
H_K3: cjne a,#']‘,H_K4
call dorong_DPTR
mov DPTR,#data_H_K3
jmp Ambil_data_matrix
H_K4: cjne a,#’^’,H_K5
call dorong_DPTR
mov DPTR,#data_H_K4
jmp Ambil_data_matrix
H_K5: cjne a,#’_’,H_K6
call dorong_DPTR
mov DPTR,#data_H_K5
jmp Ambil_data_matrix
H_K6: cjne a,#’`’,Ha
call dorong_DPTR
mov DPTR,#data_H_K6
jmp Ambil_data_matrix
Ha: cjne a,#’a’,Hb
call dorong_DPTR
mov DPTR,#data_Ha
jmp Ambil_data_matrix
Hb: cjne a,#’b’,Hc
call dorong_DPTR
mov DPTR,#data_Hb
jmp Ambil_data_matrix
Hc: cjne a,#’c’,Hd
call dorong_DPTR
mov DPTR,#data_Hc
jmp Ambil_data_matrix
Hd: cjne a,#’d’,He
call dorong_DPTR
mov DPTR,#data_Hd
jmp Ambil_data_matrix
He: cjne a,#’e’,Hf
call dorong_DPTR
mov DPTR,#data_He
jmp Ambil_data_matrix
Hf: cjne a,#’f’,Hg
call dorong_DPTR
mov DPTR,#data_Hf
jmp Ambil_data_matrix
Hg: cjne a,#’g’,Hh
call dorong_DPTR
mov DPTR,#data_Hg
jmp Ambil_data_matrix
Hh: cjne a,#’h’,Hi
call dorong_DPTR
mov DPTR,#data_Hh
jmp Ambil_data_matrix
Hi: cjne a,#’i’,Hj
call dorong_DPTR
mov DPTR,#data_Hi
jmp Ambil_data_matrix
Hj: cjne a,#’j’,Hk
call dorong_DPTR
mov DPTR,#data_Hj
jmp Ambil_data_matrix
Hk: cjne a,#’k’,Hl
call dorong_DPTR
mov DPTR,#data_Hk
jmp Ambil_data_matrix
Hl: cjne a,#’l’,Hm
call dorong_DPTR
mov DPTR,#data_Hl
jmp Ambil_data_matrix
Hm: cjne a,#’m’,Hn
call dorong_DPTR
mov DPTR,#data_Hm
jmp Ambil_data_matrix
Hn: cjne a,#’n’,Ho
call dorong_DPTR
mov DPTR,#data_Hn
jmp Ambil_data_matrix
Ho: cjne a,#’o’,Hp
call dorong_DPTR
mov DPTR,#data_Ho
jmp Ambil_data_matrix
Hp: cjne a,#’p’,Hq
call dorong_DPTR
mov DPTR,#data_Hp
jmp Ambil_data_matrix
Hq: cjne a,#’q’,Hr
call dorong_DPTR
mov DPTR,#data_Hq
jmp Ambil_data_matrix
Hr: cjne a,#’r’,Hs
call dorong_DPTR
mov DPTR,#data_Hr
jmp Ambil_data_matrix
Hs: cjne a,#’s’,Ht
call dorong_DPTR
mov DPTR,#data_Hs
jmp Ambil_data_matrix
Ht: cjne a,#’t’,Hu
call dorong_DPTR
mov DPTR,#data_Ht
jmp Ambil_data_matrix
Hu: cjne a,#’u’,Hv
call dorong_DPTR
mov DPTR,#data_Hu
jmp Ambil_data_matrix
Hv: cjne a,#’v’,Hw
call dorong_DPTR
mov DPTR,#data_Hv
jmp Ambil_data_matrix
Hw: cjne a,#’w’,Hx
call dorong_DPTR
mov DPTR,#data_Hw
jmp Ambil_data_matrix
Hx: cjne a,#’x’,Hy
call dorong_DPTR
mov DPTR,#data_Hx
jmp Ambil_data_matrix
Hy: cjne a,#’y’,Hz
call dorong_DPTR
mov DPTR,#data_Hy
jmp Ambil_data_matrix
Hz: cjne a,#’z’,KELUAR
call dorong_DPTR
mov DPTR,#data_Hz
jmp Ambil_data_matrix
Rampung_scan: inc r0
mov @r0,#0ffh
ret
keluar: call dorong_DPTR
mov DPTR,#data_00
jmp Ambil_data_matrix
ret
;##########################################################################
dorong_DPTR: mov R7,#5
mov DPTR_high,dph
mov DPTR_low,dpl
ret
Ambil_data_matrix:clr a
movc A,@A+DPTR
mov @r0,a
inc r0
inc dptr
djnz R7,Ambil_data_matrix
mov dph,DPTR_high
mov dpl,DPTR_low
mov @r0,#0ffh
jmp Rampung_scan
;##########################################################################
; Data Font Matrix 5×7
; Dibuat oleh Sindhu Harimukti
; Jumat 03 agustus 2012
;##########################################################################
data_spasi: db 0ffh,0ffh,0ffH,0ffh,0ffh
data_T_1: db 0ffH,0ffh,0B0H,0ffh,0ffh
data_T_2: db 0ffH,0F8H,0ffh,0F8H,0ffh
data_T3: db 0EBH,080H,0EBH,080H,0EBH
data_T4: db 0DBH,0D5H,080H,0D5H,0EDH
data_T5: db 0ffH,0ffH,0ffH,0ffH,0ffH
data_T6: db 0C9H,0B6H,0AAH,0DDH,0AFH
data_T7: db 0ffH,0ffH,0ffH,0ffh,0ffh
data_T8: db 0ffh,0E3H,0DDH,0BEH,0ffh
data_T9: db 0ffH,0BEH,0DDH,0E3H,0ffh
data_T10: db 0EBH,0F7H,0C1H,0F7H,0EBH
data_T11: db 0F7H,0F7H,0C1H,0F7H,0F7H
data_T12: db 0FFH,0AFH,0CFH,0FFH,0FFH
data_T13: db 0F7H,0F7H,0F7H,0F7H,0F7H
data_T14: db 0ffH,09FH,09FH,0ffh,0ffh
data_T15: db 0DFH,0EFH,0F7H,0FBH,0FDH
data_A0: db 0C1H,0AEH,0B6H,0BAH,0C1H
data_A1: db 0ffh,0BDH,080H,0BFH,0ffh
data_A2: db 0BDH,09EH,0AEH,0B6H,0B9H
data_A3: db 0DEH,0BEH,0BAH,0B4H,0CEH
data_A4: db 0E7H,0EBH,0EDH,080H,0EFH
data_A5: db 0D8H,0BAH,0BAH,0BAH,0C6H
data_A6: db 0C3H,0B5H,0B6H,0B6H,0CFH
data_A7: db 0FEH,08EH,0F6H,0FAH,0FCH
data_A8: db 0C9H,0B6H,0B6H,0B6H,0C9H
data_A9: db 0F9H,0B6H,0B6H,0D6H,0E1H
data_A10: db 0ffH,0C9H,0C9H,0ffh,0ffh
data_A11: db 0ffH,0A9H,0C9H,0ffh,0ffh
data_A12: db 0F7H,0EBH,0DDH,0BEH,0ffh
data_A13: db 0EBH,0EBH,0EBH,0EBH,0EBH
data_A14: db 0ffH,0BEH,0DDH,0EBH,0F7H
data_A15: db 0FDH,0FEH,0AEH,0F6H,0F9H
data_A16: db 0CDH,0B6H,086H,0B6H,0C1H
data_H_AK: db 081H,0EEh,0EEh,0EEh,081h
data_H_BK: db 080H,0B6H,0B6H,0B6H,0C9H
data_H_CK: db 0C1H,0BEH,0BEH,0BEH,0DDH
data_H_DK: db 080H,0BEH,0BEH,0BEH,0C1H
data_H_EK: db 080H,0B6H,0B6H,0B6H,0BEH
data_H_FK: db 080H,0F6H,0F6H,0F6H,0FEH
data_H_GK: db 0C1H,0BEH,0B6H,0B6H,0C5H
data_H_HK: db 080H,0F7H,0F7H,0F7H,080H
data_H_IK: db 0FFH,0BEH,080H,0BEH,0FFH
data_H_JK: db 0DFH,0BFH,0BEH,0C0H,0FEH
data_H_KK: db 080H,0F7H,0EBH,0DDH,0BEH
data_H_LK: db 080H,0BFH,0BFH,0BFH,0BFH
data_H_MK: db 080H,0FDH,0F3H,0FDH,080H
data_H_NK: db 080H,0FBH,0F7H,0EFH,080H
data_H_OK: db 0C1H,0BEH,0BEH,0BEH,0C1H
data_H_PK: db 080H,0F6H,0F6H,0F6H,0F9H
data_H_QK: db 0C1H,0BEH,0AEH,0DEH,0A1H
data_H_RK: db 080H,0F6H,0E6H,0D6H,0B9H
data_H_SK: db 0B9H,0B6H,0B6H,0B6H,0CEH
data_H_TK: db 0FEH,0FEH,080H,0FEH,0FEH
data_H_UK: db 0C0H,0BFH,0BFH,0BFH,0C0H
data_H_VK: db 0E0H,0DFH,0BFH,0DFH,0E0H
data_H_WK: db 0C0H,0BFH,0C7H,0BFH,0C0H
data_H_XK: db 09CH,0EBH,0F7H,0EBH,09CH
data_H_YK: db 0F8H,0F7H,08FH,0F7H,0F8H
data_H_ZK: db 09EH,0AEH,0B6H,0BAH,0BCH
data_H_K1: db 0FFH,080H,0BEH,0BEH,0FFH ;[
data_H_K2: db 0EAH,0E9H,083H,0E9H,0EAH ;Y
data_H_K3: db 0FFH,0BEH,0BEH,080H,0FFH ;]
data_H_K4: db 0FBH,0FDH,0FEH,0FDH,0FBH ;^
data_H_K5: db 0BFH,0BFH,0BFH,0BFH,0BFH ;_
data_H_K6: db 0FFH,0FEH,0FDH,0FBH,0FFH ;`
data_Ha: db 0DFH,0ABH,0ABH,0ABH,087H ;a
data_Hb: db 080H,0B7H,0BBH,0BBH,0C7H ;b
data_Hc: db 0C7H,0BBH,0BBH,0BBH,0DFH ;c
data_Hd: db 0C7H,0BBH,0BBH,0B7H,080H ;d
data_He: db 0C7H,0ABH,0ABH,0ABH,0E7H ;e
data_Hf: db 0F7H,081H,0F6H,0FEH,0FDH ;f
data_Hg: db 0F3H,0ADH,0ADH,0ADH,0C1H ;g
data_Hh: db 080H,0F7H,0FBH,0FBH,087H ;h
data_Hi: db 0FFH,0BBH,082H,0BFH,0FFH ;i
data_Hj: db 0DFH,0BFH,0BBH,0C2H,0FFH ;j
data_Hk: db 080H,0EFH,0D7H,0BBH,0FFH ;k
data_Hl: db 0FFH,0BEH,080H,0BFH,0FFH ;l
data_Hm: db 083H,0FBH,0E7H,0FBH,087H ;m
data_Hn: db 083H,0F7H,0FBH,0FBH,087H ;n
data_Ho: db 0C7H,0BBH,0BBH,0BBH,0C7H ;o
data_Hp: db 083H,0EBH,0EBH,0EBH,0F7H ;p
data_Hq: db 0F7H,0EBH,0EBH,0E7H,083H ;q
data_Hr: db 083H,0F7H,0FBH,0FBH,0F7H ;r
data_Hs: db 0B7H,0ABH,0ABH,0ABH,0DFH ;s
data_Ht: db 0FBH,0C0H,0BBH,0BFH,0DFH ;t
data_Hu: db 0C3H,0BFH,0BFH,0DFH,083H ;u
data_Hv: db 0E3H,0DFH,0BFH,0DFH,0E3H ;v
data_Hw: db 0C3H,0BFH,0CFH,0BFH,0C3H ;w
data_Hx: db 0BBH,0D7H,0EFH,0D7H,0BBH ;x
data_Hy: db 0F3H,0AFH,0AFH,0AFH,0C3H ;y
data_Hz: db 0BBH,09BH,0ABH,0B3H,0BBH ;z
data_00: db 0ffH,0ffh,0ffh,0ffh,0ffh
;##########################################################################
; huruf kecil
;##########################################################################
TableKeyboard: DB 00
DB 0F9H
DB 00
DB 0F5H,0F3H,0F1H,0F2H,0FCH
DB 00H
DB 0FAH,0F8H,0F6H,0F4H
DB 0C0H
DB ‘`’
DB 00H
DB 00H
DB 0C1H
DB 0C2H
DB 00H
DB 0C3H
DB ‘q1′
DB 00H,00H,00H
DB ‘zsaw2′
DB 00H,00H
DB ‘cxde43′
DB 00H,00H
DB ‘ vftr5′
DB 00H,00H
DB ‘nbhgy6′
DB 00H,00H,00H
DB ‘mju78′
DB 00H,00H
DB ‘,kio09′
DB 00H,00H
DB ‘./l;p-‘
DB 00H,00H,00H
DB 27H
DB 00H
DB ‘[='
DB 00H,00H
DB 0C5H
DB 0C6H
DB 0AH
DB ']‘
DB 00H
DB ‘\’
;##########################################################################
; huruf Besar kapital
;##########################################################################
TableKeyboard2: DB 00
DB 0F9H
DB 00
DB 0F5H,0F3H,0F1H,0F2H,0FCH
DB 00H
DB 0FAH,0F8H,0F6H,0F4H
DB 0C0H
DB ‘`’
DB 00H
DB 00H
DB 0C1H
DB 0C2H
DB 00H
DB 0C3H
DB ‘Q!’
DB 00H,00H,00H
DB ‘ZSAW@’
DB 00H,00H
DB ‘CXDE$#’
DB 00H,00H
DB ‘ VFTR ‘
DB 00H,00H
DB ‘NBHGY^’
DB 00H,00H,00H
DB ‘MJU&*’
DB 00H,00H
DB ‘?L:P-‘
DB 00H,00H,00H
DB 27H
DB 00H
DB ‘{+’
DB 00H,00H
DB 0C5H
DB 0C6H
DB 0AH
DB ‘}’
DB 00H
DB ‘\’
;##########################################################################
; Hexa X desimal
; Dibuat oleh Sindhu Harimukti
; Jumat 03 agustus 2012
;##########################################################################
tabel_hex:
db 00h,01h,02h,03h,04h,05h,06h,07h,08h,09h,10h
db 11h,12h,13h,14h,15h,16h,17h,18h,19h,20h
db 21h,22h,23h,24h,25h,26h,27h,28h,29h,30h
db 31h,32h,33h,34h,35h,36h,37h,38h,39h,40h
db 41h,42h,43h,44h,45h,46h,47h,48h,49h,50h
db 51h,52h,53h,54h,55h,56h,57h,58h,59h,60h
db 61h,62h,63h,64h,65h,66h,67h,68h,69h,70h
db 71h,72h,73h,74h,75h,76h,77h,78h,79h,80h
db 81h,82h,83h,84h,85h,86h,87h,88h,89h,90h
db 91h,82h,93h,94h,95h,96h,97h,98h,99h

tabel_dec:
db 00,01,02,03,04,05,06,07,08,09,00,00,00,00,00,00
db 10,11,12,13,14,15,16,17,18,19,00,00,00,00,00,00
db 20,21,22,23,24,25,26,27,28,29,00,00,00,00,00,00
db 30,31,32,33,34,35,36,37,38,39,00,00,00,00,00,00
db 40,41,42,43,44,45,46,47,48,49,00,00,00,00,00,00
db 50,51,52,53,54,55,56,57,58,59,00,00,00,00,00,00
db 60,61,62,63,64,65,66,67,68,69,00,00,00,00,00,00
db 70,71,72,73,74,75,76,77,78,79,00,00,00,00,00,00
db 80,81,82,83,84,85,86,87,88,89,00,00,00,00,00,00
db 90,91,82,93,94,95,96,97,98,99,00,00,00,00,00,00
;##########################################################################

END
Program Slave 1
;##########################################################################
; Inisialisasi Port
; Program Running Text Pakek IC 4094
; 5 x Dotmatrix 8×8 mikrokontroler at89s52
;##########################################################################
CD4094_CP_2 BIT P1.2
CD4094_D_2 BIT P1.1
CD4094_Str_2 BIT P1.0

CD4094_CP_1 BIT P2.0
CD4094_D_1 BIT P2.1
CD4094_Str_1 BIT P2.2

enable_1 bit p3.0
enable_2 bit p3.1

Free_1 equ 20h
Free_2 equ 21h
Alamat_eh equ 22h
Alamat_el equ 23h
DPTR_HIGH equ 24h
DPTR_LOW equ 25h
tmp equ 26h
data_keyboard equ 27h

Data_matrix_1 equ 30h

org 00h

;##########################################################################
; Program Utama
;##########################################################################
Looping_program: jb enable_1,$
clr enable_2

mov R7,#33
mov R1,#data_matrix_1
jmp copy_data

copy_data: mov @r1,p0
inc r1
djnz R7,copy_data

loop: call Display_5
jmp Looping_program
;##########################################################################
; Tampilan Dotmatrix
;##########################################################################
Display_5: mov R1,#data_matrix_1+1
mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_4: call Rutin_4
mov A,tmp
rr a
djnz R3,tunggu_4

Display_3: mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_3: call Rutin_3
mov A,tmp
rr a
djnz R3,tunggu_3

Display_2: mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_2: call Rutin_2
mov A,tmp
rr a
djnz R3,tunggu_2

Display_1: mov R3,#7
MOV A,#10000000b

tunggu_1: call Rutin_1
mov A,tmp
rr a
djnz R3,tunggu_1

mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1

mov A,80
rl a
cpl a
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2
call Tunda1Detik
inc r1
mov A,#00h
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2

Ret
;##########################################################################
Rutin_1: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
ret
Rutin_2: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
ret
Rutin_3: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
ret
Rutin_4: mov tmp,a
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
ret
;##########################################################################
Display_Ascii_2: mov A,@r1
rl a
cpl a
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2
call Tunda1Detik
inc r1
mov A,#00h
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2
Ret
;##########################################################################
Hapus_tampilan: CLR CD4094_CP_1
Clr CD4094_Str_1
Call ClrDispLED_1
mov r3,#4
ulangi_1: MOV A,#00h
Call CD4094_Shift_1
djnz r3,ulangi_1
SetB CD4094_Str_1
Clr CD4094_Str_1
Ret

ClrDispLED_1: MOV A,#0FFh
CD4094_Shift_1: MOV R4,#8
CD4094_ShLoop_1: RLC A
MOV CD4094_D_1,C
SetB CD4094_CP_1
CLR CD4094_CP_1
DJNZ R4,CD4094_ShLoop_1
Ret

ClrDispLED_2: MOV A,#0FFh
CD4094_Shift_2: MOV R4,#8
CD4094_ShLoop_2: RLC A
MOV CD4094_D_2,C
SetB CD4094_CP_2
CLR CD4094_CP_2
DJNZ R4,CD4094_ShLoop_2
Ret
;##########################################################################
; Delay
;##########################################################################
Tunda1Detik: MOV R7,#5
Tunda1DetikL2: MOV R6,#5
Tunda1DetikL1: MOV R5,#5
DJNZ R5,$
DJNZ R6,Tunda1DetikL1
DJNZ R7,Tunda1DetikL2
Ret
END

Program Slave 2

;##########################################################################
; Inisialisasi Port
; Program Running Text Pakek IC 4094
; 5 x Dotmatrix 8×8 mikrokontroler at89s52
;##########################################################################
CD4094_CP_2 BIT P1.2
CD4094_D_2 BIT P1.1
CD4094_Str_2 BIT P1.0

CD4094_CP_1 BIT P2.0
CD4094_D_1 BIT P2.1
CD4094_Str_1 BIT P2.2

enable_1 bit p3.0
enable_2 bit p3.1

enable_3 bit p3.6
enable_4 bit p3.7

Free_1 equ 20h
Free_2 equ 21h
Alamat_eh equ 22h
Alamat_el equ 23h
DPTR_HIGH equ 24h
DPTR_LOW equ 25h
tmp equ 26h
data_keyboard equ 27h

Data_matrix_1 equ 30h

org 00h

;##########################################################################
; Program Utama
;##########################################################################
Looping_program: jb enable_3,$
clr enable_4

mov R7,#33
mov R1,#data_matrix_1
jmp copy_data

copy_data: mov @r1,p0
inc r1
djnz R7,copy_data

loop: call Display_5
jmp Looping_program
;##########################################################################
; Tampilan Dotmatrix
;##########################################################################
Display_5: mov R1,#data_matrix_1+1
mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_4: call Rutin_4
mov A,tmp
rr a
djnz R3,tunggu_4

Display_3: mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_3: call Rutin_3
mov A,tmp
rr a
djnz R3,tunggu_3

Display_2: mov R3,#8
MOv A,#00h
Call CD4094_Shift_1
MOV A,#10000000b
tunggu_2: call Rutin_2
mov A,tmp
rr a
djnz R3,tunggu_2

Display_1: mov R3,#7
MOV A,#10000000b

tunggu_1: call Rutin_1
mov A,tmp
rr a
djnz R3,tunggu_1

mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
mov A,80h
rl a
cpl a
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2
call Tunda1Detik
inc r1
mov A,#00h
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2

Ret
;##########################################################################
Rutin_1: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
ret
Rutin_2: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
ret
Rutin_3: mov tmp,a
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
ret
Rutin_4: mov tmp,a
Call CD4094_Shift_1
SetB CD4094_Str_1
Clr CD4094_Str_1
call Display_Ascii_2
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
MOv A,#00h
Call CD4094_Shift_1
ret
;##########################################################################
Display_Ascii_2: mov A,@r1
rl a
cpl a
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2
call Tunda1Detik
inc r1
mov A,#00h
Call CD4094_Shift_2
SetB CD4094_Str_2
Clr CD4094_Str_2
Ret
;##########################################################################
Hapus_tampilan: CLR CD4094_CP_1
Clr CD4094_Str_1
Call ClrDispLED_1
mov r3,#4
ulangi_1: MOV A,#00h
Call CD4094_Shift_1
djnz r3,ulangi_1
SetB CD4094_Str_1
Clr CD4094_Str_1
Ret

ClrDispLED_1: MOV A,#0FFh
CD4094_Shift_1: MOV R4,#8
CD4094_ShLoop_1: RLC A
MOV CD4094_D_1,C
SetB CD4094_CP_1
CLR CD4094_CP_1
DJNZ R4,CD4094_ShLoop_1
Ret

ClrDispLED_2: MOV A,#0FFh
CD4094_Shift_2: MOV R4,#8
CD4094_ShLoop_2: RLC A
MOV CD4094_D_2,C
SetB CD4094_CP_2
CLR CD4094_CP_2
DJNZ R4,CD4094_ShLoop_2
Ret
;##########################################################################
; Delay
;##########################################################################
Tunda1Detik: MOV R7,#5
Tunda1DetikL2: MOV R6,#5
Tunda1DetikL1: MOV R5,#5
DJNZ R5,$
DJNZ R6,Tunda1DetikL1
DJNZ R7,Tunda1DetikL2
Ret

END

Mesin Antrian Versi II



Mesin antrian ini dapat digunakan di tempat2 yang memerlukan antrian dengan suara manusia seperti : bank, loket listrik, dokter praktek, apotek, dll.
Spesifikasinya :
1. 5 unit display 3 digit angka 4 inch (tinggi 10 cm)
2. Display angka dari 000-999
3. suara manusia rec pemanggilan nomor urut 000-999
sample suara download disini ; [strip] />4.
Cetak No antrian printer epson menampilkan no urut, jam tanggal pemesanan + nama klinik / nama bank.

Harga Rp. 5.000.000,-
barang tidak ready indent perakitan 2 minggu.

Cetak Printer Epson tmu-210 dengan Mikrokontroler


Nglembur 3 malam untuk dapat program ini sambil hmm, pertama kali saya coba mengikuti cara pemrograman (mode nibble) karena melihat di datasheet printer epson ini tanpa mengetahui fungsinya. ternyata fungi nibble ini untuk mengambil data dari printer ke cpu (host), padahal yang saya perlukan adalah mengirimkan data dari host ke peripheral (printer). akhirnya kembali lagi ke proses pengiriman data 8 bit menggunakan mode kompatibilitas standar IEEE1284.
Kelebihan printer ini terdapat autocutter jadi dapat memotong kertas otomatis menggunakan software.

Gambar Printer

Hasil Cetakan

1. Compatibility Mode
This mode defines the protocol used by most PCs to transfer data to a printer. It is commonly called the “Centronics” mode and is the method utilized with the standard parallel port. In this mode, data is placed on the port’s data lines, the printer status is checked for no errors and that it is not Busy, and then a data Strobe is generated by the software to clock the data to the printer. Figure 1 describes this transfer.

2. Nibble Mode
The Nibble mode is the most common way to get reverse channel data from a printer or peripheral. This mode is usually combined with the Compatibility mode or a proprietary forward channel mode to create a complete bi-directional channel.

All of the standard parallel ports provide 5 lines from the peripheral to the PC to be used for external status indications. Using these lines, a peripheral can send a byte of data (8-bits) by sending 2 nibbles (4-bits) of information to the PC in two data transfer cycles. Unfortunately, since the nACK line is generally used to provide a peripheral interrupt, the bits used to transfer a nibble are not conveniently packed into the byte defined by the Status register. For this reason, the software must read the status byte and then manipulate the bits in order to get a correct byte.


berikut ini contoh skematiknya cetak printer dengan mikrokontroler


Gambar Printer

Listing Programnya
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; EPSON TMU_210
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

INIT BIT P3.4 ; pin 16
AUTO bit P3.7 ; pin 14
STROBE bit P3.3 ; pin 1
BUSY bit P3.5 ; pin 11

PORTDATA EQU P2

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
org 0h

CALL DELAY

START: CALL INISIALISASI_TMU210
mov DPTR,#DATA_1
CALL PRINT_DATA
CALL ENTER
mov DPTR,#DATA_2
CALL PRINT_DATA
CALL ENTER
CALL PRINT_SATUAN
CALL ENTER
CALL ENTER
CALL ENTER
CALL ENTER
CALL Potong_kertas
JMP $

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; ROUTINE PRINT
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

PRINT_DATA: clr A
movc A,@A+DPTR
cjne A,#’$’,Print1
sjmp Out1
Print1: call MASUKAN
inc dptr
sjmp PRINT_DATA
Out1: ret

PRINT_SATUAN: PUSH ACC
mov A,#’2′
CALL MASUKAN
mov A,#’5′
CALL MASUKAN
mov A,#’5′
CALL MASUKAN
POP ACC
RET

MASUKAN: MOV PORTDATA,A
WAIT: JB BUSY,WAIT ;JIKA BUSY MAKA LOMPAT WAIT (TUNGGU)
CLR STROBE
NOP ;1
NOP ;2
NOP ;3
NOP ;4
SETB STROBE
CALL DELAY
RET

ENTER: PUSH ACC
MOV A,#0AH
ACALL MASUKAN
POP ACC
RET

Potong_kertas: PUSH ACC
mov A,#29
CALL MASUKAN
mov A,#86
CALL MASUKAN
mov A,#48
CALL MASUKAN
POP ACC
ret
RET

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; INISIALISASI PRINTER !!!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
INISIALISASI_TMU210:
PUSH ACC
SETB INIT
SETB AUTO ;SET: INIT=HI, SEL INP=LOW, AUTOFEED=HI, STROBE=HI
SETB STROBE
MOV A,#1BH ;1B=ESC (DATA PERINTAH)
ACALL MASUKAN
MOV A,#40H ;40=@ (DATA INISIALISASI)
ACALL MASUKAN
POP ACC

;xxxxxxxxx POSISI PRINTxxxxxxxx

PUSH ACC
MOV A,#27 ;1B=ESC (DATA PERINTAH)
ACALL MASUKAN
MOV A,#97
ACALL MASUKAN
MOV A,#49
ACALL MASUKAN
POP ACC

;xxxxxxx FONT LEBAR xxxx

PUSH ACC
MOV A,#27
ACALL MASUKAN
MOV A,#33
ACALL MASUKAN
MOV A,#32
ACALL MASUKAN
POP ACC
;zzzzzzzzzzzzzzzzzzzzzzzzzzzz
;zzzzzzzz FONT Jenis zzzzzzzzz
;zzzzzzzzzzzzzzzzzzzzzzzzzzzz
PUSH ACC
MOV A,#27
ACALL MASUKAN
MOV A,#77
ACALL MASUKAN
MOV A,#49
POP ACC

;WWWW AMBIL KERTAS WWWW
CALL ENTER
ret

delay: mov R7,#0
del1: mov R6,#200
DJNZ R6,$
DJNZ R7,del1
ret

DATA_1: DB ‘ BANK SINDHU $’
DATA_2: DB ‘NOMOR ANTRIAN $’

end

Line Follower


LINE FOLLOWER

1. PENDAHULUAN
Line Follower berarti mengikuti suatu lintasan yang sering di sebut line track. Line Track sama dengan garis berwarna hitam di atas permukaan putih atau sebaliknya. Kenapa harus berwarna putih atau hitam? Hal itu karena sensor hanya dapat mendeteksi warna hitam atau putih saja. Banyak orang bertanya – tanya kenapa harus warna hitam dan putih? Karena warna putih itu terang dan bersifat memantulkan sedangkan warna hitam redup dan bersifat menyerap.

2. MEKATRONIK
– Membongkar mobil-mobilan yang diambil roda, dudukan gird an motornya, sepertti gambar dibawah ini :


– Hubungkan dudukan roda, gear, motor DC dengan baut, terlihat seperti gambar dibawah ini :

- Membuat tutupan PCB dengan menggunakan acrylic yang telah dilapisi dengan plester hitam dan list transparan. Ukuran sesuai dengan ukuran PCB, terlihat seperti gambar berikut :

3. MEMBUAT PCB
– Menyiapkan komponen, seperti berikut :
1. TIP 31 ………………………… 2 buah
2. TIP 32 ………………………… 2 buah
3. regulator 7805 ………………………… 1 buah
4. IC ULN 2003AN ………………………… 1 buah
5. AT89C52 ………………………… 1 buah
6. LM324N ………………………… 1 buah
7. led bright ………………………… 2 buah
8. led ultra bright ………………………… 2 buah
9. photodiode ………………………… 2 buah
10. trimpot 20k ………………………… 2 buah
11. crystal 12 MHz ………………………… 1 buah
12. elco 100uF ………………………… 1 buah
13. elco 10uF ………………………… 1 buah
14. resistor 10k ………………………… 3 buah
15. resistor 220 ………………………… 4 buah

- Membuat PCB berukuran 13,8×10 cm dengan cara digergaji, terlihat seperti gambar berikut:
– Bersihkanlah kertas yang seharusnya terlarut, kemudian larutkan PCB tersebut dengan larutan FeCl, atau dapat dikatakan di etching. Gambar tampak sebagai berikut :


– Setelah terlarut jalur yang tidak di inginkan, PCB dibor dengan bor duduk atau bor tangan, kemudian di bersihkan dengan tinner dan diberi larutan gondorukem. Dijemur tunggu kering.

- Menyolder semua komponen dengan rapi dan matang, terlihat seperti gambar :


4. ALGORITMA
Proses kendali motor menggunakan teknik PWM ( Pulse Width Modulation ). PWM merupakan teknik pengendalian kecepatan motor yang cukup efektif, bekerja dengan cara membuat gelombang persegi yang memiliki perbandingan pulsa high dan pulsa low. Gelombang persegi untuk motor maju/ mundur memiliki frequensi tetap.
Rumus dasar frequensi

f = 1/ t

rumus frequensi tetap motor :

f = 1/ jumlah PWM

keterangan : f = frequensi ( Hz )
t = waktu ( s )

1. motor maju/ mundur
PWM High ( 1 ) = 250uS = 0.00025S
PWM Low ( 0 ) = 500uS = 0.0005S

F = 1/ jumlah PWM
= 1/ ( 0.00025 + 0.0005)
= 1/ 0.00075
= 1333.33
jadi, besar frequensi tetap motor maju/ mundur adalah 1333.33Hz

sedangkan untuk frequency tetap motor tikungan
2. motor tikungan

PWM High ( 1 ) = 1000uS= 0.001S
PWM Low ( 0 ) = 500uS = 0.0005S

F = 1/ jumlah PWM
= 1/ ( 0.001 + 0.0005)
= 1/ 0.0015
= 666.67
jadi, besar frequensi tetap tikungan adalah 666.67Hz

namun yang diatur adalah lebar pulsa high dan pulsa low dalam 1 periode. Perbandingan pulsa high terhadap pulsa low ini akan menentukan jumlah daya yang diberikan motor. Perbandingan PWM high dan PWM mempengaruhi kecepatan motor. Sewaktu nilai PWM high lebih besar daripada PWM low, maka motor akan cepat, sebaliknya apabila PWM high lebih kecil dibandingkan nilai PWM low maka motor akan melambat.

Motor akan bergerak kekanan dan kekiri dengan metode H-bridge transistor. H-bridge transistor merupakan kombinasi 4 transistor yang disusun sedemikian rupa sehingga membentuk huruf H. dengan menggunakan metode H-bridge ini, dapat mengontrol motor dalam putaran kanan atau kiri, jadi dengan metode demikian arus yang mengalir ke motor polaritasnya dapat diatur dengan memberikan logika keempat resistor.
motor akan berjalan apabila kedua input berbeda, karena jika kedua input berlogika 0 maka motor akan berhenti sedangkan jika kedua input berlogika 1tidak diperbolehkan, karena hal ini akan mengakibatkan semua transistor berada pada kondisi aktif dan rangkaian akan hubung singkat.
Pada saat A berlogika 1 dan B berlogika 0, maka arus akan mengalir ke Q3 dan Q1, sehingga akan berputar ke kanan (searah jarum jam). Sedangkan pada saat A berlogika 0 dan B berlogika 1, maka arus akan mengalir ke Q2 dan Q4, sehingga berputar ke kiri (berlawanan arah jarum jam). Arah putaran searah dengan jarum jam di sebut CW ( clock wise ) sedangkan arah putaran berlawanan jarum jam di sebut CCW ( counter clock wise ).

proses motor bergerak adalah apabila led kanan mengenai detector putih maka dipantulkan ke photo dioda kanan yang akan memberi informasi kekontrol dan diteruskan ke motor kanan sehingga motor kanan maju motor kiri berhenti terjadi belok kiri. Sebaliknya jika led kiri mengenai detector putih maka akan dipantulkan juga ke photo dioda kiri dan informasi yang diterima di lanjutkan ke motor kiri, sehingga motor kiri maju motor kanan berhenti terjadi belok kanan.

LISTING PROGRAM

http://www.4shared.com/file/h5KcxPzk/line.html