02.50.0049 Mario Ary Wibowo LAMPIRAN

  LAMPIRAN Perpustakaan Unika

  Perpustakaan Unika

  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

  Perpustakaan Unika

  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 Jc Wrong_Write 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 Perpustakaan Unika 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 Mov B,#08 Perpustakaan Unika

  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 Perpustakaan Unika

  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 Perpustakaan Unika 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 Perpustakaan Unika

  Perpustakaan Unika

  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: mov a,#0c0h

  Perpustakaan Unika

  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,ram_lcd orl a,#80h

  Perpustakaan Unika

  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 ;============================ Perpustakaan Unika 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: call dlybounc djnz r5,sebentar Perpustakaan Unika

  Perpustakaan Unika

  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

  Perpustakaan Unika

  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,$

  Perpustakaan Unika

  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, 2 , 0, 2 , 2 , 2 , 2 , 2 , 0, 2 , 2 , 2 , 2 , 2 , '`'

  Perpustakaan Unika

  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,00H DB 'ZSAW2' DB 00H,00H DB 'CXDE43' DB 00H,00H DB ' VFTR5' DB 00H,00H DB 'NBHGY6'

  Perpustakaan Unika

  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

  Perpustakaan Unika

  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

  Perpustakaan Unika

  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 movc a,@a+dptr jz finish_send mov data_lcd,a

  Perpustakaan Unika

  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:

  Perpustakaan Unika

  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

  Perpustakaan Unika

  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

  Perpustakaan Unika

  ; 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 Perpustakaan Unika

  Perpustakaan Unika

  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

  Perpustakaan Unika

  ; 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

  Perpustakaan Unika

  ; 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:

  Perpustakaan Unika

  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 0 ;scan code 0 not used db 0 ;scan code 1 - esc db '1' ;scan code 2 db '2' ;scan code 3 db '3' ;scan code 4 db '4' ;scan code 5 db '5' ;scan code 6 db '6' ;scan code 7 db '7' ;scan code 8 db '8' ;scan code 9 db '9' ;scan code 10

  Perpustakaan Unika

  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 54 - right shift db '*' ;scan code 55 - prt scrn db 0 ;scan code 56 - alt

  Perpustakaan Unika

  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 'Q' ;scan code 16

  Perpustakaan Unika

  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 58 - cap lock db 0 ;scan code 59 - F1 db 0 ;scan code 60 - F2 db 0 ;scan code 61 - F3 db 0 ;scan code 62 - F4

  Perpustakaan Unika

  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 ; *********** end of keyboard routine and tables *********** end

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika

  Perpustakaan Unika