org 00h col1 bit P1.4 col2 bit P1.6 col3 bit P1.2 row1 bit P1.5 row2 bit P1.0 row3 bit P1.1 row4 bit P1.3 RS bit p3.5 RW bit p3.6 EN bit p3.7 org 30h mov TMOD,#01H ; Timer 0 mode 1 call Init_lcd ; Inisialisasi LCD start: setb p3.4 mov R1,#0 mov 50h,#0 mov 51h,#0 mov 52h,#0 call write_char call keypad mov A,40h cjne A,#'*',start pilihan: jb p3.4,cpl setb p3.4 call write_char2 sjmp terusan cpl: clr p3.4 call write_char3 terusan: mov A,#0C0h ;A=0C0h,address DDRAM start position call write_inst terus1: call keypad call write_data1 mov A,40h cjne A,#'*',terus2 cjne R1,#2,kanan mov R1,#1 sjmp pilihan terus2: cjne A,#'#',geser cjne R1,#2,kiri sjmp start geser: mov 41h, 50h mov 42h, 51h mov A,40h subb A,#30h mov 40h,A mov 50h, 40h mov 51h, 41h mov 52h, 42h sjmp terus1 kiri: ;call proses jnb p3.4,cek_1 ;call derajat cek_1: cjne A,#0,lanjut1 ljmp start lanjut1: mov r5,#0 mov r5,a ;call putar_kiri ljmp start kanan: ;call proses jnb p3.4,cek_2 ;call derajat cek_2: cjne A,#0,lanjut2 ljmp start lanjut2: mov r5,#0 mov R5,A ;call putar_kanan ljmp start ; ;================================================================ SCAN KEYPAD 3X4 ========================================================== keypad: mov p1,#0ffh setb col3 ;col3= 1 setb col2 ;col2= 1 clr col1 ;col1= 0 key_1: jb row1,key_2 ;Key_1 Jump ke key_2 mov 40h,#'1' ;Data Output = '1' inc R1 jnb row1,$ ;Tunggu lepas ret ; key_2: jb row2,key_3 ;Key_2 Jump ke key_3 mov 40h,#'4' ;Data Output = '4' inc R1 jnb row2,$ ;Tunggu lepas ret ; key_3: jb row3,key_4 ;Key_3 Jump ke key_4 mov 40h,#'7' ;Data Output = '7' inc R1 jnb row3,$ ;Tunggu lepas ret ; key_4: jb row4,key_5 ;Key_4 Jump ke key_5 mov 40h,#'*' ;Data Output = '*' inc R1 jnb row4,$ ;Tunggu lepas ret ; key_5: setb col1 setb col3 clr col2 jb row1,key_6 ;Key_5 Jump ke key_6 mov 40h,#'2' ;Data Output = '2' inc R1 jnb row1,$ ;Tunggu lepas ret ; key_6: jb row2,key_7 ;Key_6 Jump ke key_7 mov 40h,#'5' ;Data Output = '5' inc R1 jnb row2,$ ;Tunggu lepas ret ; key_7: jb row3,key_8 ;Key_7 Jump ke key_8 mov 40h,#'8' ;Data Output = '8' inc R1 jnb row3,$ ;Tunggu lepas ret ; key_8: jb row4,key_9 ;Key_8 Jump ke key_9 mov 40h,#'0' ;Data Output = '0' inc R1 jnb row4,$ ;Tunggu lepas ret ; key_9: setb col2 setb col1 clr col3 jb row1,key_10 ;Key_9 Jump ke key_10 mov 40h,#'3' ;Data Output = '3' inc R1 jnb row1,$ ;Tunggu lepas ret ; key_10: jb row2,key_11 ;Key_10 Jump ke key_11 mov 40h,#'6' ;Data Output = '6' inc R1 jnb row2,$ ;Tunggu lepas ret ; key_11: jb row3,key_12 ;Key_11 Jump ke key_12 mov 40h,#'9' ;Data Output = '9' inc R1 jnb row3,$ ;Tunggu lepas ret ; key_12: jb row4,nokey ;Key_12 Jump ke nokey mov 40h,#'#' ;Data Output = '#' inc R1 jnb row4,$ ;Tunggu lepas ret nokey: ljmp keypad ;Jump ke key_1 ; ;============================================================ PROSES ===================================================================== ;============================================================ WRITE DATA ===================================================================== ; write_char: mov A,#01h call write_inst mov A,#80h ;A=80h,address DDRAM start position call write_inst mov dptr,#word1 ;DPTR = [ address word1 ] sjmp write1 write_char2: mov A,#01h call write_inst mov A,#80h ;A=80h,address DDRAM start position call write_inst mov dptr,#word2 ;DPTR = [ address word2 ] sjmp write1 write_char3: mov A,#01h call write_inst mov A,#80h ;A=80h,address DDRAM start position call write_inst mov dptr,#word3 ;DPTR = [ address word3 ] sjmp write1 ; write1: clr A ; A = 0 movc A,@A+dptr ; A = [A+ DPTR] jz balik call write_data ; inc dptr ; DPTR = DPTR +1 sjmp write1 balik: ret ; ;==================================================================== INISIALISASI ======================================================== Init_lcd: mov A,#00000001b ;Display clear call write_inst ; mov A,#00111000b ;Function set, Data 8 bit,2 line font 5x7 call write_inst ; mov A,#00001100b ;Display on, cursor off,cursor blink off call write_inst ; mov A,#00000110b ;Entry mode, Set increment call write_inst ret ; write_inst: clr RS ; P3.1 = RS =0 mov P2,A ; copy R1 ke P2 setb EN ; P3.3 = EN = 1 call delay ; call delay time clr EN ; P3.3 = EN = 0 clr RW ; P3.2 = RW = 0 ret ; write_data: setb RS ; P3.1 = RS = 1 mov P2,A ; copy R1 ke P2 setb EN ; P3.3 = EN = 1 call delay ; call delay time clr EN ; P3.3 = EN = 0 clr RW ; P3.2 = RW = 0 ret ; write_data1: setb RS ; P3.1 = RS = 1 mov P2,40h ; copy R1 ke P2 setb EN ; P3.3 = EN = 1 call delay ; call delay time clr EN ; P3.3 = EN = 0 clr RW ; P3.2 = RW = 0 ret ; ;============================================================== DELAY ====================================================================== ; delay: mov R6,#30 delay1: mov R7,#10h djnz R7,$ djnz R6,delay1 ret ; tunda: mov r6,#10 tunda1: mov TH0,#3CH mov TL0,#0AFH setb TR0 tunda2: jnb TF0,tunda2 clr TF0 clr TR0 djnz r6,tunda1 ret ; word1: DB 'TEKAN TOMBOL(*)',0 word2: DB 'PASSWORD =',0 word3: DB 'MASUKKAN PULSA=',0 end