LAMPIRAN
display_clear equ 01h funcset equ 38h entrymodset equ 06h dispon equ 0ch cursor equ 0eh blink equ 0fh rs_lcd equ p1.4 e_lcd equ p1.5 ram_lcd equ 40h data_lcd equ 41h blink_on bit
cursor_on bit Inisialisasi memori mikro untuk pengaturan LCD
bitsave equ 22h display_clear equ 01h funcset equ 28h entrymodset equ 06h dispon equ 0ch cursor equ 0eh blink equ 0fh data_lcd equ 38h ram_lcd equ 39h portData equ P2
KbdData bit P3.2
KbdClock bit p3.3 ;INT0;P3.2 DataKeyboard equ 35h
Tombol_1 bit P3.0 KeyClk bit P3.2
KeyData bit P3.4 Inisialisai memori pengolahan Keyboard PC
Nbits equ 30h Nbytes equ 31h KeyRtn equ 33h shift bit 0 c_flags equ 21h
busy bit P1.1 strobe bit P1.0
rset bit p1.2
portData equ P2
charcounter equ 42h inisialisasi memori untuk printer
addresscounter equ 43h
Pdata Equ P2
;Strobe bit P1.0 ; to printer
init bit rset ; to printer
;busy bit P1.6 ; from printer
bounc equ 22h
DL1 EQU 24H
DL2 EQU 25H
busy bit P0.0 inisialisasi memori untuk printer
strobe bit P0.1 stb bit strobe ack bit p0.2 pe bit p0.3 reset_print bit p0.4
m equ 34h
;
Slave_AddrSEE equ 45h
DataSEE equ 46h inisialisasi memori external sda bit p1.6
scl bit p1.7 ;
;
org 0h
ajmp start ;reset org 3h
ajmp KeyBoard ;extrn interrupt 0 org 0bH
ajmp start ;timer 0
org 013h pemetaan alamat
sub-program
ajmp start ;extrn interrupt 1 org 01bh
ajmp start ;timer 1 org 023h
ajmp start ;Serial I/O ;
org 0100h
;=============================== ;sub-program penulisan data 16bit EEPROM ;===============================
Tulis_SEE16b:
Lcall Siapkan16bAlamatSEE
Jc Wrong_Write
Mov A,DataSEE
Lcall KirimDataSEE
Lcall Buat_StopBit Ret
Wrong_Write1:
Lcall Buat_StopBit
Clr C
Ljmp Tulis_SEE16b
;============================= ;tulis data dari mikro ke EEPROM 16bit ;=============================
Tulis_SEE8b:
Lcall Siapkan8bAlamatSEE
Jc Wrong_Write8b
Mov A,DataSEE
Lcall KirimDataSEE
Jc Wrong_Write8b
Lcall Buat_StopBit
Ret
Wrong_Write8b:
Lcall Buat_StopBit
Clr C
Ljmp Tulis_SEE8b
;============================ ;baca data dari EEPROM oleh Mikro ;============================ Baca_SEE16b:
Lcall Siapkan16bAlamatSEE
Jc Wrong_Read
Lcall Buat_StartBit
Lcall ModeBacaSEE
Jc Wrong_read
Lcall BacaDataSEE
Ret
Wrong_Read:
Lcall Buat_StopBit
Clr C
Ajmp Baca_SEE16b
Baca_SEE8b:
Clr C
Lcall Siapkan8bAlamatSEE
Jc Wrong_Read8b
Lcall ModeBacaSEE
Jc Wrong_read8b
Lcall BacaDataSEE
Ret
Wrong_Read8b:
Lcall Buat_StopBit
Clr C
Ljmp Baca_SEE8b
;=============================
;cek bit ACK untuk pembacaan dan penulisan data ke EEPROM ;=============================
Ambil_Ack:
Clr C
Setb SDA
Setb SCL
Mov C,SDA
Clr SCL
Ret
;=================================== ;pemetaan penulisan alamat data EEPROM ;===================================
KirimDeviceAddress:
Lcall Buat_StartBit
Push Acc
Mov A,R7
Lcall KirimDataSEE
Pop Acc
Ret
Kirim1WordAddress:
Push Acc
Mov A,B
Lcall KirimDataSEE
Pop Acc
Ret
Kirim2WordAddress:
Push Acc
Mov A,R6
Lcall KirimDataSEE
Pop Acc
Ret
BacaDataSEE:
Push B
Clr A
;================================== ;baca data 16 bit dari EEPROM ke mikro
;==================================
LoopBacaSEE16b:
Push B
Rl A
Setb SDA
Setb SCL
Clr C
Mov C,SDA
Mov Acc.0,C
Clr SCL
Pop B
Djnz B,LoopBacaSEE16b
Lcall Ambil_Ack
Lcall Ambil_Ack
Lcall Buat_StopBit
Pop B
Ret
KirimDataSEE: Push B
Mov B,#8
Send8_bitloop:
Rlc A
Mov SDA,C
Lcall Pulse_SEE
Djnz B,Send8_bitloop
Pop B
Clr C
Lcall Ambil_Ack
Ret
;====================================== ;persiapan komunikasi serial antara EEPROM dengan mikro ;======================================
Pulse_SEE:
Push b
Setb SCL
Clr SCL
Pop B
Ret
Buat_StartBit:
Setb SDA
Setb SCL
Clr SDA
Ret
Buat_StopBit:
Clr SDA
Setb SCL
Setb SDA
Clr SCL
Ret PageSEE8bWrite:
Clr F0
Push 05H
Lcall Siapkan8bAlamatSEE
Ajmp PageSEEWrite
PageSEE16bWrite:
Setb F0
Push 05H
Loop2PageSEE16bWrite:
Lcall Siapkan16bAlamatSEE
PageSEEWrite:
Mov A,DataSEE
Lcall KirimDataSEE
;
Jc WrongPWrite
Mov R5,#031
LoopPageSEE16bWrite:
Mov A,DataSEE
Lcall KirimDataSEE
Jc Loop2PageSEE16bWrite
Djnz R5,LoopPageSEE16bWrite
Pop 05H
Lcall Buat_StopBit
Ret
;======================================== ;cek kesalahan penulisan data dari EEPROM ke mikro ;======================================== WrongPWrite:
Pop 05H
Lcall Buat_StopBit
Jb F0,PageSEE16bWrite
Ljmp PageSEE8bWrite
Siapkan16bAlamatSEE:
Lcall KirimDeviceAddress
Jc SalahTulisAlamat
Lcall Kirim1WordAddress
Jc SalahTulisAlamat
Lcall Kirim2WordAddress
Ret Siapkan8bAlamatSEE:
Lcall KirimDeviceAddress
Jc SalahTulisAlamat
Lcall Kirim1WordAddress
Ajmp SalahTulisAlamat
;====================================== ;mode pembacaan dari EEPROM oleh Mikro
;====================================== ModeBacaSEE:
Push Acc ;
Mov A,R7
Setb Acc.0
Mov Slave_AddrSEE,A
Pop Acc
Mov A,Slave_AddrSEE
Lcall KirimDataSEE
Ret DPHSEE8bit:
Mov R7,#0A0H
MOv A,DPH
Anl A,#00000011b
Rl A
Orl A,R7
Mov R7,A
Mov B,DPL
Ret DPTRSEE8bit:
Acall DPHSEE8bit
Acall Baca_SEE8b
Ret DPTRSEE16bit:
Mov R7,#0A0H
Mov B,DPH
Mov R6,DPL
Acall Baca_SEE16b
Ret TulisDPTRSEE8b:
Acall DPHSEE8bit
Acall Tulis_SEE8b
Ret TulisDPTRSEE16b:
Mov R7,#0A0H
Mov B,DPH
Mov R6,DPL
Ret
;============================== ;inisialisasi kontrol CGRAM dan DDRAM LCD ;============================== init_lcd:
mov a,#funcset call write_control mov a,#dispon call write_control mov a,#display_clear call write_control call dlylcd2
mov a,#entrymodset call write_control ret
;*******delay tulis data LCD ************** dlylcd2:
mov r6,#40h dly2:
mov r7,#0 dly3: djnz r7,dly3 djnz r6,dly2 ret
;***********instruksi tulis LCD********** write_control:
clr e_lcd ;e=0 clr rs_lcd ;rs=0 mov p0,a sjmp dlylcd1
;********************* write_data:
clr e_lcd ;e=0 setb rs_lcd ;rs=1 mov p0,a dlylcd1:
setb e_lcd ;e=1 mov r7,#250 djnz r7,$ clr e_lcd ;e=0 ret
;*******penulisan dua baris LCD************** ;line lcd
line2:
line1:
mov a,#80h lineout:
call write_control ret
;**********cetak karakter dari keyboard ke lcd*********** ;tampilan karakter
tampilline2: call line2 sjmp outchar tampilline1: call line1 sjmp outchar tampilcharloop: call write_data inc dptr
outchar: clr a
movc a,@a+dptr jnz tampilcharloop ret
tampilinram: clr a
movc a,@a+dptr jz finish_send mov data_lcd,a call send_lcd inc dptr inc ram_lcd sjmp tampilinram finish_send:
ret
;************kirim data ASCII dari mikro ke LCD********* ;send to add lcd
send_lcd: mov a,#9 clr c
subb a,data_lcd jc sendtoram mov a,data_lcd orl a,#30h mov data_lcd,a sendtoram:
mov a,data_lcd call write_data ret
disp_menu: call init_lcd mov dptr,#text_1 call tampilline1 mov dptr,#text_2 call tampilline2 ret
;--- ; Definisi pemakaian memory ;--- ; =================== ; Awal dari program
; ===================
org 200h
call delay
main: mov bounc,#15
cek_A: jb Tombol_1,main
djnz bounc,cek_A
call print_paket
wt_1: jnb Tombol_1,wt_1
djnz bounc,wt_1
jmp main
;====================== ; Sub Routine Delay
;====================== Delay: mov DL1,#50
Delay1: mov DL2,#0
djnz DL2,$
djnz DL1,Delay1
ret LongDelay:
mov temp,#8
LD4: mov DL1,#0
call delay1
djnz temp,LD4
ret PDelay20:
mov DL1, #100
ajmp PD_Loop
PDelay30:
mov DL1, #150
PD_Loop:
ret
;============================ ; Routine layanan printer.
;============================ ; routine untuk RESET printer
;============================ reset_printer:
clr init
clr selectin
clr strobe
call delay
setb init
setb strobe
setb selectin
call Longdelay
mov A, #27
call cetak_char
mov A, #54
call cetak_char
ret
;==================================== ; Routine cetak dari DPTR ke printer
;==================================== cetak_data:
clr A
movc A,@A+DPTR
jz exitp
call cetak_char
inc dptr
jmp cetak_data
exitp: ret
;--- cetak_char:
jb busy,cetak_char
mov Pdata,A
call PDelay20
clr strobe
call PDelay20
setb strobe
call PDelay30
ret
;============================ ; penghasil signal strobe
;============================ strobe_pulse:
call PDelay20
clr strobe
setb strobe
call PDelay30
ret
;============================ ; Routine mencetak tiket
;============================ print_paket:
; call reset_printer ; EPSON
mov dptr,#ending
call cetak_data
mov dptr,#nomora
call cetak_data
;
akhiran:
mov Pdata,#0Dh
call strobe_pulse
mov Pdata,#0Ah
call strobe_pulse
mov Pdata,#0Dh
call strobe_pulse
mov Pdata,#0Ah
call strobe_pulse
mov dptr,#header
call cetak_data
akhire:
mov dptr,#ending0
call cetak_data
ret
;====================
sjmp $
start2:
call init_LCD
call disp_menu
; sjmp $
mov r5,#20
call sebentar
sjmp $
call init_lcd
jmp forever sebentar:
ret dlybounc:
mov r6,#100 loopb2:
mov r7,#250 loopb1:
nop nop nop
djnz r7,loopb1 djnz r6,loopb2 ret
;
Forever:
JB KbdClock,$ call GetDataKeyboard jnc Forever
acall LCD_Out
clr C
inc r7
mov a,r7
cjne a,#8fh,truske
mov r7,#0c0h
b2: acall write_control mov R7,DataKeyboard acall write_data
clr C
inc r7
mov a,r7
cjne a,#0cfh,b2
clr a
call init_lcd
truske: sjmp Forever ;
LCD_Out:
mov R7, #80h acall write_control mov R7,DataKeyboard acall write_data
ret
;================================== ;Subroutine Get Data From Keyboard
;================================== GetDataKeyboard:
call Get_scancode
JB KbdClock,$ call Get_Scancode Setb C
call Convert_Scancode jnb acc.7, KbChkOK
mov dptr, #TableKeyboard2 ret
;
KbChkOK:
Acall Konversi_Scancode2
mov a, r1
movc a, @a+dptr mov DataKeyboard, a setb c
ret ;
Konversi_ScanCode2:
Mov DPTR,#TableKeyboard2 movc A,@A+DPTR
mov DataKeyboard,A ret
;
Kybd_pressed: Clr C ret ;
Convert_ScanCode:
Mov DPTR,#TableKeyboard movc A,@A+DPTR
mov DataKeyboard,A ret
;
Get_scanCode: clr A
Jnb KbdClock,$ mov R0,#08h Get_ScanCode2:
Jb KbdClock,$ Mov C,KbdData Rr A
mov acc.7,C Jnb KbdClock,$
Djnz R0,Get_ScanCode2 Jb KbdClock,$
Jnb KbdClock,$ ret
;
Printchar:
mov portData,A
jb busy,$
setb strobe
clr strobe
acall delayp
Setb strobe
acall delayp
ret ;
delayp: mov R7,#2
del1: mov R6,#20
DJNZ R6,$
DJNZ R7,del1
ret ;
hs_:
mov DPTR,#Text_2
lagi2: clr A
movc A,@A+DPTR
cjne A,#'0',Print2
sjmp Out2
Print2: call Printchar
inc dptr
call delay
sjmp lagi2
Out2: ret
; Enter:
mov A,#0dh
call printchar
call delay
mov A,#0ah
call printchar
ret ;
Text_1: DB ' Mario '
Text_2: DB ' HS-Comp '
;*************################************** TableKeyboard2:
; Keyboard Scancodes with shift
db 0, 0, 'C', 'X', 'D', 'E', '$', '#', 0, 0, ' ', 'V', 'F', 'T', 'R' db '%', 0, 0, 'N', 'B', 'H', 'G', 'Y', '^', 0, 0, 0, 'M', 'J', 'U', '&' db '*', 0, 0, '<', 'K', 'I', 'O', ')', '(', 0, 0, '>', '?', 'L', ':', 'P' db '_', 0, 0, 0, '"', 0, '{', '+', 0, 0, 0 , 0 , 2 , '}', 0, '|' db 0, 0, 0, 0, 0, 0, 0, 0, 2 , 0, 0, '1', 0, '4', '7', 0, 0, 0, '0' db '.', '2', '5', '6', '8', 2 , 0 , 2 , '+', '3', '-', '*', '9', 0 db 0, 0, 0, 0, 2
;*********************####################************* TableKeyboard:
; Keyboard Scancodes
db 0, 1 , 0, 1 , 1 , 1 , 1 , 1 , 0, 1 , 1 , 1 , 1 , 1 , '~' db 0, 0, 0 , 0 , 0, 0 , 'q', '1', 0, 0, 0, 'z', 's', 'a', 'w', '2' db 0, 0, 'c', 'x', 'd', 'e', '4', '3', 0, 0, ' ', 'v', 'f', 't', 'r' db '5', 0, 0, 'n', 'b', 'h', 'g', 'y', '6', 0, 0, 0, 'm', 'j', 'u', '7' db '8', 0, 0, ',', 'k', 'i', 'o', '0', '9', 0, 0, '.', '/', 'l', ';', 'p' db '-', 0, 0, 0, '', 0, 0, '[','=', 0, 0 , 0 , 09h , 0Ah, ']', 0,'|' db 0, 0, 0, 0, 0, 0, 0, 0, 08h , 0, 0, '1', 0, 11h, '7', 0, 0, 0, '0' db '.', '2', '5', '6', '8', 1 , 0 , 1 , '+', '3', '-', '*', '9', 0
db 0, 0, 0, 0, 1 ;
TableKey: 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 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 '\'
DB 00H,00H,00H,00H,00H,00H,00H,00H DB 08H
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H
DB 0DH DB 00H DB 0FBH
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 0F7H
;
;============================ ; Data area
;============================ header:
DB ' Mario ',0dh,0ah,0dh,0ah
DB 1Bh,'W',02
DB ' --- ',0Dh,0Ah
DB 1Bh,'W',04
DB ' Fakultas Teknologi Industri Dan Informatika ',0Dh,0Ah
DB 1Bh,'W',02
DB ' --- ',0Dh,0Ah
db 0Dh,0Ah,0
nomora: DB 1BH,'W',7,' ',' ','1',' ','4',' ','5',0DH,0AH
DB 1Bh,'W',3
db ' NIP:',0DH,0AH
db 1BH,'W',2,0
ending:db 1BH,'W',2
DB ' --- ',0Dh,0Ah DB ' Mesin Ketik Elektronik ',0Dh,0Ah DB ' Berbasis Microcontroller ',0Dh,0Ah
db 0Dh,0Ah,0 ending0:
DB 0Dh,0Ah,0Dh,0Ah,0Dh,0Ah,0Dh,0Ah,0Dh,0Ah,0Dh,0Ah,0
;
org 60h init_lcd:
mov a,#funcset call controlout mov a,#dispon call controlout mov a,#display_clear call controlout call dlylcd2
mov a,#entrymodset call controlout ret
;********************* dlylcd2:
mov r6,#40h dly2:
mov r7,#0 dly3: djnz r7,dly3 djnz r6,dly2 ret
;********************* ;control out to lcd
controlout: push acc call controllcd pop acc swap a
call controllcd ret
;********************* ;data out to lcd
dataout: push acc call datalcd pop acc swap a call datalcd ret
;********************* controllcd:
clr acc.0 ;rs=0 mov p1,a sjmp dlylcd1
;********************* datalcd:
clr acc.1 ;e=0 setb acc.0 ;rs=1 mov p1,a dlylcd1:
setb p1.1 ;e=1 mov r7,#250 djnz r7,$ clr p1.1 ;e=0 ret
;********************* ;line lcd
line2:
mov a,#0c0h sjmp lineout line1:
mov a,#80h lineout:
call controlout ret
;********************* ;tampilan karakter
tampilline2: call line2 sjmp outchar tampilline1: call line1 sjmp outchar tampilcharloop: call dataout inc dptr outchar: clr a
movc a,@a+dptr jnz tampilcharloop ret
tampilinram: clr a
inc dptr inc ram_lcd sjmp tampilinram finish_send:
ret
;********************* ;set up lcd
setuplcd:
mov a,#03h call controlout mov r5,#2 call sebentar mov a,#02h call controlout mov r5,#1 call sebentar ret
;********************* ;send to add lcd
send_lcd: mov a,#9 clr c
subb a,data_lcd jc sendtoram mov a,data_lcd orl a,#30h mov data_lcd,a sendtoram:
mov a,ram_lcd orl a,#80h call controlout mov a,data_lcd call dataout ret
;********************* ;delay time
sebentar:
call dlybounc djnz r5,sebentar ret
dlybounc:
mov r6,#100 loopb2:
mov r7,#250 loopb1:
nop nop
djnz r7,loopb1 djnz r6,loopb2 ret
;=============================== db ' KETIK ELEKTRIK ',0
text_tanda:
db ' CEK Device-KBD ',0
;============================== Printchar:
mov portData,A
jb busy,$
setb strobe
clr strobe
acall delayprint
Setb strobe
acall delayprint
ret ;
delayprint: mov R7,#2
del1print: mov R6,#20
DJNZ R6,$
DJNZ R7,del1print
ret
cetak_nama:
mov DPTR,#Text_nama1
lagi1: clr A
movc A,@A+DPTR
cjne A,#0,Print1
sjmp Out1
Print1: cjne a,#' ',tr2
mov a,#29h
tr2: call Printchar
inc dptr
call delayprint
sjmp lagi1
Out1: ret
;
cetak_judul:
mov DPTR,#Text_judul
lagi2: clr A
movc A,@A+DPTR
cjne A,#0,Print2
Print2: cjne a,#' ',tr
mov a,#29h
tr: call Printchar
inc dptr
call delayprint
sjmp lagi2
Out2: ret
; Enter:
mov A,#0dh
call printchar
call delayprint
mov A,#0ah
call printchar
ret kertas:
db 'Kertas Error nop',0
tas: db '================',0
batas: mov dptr,#tas
l1: clr A
movc A,@A+DPTR
cjne A,#0,Pr1
sjmp O1
Pr1: cjne a,#'=',jret
mov a,#3dh
jret: call Printchar
inc dptr
call delayprint
jmp l1
O1: ret
;========================= start:
call init_lcd
mov dptr,#text_nama
call tampilline1 mov dptr,#text_judul call tampilline2 mov r5,#20 call sebentar call init_lcd mov dptr,#text_tanda call tampilline1
clr reset_print
mov r5,#20
call sebentar
; mov r0,#0ffh ; mov r1,#0ffh ;
;delay: ;wait for settling time ; djnz r0,$
; djnz r1,delay
jmp cek_intriger
reset:
mov P0,0ffh mov P1,0ffh mov P2,0ffh mov P3,0ffh ;
cek_intriger:
setb IT0 ;ext int edge triggered clr shift ;clear shift flag
mov c_flags,#0 mov bitsave,#0 mov Nbits,#0 mov Nbytes,#0 mov KeyTemp,#0 mov KeyRtn,#0 ;
;* acall LCD_Init ;init LCD
;acall init_lcd
;mov dptr,#ok_msg ;startup msg for LCD ; acall LCD_PutSc
;CALL tampilline2
setb EX0 ;enable external interrrupt 0 setb EA ;enable interrupts
kondisikan_printer_siap:
; mov P0,0ffh
Mov P2,#0FFH ;Set Port 2 sebagai input data printer
; Setb STB ;Set STB sebagai input
; Clr Busy ;Printer sedang tidak sibuk
; Clr PE ;Tidak ada Paper Error
; Setb ACK ;Acknowledge high
clr reset_print
mov r5,#20 call sebentar
setb reset_print
;jb ack,$
;jnb pe,kertas_eror
jmp trus kertas_eror:
call tampilline2
jnb pe,$
;ret
trus: ;acall init_lcd
mov dptr,#ok_msg ;startup msg for LCD ; acall LCD_PutSc
CALL tampilline2
;call batas
;call enter
call cetak_judul
call enter
;call delayprint
;clr busy
mov r5,#20
call sebentar
call cetak_nama
;call enter
;call delayprint
;clr busy
;call batas
call enter
;clr reset_print
;setb reset_print
mov r5,#20
call sebentar
;call init_lcd
mov dptr,#unshifted
test: clr A
movc A,@A+DPTR
cjne a,#0ffh,test1
call enter
sjmp $
test1: call printchar
inc dptr
call delayprint
jmp test
;sjmp start loopit:
mov r1,Nbytes ;get byte count
cjne r1,#1,loopit ;if no char keep looking mov Nbytes,#0 ;reset count
mov a,KeyRtn ;get char cjne a,#08h,chkctrl
;
; handle back space
movx a,@R0 ;get status and dd ram addr clr acc.7 ;turn off busy flag
jz at_start ;if not at start of display dec a ;back up 1 pos
at_start:
mov R2,a ;save in R2
setb acc.7 ;make set dd addr cmd acall LCD_CmdWrite ;set dd ram addr mov a,#20h ;get a blank
acall LCD_DataWrite ;erase current pos mov a,R2 ;get dd ram addr setb acc.7 ;set dd ram addr acall LCD_CmdWrite ;back up sjmp loopit ;get next char chkctrl:
jc loopit ;control char
cjne a,#10h,not_home ;check for home mov a,#2
acall LCD_CmdWrite sjmp loopit
not_home:
cjne a,#19h,lt_space ;rest of low control char sjmp loopit
lt_space:
jc loopit
cjne a,#80h,chk_FKeys ;check function keys chk_FKeys: ;always come here code 80 not used jnc FKeys ;handle function keys
acall LCD_DataWrite ;write char sjmp loopit ;go for next one ;
; function keys are encoded with the high bit on ;
FKeys:
cjne a,#82h,FK1 ;handle F1 cpl cursor_on ;toggle cursor bit sjmp do_cursor
FK1:
jnc loopit ;only F1 and F2 handled cpl blink_on ;toggle blink bit do_cursor:
mov a,#0ch ;display on orl a,c_flags ;set cursor state acall LCD_CmdWrite
sjmp loopit
;
LCD_READ_DATA equ 11b LCD_WRITE_DATA equ 01b
LCD_READ_STS equ 10b ;status read is a comand operation LCD_WRITE_CMD equ 00b
; ;============================================= LCD_PutSc:
clr a
movc a, @a+dptr ; fetch the byte
jz LCD_PutScExit ; exit on End Of String, Nul inc dptr
acall LCD_DataWrite ; display the byte sjmp LCD_PutSc
LCD_PutScExit: ret
;
LCD_PutCmdStr:
clr a ;
movc a, @a+dptr ; fetch the byte
jz LCD_PutCmdExit ; exit on End Of String, Nul inc dptr ;
acall LCD_CmdWrite ; Write the Command sjmp LCD_PutCmdStr ;
LCD_PutCmdExit: ret
;
LCD_DataWrite:
acall LCD_BusyWait ; wait for end of previous cycle mov R0,#LCD_WRITE_DATA ; invoke Write mode movx @R0,a ; send display byte to data port ret
;
LCD_CmdWrite:
acall LCD_BusyWait ; wait for end of previous cycle mov R0,#LCD_WRITE_CMD ; invoke Write mode movx @R0,a ; send command to display ret
;
LCD_BusyWait:
push acc ;save acc
mov R0,#LCD_READ_STS ; goto Read status mode LCD_BusyLoop:
movx a,@R0 ; read data
jb ACC.7,LCD_BusyLoop ; test Busy bit... pop acc ;restore acc
;
LCD_Init:
mov R0,#LCD_WRITE_CMD ; goto Command mode mov a, #034h ; set 8-bit interface mode
movx @R0,a ; Write command acall LCD_BusyWait
mov R0,#LCD_WRITE_CMD ; goto Command mode mov a, #034h ; set 8-bit interface mode
movx @R0,a ; Write command acall LCD_BusyWait
mov R0,#LCD_WRITE_CMD ; goto Command mode mov a, #01h ; Clear display
movx @R0,a ; Write command acall LCD_BusyWait
mov R0,#LCD_WRITE_CMD ; goto Command mode mov a, #06h ; entry mode - incr, no shift
movx @R0,a ; Write command acall LCD_BusyWait
mov R0,#LCD_WRITE_CMD ; goto Command mode mov a, #0ch ; display on, cursor off
movx @R0,a ; Write command ret
;================================= ;
KeyBoard:
push psw mov c,KeyData mov bitsave.7,c push acc mov a,Nbits
cjne a,#1,bit_1 ;if this is second time sjmp nextb ;ignore
bit_1:
jc nextb ;also ignore if first mov a,KeyTemp ;get key in progress rr a ;move old bits right
orl a,bitsave ;or in next bit
mov KeyTemp,a ;store key so far mov a,Nbits
cjne a,#9,nextb ;do we have the whole byte ? mov a,KeyTemp ;get scan code
cjne a,#2ah,notlson ;is it make left shift? setb shift ;yes - set shift
sjmp cleanup notlson:
clr shift ;yes clear shift sjmp cleanup
;
; process key ;
notlsoff:
jb acc.7,cleanup ;break key code - ignore push dph
push dpl
jb shift,shiftlook ;check shift state mov dptr,#unshifted ;get unshifted table sjmp skip
shiftlook:
mov dptr,#shifted ;get shifted table skip:
movc a,@a+dptr ;translate scan code pop dpl
pop dph
cjne a,#0,not0 ;check for unsupported key sjmp cleanup ;skip if unsupported not0:
mov KeyRtn,a ;return char mov Nbytes,#1 ;char to process cleanup:
mov Nbits,#0 ;clear # bits
mov KeyTemp,#0 ;clear temp byte sjmp intdone
nextb:
inc Nbits intdone:
pop acc pop psw reti
unshifted:
db '-' ;scan code 12 db '=' ;scan code 13
db 08h ;scan code 14 - back space db 09h ;scan code 15 - tab
db 'q' ;scan code 16 db 'w' ;scan code 17 db 'e' ;scan code 18 db 'r' ;scan code 19 db 't' ;scan code 20 db 'y' ;scan code 21 db 'u' ;scan code 22 db 'i' ;scan code 23 db 'o' ;scan code 24 db 'p' ;scan code 25 db '[' ;scan code 26 db ']' ;scan code 27
db 0dh ;scan code 28 - return db 0 ;scan code 29 - control db 'a' ;scan code 30
db 's' ;scan code 31 db 'd' ;scan code 32 db 'f' ;scan code 33 db 'g' ;scan code 34 db 'h' ;scan code 35 db 'j' ;scan code 36 db 'k' ;scan code 37 db 'l' ;scan code 38 db ';' ;scan code 39 db "'" ;scan code 40 db '`' ;scan code 41
db 0 ;scan code 42 - left shift db '\' ;scan code 43
db 'z' ;scan code 44 db 'x' ;scan code 45 db 'c' ;scan code 46 db 'v' ;scan code 47 db 'b' ;scan code 48 db 'n' ;scan code 49 db 'm' ;scan code 50 db ',' ;scan code 56 db '.' ;scan code 52 db '/' ;scan code 53
db 0 ;scan code 58 - cap lock db 81h ;scan code 59 - F1 db 82h ;scan code 60 - F2 db 83h ;scan code 61 - F3 db 84h ;scan code 62 - F4 db 85h ;scan code 63 - F5 db 86h ;scan code 64 - F6 db 87h ;scan code 65 - F7 db 88h ;scan code 66 - F8 db 89h ;scan code 67 - F9 db 8ah ;scan code 68 - F10 db 0 ;scan code 69 - num lock db 0 ;scan code 70 - scroll lock db 10h ;scan code 71 - home db 11h ;scan code 72 - up arrow db 12h ;scan code 73 - page up db '-' ;scan code 74
db 13h ;scan code 75 - left arrow db 0 ;scan code 76 - key pad 5 db 14h ;scan code 77 - right arrow db '+' ;scan code 78
db 15h ;scan code 79 - end
db 16h ;scan code 80 - down arrow db 17h ;scan code 81 - page down db 18h ;scan code 82 - ins
db 19h ;scan code 83 - del
db 0ffh
shifted:
db 0 ;scan code 0 not used db 0 ;scan code 1 - esc db '!' ;scan code 2 db '@' ;scan code 3 db '#' ;scan code 4 db '$' ;scan code 5 db '%' ;scan code 6 db '^' ;scan code 7 db '&' ;scan code 8 db '*' ;scan code 9 db '(' ;scan code 10 db ')' ;scan code 11 db '_' ;scan code 12 db '+' ;scan code 13
db 08h ;scan code 14 - back space db 09h ;scan code 15 - tab
db 'E' ;scan code 18 db 'R' ;scan code 19 db 'T' ;scan code 20 db 'Y' ;scan code 21 db 'U' ;scan code 22 db 'I' ;scan code 23 db 'O' ;scan code 24 db 'P' ;scan code 25 db '{' ;scan code 26 db '}' ;scan code 27
db 0dh ;scan code 28 - return db 0 ;scan code 29 - control db 'A' ;scan code 30
db 'S' ;scan code 31 db 'D' ;scan code 32 db 'F' ;scan code 33 db 'G' ;scan code 34 db 'H' ;scan code 35 db 'J' ;scan code 36 db 'K' ;scan code 37 db 'L' ;scan code 38 db ':' ;scan code 39 db '"' ;scan code 40 db '~' ;scan code 41
db 0 ;scan code 42 - left shift db '|' ;scan code 43
db 'Z' ;scan code 44 db 'X' ;scan code 45 db 'C' ;scan code 46 db 'V' ;scan code 47 db 'B' ;scan code 48 db 'N' ;scan code 49 db 'M' ;scan code 50 db '<' ;scan code 56 db '>' ;scan code 52 db '?' ;scan code 53
db 0 ;scan code 54 - right shift db 0 ;scan code 55 - prt scrn db 0 ;scan code 56 - alt db ' ' ;scan code 57
db 0 ;scan code 64 - F6 db 0 ;scan code 65 - F7 db 0 ;scan code 66 - F8 db 0 ;scan code 67 - F9 db 0 ;scan code 68 - F10 db 0 ;scan code 69 - num lock db 0 ;scan code 70 - scroll lock db '7' ;scan code 71 - home db '8' ;scan code 72 - up arrow db '9' ;scan code 73 - page up db '-' ;scan code 74
db '4' ;scan code 75 - left arrow db '5' ;scan code 76 - key pad 5 db '6' ;scan code 77 - right arrow db '+' ;scan code 78
db '1' ;scan code 79 - end
db '2' ;scan code 80 - down arrow db '3' ;scan code 81 - page down db '0' ;scan code 82 - ins
db '.' ;scan code 83 - del