Dibawah ini merupakan listing program untuk salah satu penggunaan mikrokontroler AT89S51 sebagai sistem password digital menggunakan LCD 8x2 dan keypad matriks 3x4 menggunakan bahasa assembly.
;==================================================================================
;PROGRAM "SISTEM PASSWORD DIGITAL"
;Password Standart:"1234" (Password dapat diganti langsung dari Menu)
;Created By : SURYANTO SETIOADHI,ST
;==================================================================================
#include
;DRIVER KEYPAD MATRIX 3X4 (HITAM)
;XX-R2-R3-C3-R4-C1-R1-C2
Data_key EQU P3
Col2 Bit data_Key.0
Row1 Bit data_key.1
Col1 Bit data_Key.2
Row4 Bit data_key.3
Col3 Bit data_Key.4
Row3 Bit data_key.5
Row2 Bit data_key.6
;LCD M1632
Res Bit P1.2
LCD_EN Bit P1.3
W_R Bit P1.4
Data_LCD equ P0
Divices1 Bit P2.0
Divices2 Bit P2.1
Alarm Bit P2.4
DPH data 0x83
DLH data 0x82
Dseg
Org 30h
Ram: Ds 10
Pass_In: Ds 4
Password: Ds 4
Cseg
Org 00h
setb Divices1
setb Divices2
setb Alarm
Start: Acall Init_LCD
Mov Password,#01h
Mov Password+1,#02h
Mov Password+2,#03h
Mov Password+3,#04h
Restart: Mov DPTR,#Judul_1
Acall Tuliskan1
Mov DPTR,#Judul_2
Acall Tuliskan2
;--------------------------------------------------
; PROGRAM MENU UTAMA
;--------------------------------------------------
Loop: acall check_keypad
cjne A,#0FFh,Menu
Ajmp Loop
Menu: Mov DPTR,#Judul_3
Acall Tuliskan1
Mov DPTR,#Judul_4
Acall Tuliskan2
Mov R1,#Pass_In
Mov A,#41h
Acall Line
Acall Blink_On
;--------------------------------------------------
; PROGRAM INSERT PASSWORD
;--------------------------------------------------
Loop_Keypad: Acall Check_Keypad
Cjne A,#0FFh,Check_Data
Ajmp Loop_Keypad
Check_Data: Cjne A,#0FFh,Check_Enter
Ajmp Menu
Check_Enter: Cjne A,#0Bh,Insert_Data
Acall Blink_ON
Mov R0,#Password
Mov R1,#Pass_In
Ajmp Compare_Data
Insert_Data: Cjne R1,#Pass_In+4,Next_Insert
Ajmp Menu
Next_Insert: Mov @R1,A
Inc R1
Mov A,#2Ah
Acall Write_LCD
Ajmp Loop_Keypad
;--------------------------------------------------
; PROGRAM COMPARE PASSWORD
;--------------------------------------------------
Compare_Data: Mov A,@R0
Mov B,@R1
Cjne A,B,Wrong_Pin
Inc R0
Inc R1
Cjne R0,#Password+4,Compare_Data
Acall Clear_Led
Mov DPTR,#Text_Pin_Benar
Acall Tuliskan1
Mov R5,#05h
Acall Two_Second_Delay_1
Ajmp Menu_Select
;--------------------------------------------------
; PROGRAM PASSWORD SALAH
;--------------------------------------------------
Wrong_Pin: Mov DPTR,#Text_Pin_Salaha
Acall Tuliskan1
Mov DPTR,#Text_Pin_Salahb
Acall Tuliskan2
Mov R5,#05h
Acall Two_Second_Delay
Clr alarm
Acall Two_Second_Delay
Acall Two_Second_Delay
Acall Two_Second_Delay
Acall Two_Second_Delay
setb alarm
Mov Pass_In+3,#0FFh
Ajmp Restart
;--------------------------------------------------
; PROGRAM PASSWORD BENAR masuk ke MENU PILIHAN
;--------------------------------------------------
Menu_Select: Mov DPTR,#Menu_1
Acall Tuliskan1
Mov DPTR,#Menu_2
Acall Tuliskan2
;--------------------------------------------------
; PROGRAM MENU PILIHAN LED
;--------------------------------------------------
Lompat_jauh1: Ljmp Next_Select2
Next_Select1: Acall Check_Keypad
Cjne A,#02h,Lompat_jauh1
Mov DPTR,#Text_Led_1
Acall Tuliskan1
Mov DPTR,#Text_Led_2
Acall Tuliskan2
;--------------------------------------------------
; PROGRAM MENU PILIHAN LED OFF
;--------------------------------------------------
Lompat_jauh4: Ljmp Sub_Next_Select2
Sub_Next_Select1: Acall Check_Keypad
Cjne A,#0Ah,Lompat_jauh4
rool_OFF: Mov DPTR,#Text_OFF_1
Acall Tuliskan1
Mov DPTR,#Text_OFF_2
Acall Tuliskan2
Mati_1: Acall Check_Keypad
Cjne A,#01h,Mati_2
setb Divices1
Mov Pass_In+3,#0FFh
Mov DPTR,#Text_Mati_1a
Acall Tuliskan1
Mov DPTR,#Text_Divices_1
Acall Tuliskan2
Acall Two_Second_Delay
Acall Two_Second_Delay
Acall Two_Second_Delay
Ajmp Restart
Mati_2: Cjne A,#02h,Awal_3
setb Divices2
Mov DPTR,#Text_Mati_1a
Acall Tuliskan1
Mov DPTR,#Text_Divices_2
Acall Tuliskan2
Acall Two_Second_Delay
Acall Two_Second_Delay
Ajmp Restart
Awal_3: Cjne A,#0Ah,Awal_4
Ajmp rool_OFF
atas1: ajmp Mati_1
Awal_4: Cjne A,#0Bh,atas1
Ajmp restart
;--------------------------------------------------
; PROGRAM MENU PILIHAN LED ON
;--------------------------------------------------
Lompat_Jauh3: Ljmp Sub_Next_Select1
Sub_Next_Select2: Cjne A,#0Bh,Lompat_Jauh3
sjmp rool_ON
rool_ON:
Mov DPTR,#Text_ON_1
Acall Tuliskan1
Mov DPTR,#Text_ON_2
Acall Tuliskan2
Nyala_1:
Acall Check_Keypad
Cjne A,#01h,Nyala_2
clr Divices1
Mov Pass_In+3,#0FFh
Mov DPTR,#Text_OK_1a
Acall Tuliskan1
Mov DPTR,#Text_Divices_1
Acall Tuliskan2
Acall Two_Second_Delay
Acall Two_Second_Delay
Acall Two_Second_Delay
Ajmp Restart
Nyala_2:
Cjne A,#02h,Awal_1
clr Divices2
Mov Pass_In+3,#0FFh
Mov DPTR,#Text_OK_1a
Acall Tuliskan1
Mov DPTR,#Text_Divices_2
Acall Tuliskan2
Acall Two_Second_Delay
Acall Two_Second_Delay
Acall Two_Second_Delay
Ajmp Restart
Awal_1: Cjne A,#0Ah,Awal_2
Ajmp rool_ON
atas2: ajmp Nyala_1
Awal_2: Cjne A,#0Bh,atas2
Ajmp restart
;--------------------------------------------------
; PROGRAM MENU PILIHAN GANTI PIN
;--------------------------------------------------
Lompat_Jauh2: Ljmp Next_Select1
Next_Select2: Cjne A,#01h,Lompat_Jauh2
Mov DPTR,#Judul_5
Acall Tuliskan1
Mov DPTR,#Judul_4
Acall Tuliskan2
Mov R1,#Password
Mov A,#41h
Acall Line
Acall Blink_On
;--------------------------------------------------
; PROGRAM GANTI PASSWORD
;--------------------------------------------------
New_Pass1: Acall Check_Keypad
Cjne A,#0FFh,Check_New_Pass1
Ajmp New_Pass1
Check_New_Pass1: Cjne A,#0Ah,Check_New_Pass2
Ajmp New_Pass1
Check_New_Pass2: Cjne A,#0Bh,Check_New_Pass3
Ajmp New_Pass1
Check_New_Pass3:
Mov @R1,A
Inc R1
Mov A,#2Ah
Acall Write_LCD
Cjne R1,#Password+4,New_Pass1
Mov DPTR,#Judul_6
Acall Tuliskan1
Mov DPTR,#Judul_4
Acall Tuliskan2
Mov R1,#Pass_In
Mov A,#41h
Acall Line
Acall Blink_On
New_Pass2: Acall Check_Keypad
Cjne A,#0FFh,Re_New_Pass1
Ajmp New_Pass2
Re_New_Pass1: Cjne A,#0Ah,Re_New_Pass2
Ajmp New_Pass2
Re_New_Pass2: Cjne A,#0Bh,Re_New_Pass3
Ajmp New_Pass2
Re_New_Pass3: Mov @R1,A
Inc R1
Mov A,#2Ah
Acall Write_LCD
Cjne R1,#Pass_In+4,New_Pass2
Acall Blink_ON
Mov R0,#Password
Mov R1,#Pass_In
;-------------------------------------------------------
; PROGRAM COMPARE NEW PASSWORD
;-------------------------------------------------------
Compare_New: Mov A,@R0
Mov B,@R1
Cjne A,B,Wrong_New_Pin
Inc R0
Inc R1
Cjne R0,#Password+4,Compare_New
Mov DPTR,#Text_Pin_Anda
Acall Tuliskan1
Mov DPTR,#Text_Change
Acall Tuliskan2
Acall Two_Second_Delay
Mov Pass_In+3,#0FFh
Ajmp Restart
Wrong_New_Pin: Mov DPTR,#Text_Pin_Anda
Acall Tuliskan1
Mov DPTR,#Text_No_Change
Acall Tuliskan2
Acall Two_Second_Delay
Acall Two_Second_Delay
Ajmp Menu_Select
;--------------------------------------------------
; PROGRAM DELAY
;--------------------------------------------------
Two_Second_Delay: Mov R5,#0Ah
Two_Second_Delay_1: Acall Long_Delay
Djnz R5,Two_Second_Delay_1
Ret
Long_Delay: Mov R7,#0FFH
Long_Delay_1: Acall Delay
Djnz R7,Long_Delay_1
Ret
Delay: Mov R6,#0FFH
Djnz R6,$
ret
Tuliskan1: Acall Line_1
Ajmp Tuliskan
Tuliskan2: Acall Line_2
Tuliskan: Acall Write_Sentence
Ret
;--------------------------------------------------
; PROGRAM DATABASE TULISAN LCD
;--------------------------------------------------
Judul_1: Db "WELCOME "
Judul_2: Db "ELEKTRO "
Judul_3: Db "INSERT "
Judul_4: Db "(----) "
Judul_5: Db "NEW PIN "
Judul_6: Db "RE_PIN "
Menu_1: Db "1)G.PIN "
Menu_2: Db "2)LED "
Text_Led_1: Db "*)OFF "
Text_Led_2: Db "#)ON "
Text_Pin_Salaha: Db "PIN "
Text_Pin_Salahb: Db "SALAH "
Text_Pin_Benar: Db "PIN OK "
Text_Pin_Anda : Db "PIN "
Text_Change: Db "BERUBAH "
Text_No_Change: Db "BLM UBAH"
Text_ON_1: Db "1)ON 1 "
Text_ON_2: Db "2)ON 2 "
Text_OFF_1: Db "1)OFF 1 "
Text_OFF_2: Db "2)OFF 2 "
Text_Blank: Db " "
Text_OK_1a: Db "OK... "
Text_divices_1: Db "LED1 "
Text_divices_2: Db "LED2 "
Text_Mati_1a: Db "Matikan "
;--------------------------------------------------
; PROGRAM KONVERSI KEYPAD
;--------------------------------------------------
Check_Keypad:
Mov Data_Key,#0FFH
Clr Col1
Clr Col2
Clr Col3
Acall Delay
Mov A,Data_Key
Anl A,#11101010b
Cjne A,#11101010b,Check_Column_1
Mov A,#0FFH
Ret
Check_Column_1:
Clr Col1
Setb Col2
Setb Col3
Mov A,Data_Key
Anl A,#1111011b
Cjne A,#1111011b,Column_1_Line_1
ajmp Check_Column_2
Column_1_Line_1:
Jb Row1,Column_1_Line_2
Mov A,#01h
Jnb Row1,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Column_1_Line_2:
Jb Row2,Column_1_Line_3
Mov A,#04h
Jnb Row2,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Column_1_Line_3:
Jb Row3,Column_1_Line_4
Mov A,#07h
Jnb Row3,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Column_1_Line_4:
Jb Row4,Back
Mov A,#0Ah
Jnb Row4,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Check_Column_2:
Setb Col1
Clr Col2
Setb Col3
Acall Delay
Mov A,Data_Key
Anl A,#1111110b
Cjne A,#1111110b,Column_2_Line_1
ajmp Check_Column_3
Column_2_Line_1:
Jb Row1,Column_2_Line_2
Mov A,#02h
Jnb Row1,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Back: Ret
Column_2_Line_2:
Jb Row2,Column_2_Line_3
Mov A,#05h
Jnb Row2,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Column_2_Line_3:
Jb Row3,Column_2_Line_4
Mov A,#08h
Jnb Row3,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Column_2_Line_4:
Jb Row4,Back
Mov A,#00h
Jnb Row4,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Check_Column_3:
Setb Col1
Setb Col2
Clr Col3
Acall Delay
Mov A,Data_Key
Anl A,#1110111b
Cjne A,#1110111b,Column_3_Line_1
Mov A,#0FFH
Mov Data_Key,#0FFH
Ret
Column_3_Line_1:
Jb Row1,Column_3_Line_2
Mov A,#03h
Jnb Row1,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Column_3_Line_2:
Jb Row2,Column_3_Line_3
Mov A,#06h
Jnb Row2,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Column_3_Line_3:
Jb Row3,Column_3_Line_4
Mov A,#09h
Jnb Row3,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
Column_3_Line_4:
Jb Row4,Back
Mov A,#0Bh
Jnb Row4,$
Acall LOng_Delay
Mov Data_Key,#0FFH
Ret
;LCD M1632
;==========================================================
;INITIALISASI LCD (DILAKUKAN PERTAMA KALI DIAWAL PROGRAM)
;==========================================================
Init_LCD:
Acall Two_Second_Delay
Clr W_R
Clr Res
Acall Two_Second_Delay
Mov A,#01h
Acall Write_LCD_Command
Acall Delay_LCD
MOv A,#02h
Acall Write_LCD_Command
Acall Delay_LCD
MOv A,#06h
Acall Write_LCD_Command
Acall Delay_LCD
MOv A,#0Ch
Acall Write_LCD_Command
Acall Delay_LCD
MOv A,#28h
Acall Write_LCD_Command
Acall Delay_LCD
MOv A,#02h
Acall Write_LCD_Command
Acall Delay_LCD
Ret
;==============================================================
; MENULIS SATU KARAKTER ACUMULATOR KE LCD
;==============================================================
Nulis:
ADD A,#30h
Write_LCD:
Clr W_R
Setb Res
Write_LCD_1:
Clr W_R
Mov B,A
Swap A
Orl A,#0F0h
Mov Data_LCD,A
Clr LCD_En
Acall Delay
Setb LCD_En
MOv A,B
Orl A,#0F0h
MOv Data_LCD,A
Acall Delay
Clr LCD_En
acall Delay
Setb LCD_En
Acall Delay
Ret
Write_LCD_Address:
Clr W_R
Orl A,#80h
Write_LCD_Command:
Clr W_R
Clr Res
Mov B,A
Swap A
Orl A,#0F0h
Mov Data_LCD,A
Clr LCD_En
Acall Delay
Acall Delay
Setb LCD_En
Acall Delay
Acall Delay
MOv A,B
Orl A,#0F0h
MOv Data_LCD,A
Acall Delay
Clr LCD_En
Acall Delay
Acall Delay
Setb LCD_En
Acall Delay
Acall Delay
Ret
Blink_On: Clr Res
Mov A,#0Fh
Acall Write_LCD_Command
Ret
Blink_Off: Clr Res
Mov A,#0Ch
Acall Write_LCD_Command
Ret
Clear_Led: Clr Res
Mov A,#01h
Acall Write_LCD_Command
Ret
LCD_OFF: Clr W_R
Clr Res
Mov A,#08h
Acall Write_LCD_Command
Acall Delay_LCD
Ret
LCD_ON: Clr W_R
Clr Res
Acall Long_Delay
Mov A,#0Ch
Acall Write_LCD_Command
Acall Delay_LCD
Ret
;=====================================================================
;MENENTUKAN LOKASI PENULISAN PADA BARIS PERTAMA KOLOM 1
;=====================================================================
Line_1: Mov A,#00h
Line: Ajmp Write_LCD_Address
;=====================================================================
;MENENTUKAN LOKASI PENULISAN PADA BARIS PERTAMA KOLOM 2
;=====================================================================
Line_2: Mov A,#40h
Ajmp Write_LCD_Address
;=====================================================================
;MENULIS 16 KARAKTER SEKALIGUS KE LCD
;=====================================================================
Write_Sentence: Clr W_R
Mov R7,#00h
Write_Sentence_1: Clr W_R
Mov A,R7
Movc A,@A+Dptr
Acall Write_LCD
Inc R7
Cjne R7,#10h,Write_Sentence_1
Ret
Delay_LCD:
Acall Long_Delay
Acall Long_Delay
Acall Long_Delay
Acall Long_Delay
Ret
End