$modxx51 ;rizeni LCD s radicem KS0108 (S6B0108) pro krystal 12MHz max. E equ P3.2 RS equ P3.3 CS1 equ P3.4 CS2 equ P3.5 RW equ P3.7 ;data equ P1 bseg at 20h Xdir: dbit 1 Ydir: dbit 1 cseg mov P1,#255 mov P3,#255 mov sp,#30h ;vyvody do spravnych urovni clr E ;cekani na dokonceni interniho resetu setb RW clr RS CekejNaReset: nop setb E nop mov a,P1 clr E jb acc.4,CekejNaReset jb acc.7,CekejNaReset clr RW ;inicializace CS1 i CS2 v log.1, takze pro obe poloviny LCD mov a,#00111111b ;zapni LCD acall PosliInstr mov a,#01000000b ;nastav sloupec na 0 (0-63) acall PosliInstr mov a,#10111010b ;nastav stranku (osmici bitu) na 2 (0-7) acall PosliInstr mov a,#11000000b ;nastav pocatecni radek na 0 (0-63) acall PosliInstr ;prace s levou casti LCD clr CS2 setb CS1 ;vypis zkusebni text z tabulky Tab1 mov dptr,#Tab1 acall Vypisuj mov R2,#10 ;2s zpozdeni acall Delay1 ;prace s pravou polovinou LCD clr CS1 setb CS2 ;nastavit 6. radek mov a,#10111101b ;nastav stranku na 4 acall PosliInstr ;vypis zkusebni text z tabulky Tab2 mov dptr,#Tab2 acall Vypisuj mov R2,#10 ;2s zpozdeni acall Delay1 ;prace s pravou i levou casti LCD setb CS1 setb CS2 ;scrolovat obsah LCD mov R7,#63 ;posun vrchniho radku Scroluj: mov a,#11000000b orl a,R7 acall PosliInstr ;posli novy posun mov R2,#1 acall Delay1 ;zpozdeni 0.13s djnz R7,Scroluj ;krok 1 pixel mov a,#11000000b ;na pocatecni pozici (0) acall PosliInstr mov R2,#10 ;zpozdeni 2s acall Delay1 ;smazat LCD mov a,#01000000b ;sloupec na 0 acall PosliInstr mov R7,#0 ;cislo stranky DalsiStranka: mov a,#10111000b orl a,R7 acall PosliInstr ;nastav stranku podle R7 mov R6,#64 ;64 sloupcu mov a,#0 ;data - 0 PosilejNic: acall PosliData djnz R6,PosilejNic inc R7 cjne R7,#8,DalsiStranka ;8 stranek mov R2,#10 ;2s pauza acall Delay1 ;ukazka cteni dat mov R6,#10 ;ukazatel souradnic v X mov R7,#0 ;ukazatel souradnic v Y setb Xdir ;pricitani (pohyb bodu vpravo) setb Ydir ;pricitani (pohyb bodu dolu) Cyklit: acall NastPosLCD ;nastavi stranku, sloupec, CS1, CS2 a datovy byte do R3 podle X a Y ;nacteni bytu z LCD setb RW setb RS mov P1,#255 nop nop ;dvojity pulz na E setb E nop nop clr E nop nop setb E nop nop mov R2,P1 ;nacteni bytu z LCD clr E clr RW acall NastPosLCD ;nastavi stranku, sloupec, CS1, CS2 a datovy byte do R3 podle X a Y mov a,R2 orl a,R3 ;byte z LCD OR datovy byte acall PosliData ;pohyb bodu ;nejdriv X jnb Xdir,Vlevo inc R6 cjne R6,#121,XdirOk ;kdyz je bod na kraji LCD (omezeni na 126) cpl Xdir ;zmen smer jmp XdirOk Vlevo: dec R6 cjne R6,#0,XdirOk ;kdyz je bod na kraji LCD cpl Xdir ;zmen smer XdirOk: ;ted pro Y jnb Ydir,Nahoru inc R7 cjne R7,#63,YdirOk ;kdyz je bod na kraji LCD cpl Ydir ;zmen smer jmp YdirOk Nahoru: dec R7 cjne R7,#0,YdirOk ;kdyz je bod na kraji LCD cpl Ydir ;zmen smer YdirOk: acall Delay2 ;zpozdeni jmp Cyklit ;cyklit ;nastavi stranku a sloupec podle R6 a R7 NastPosLCD: ;CS1 a CS2 mov a,R6 setb CS1 clr CS2 jnb acc.6,CSxOk setb CS2 clr CS1 CSxOk: ;ted souradnice X anl a,#00111111b orl a,#01000000b acall PosliInstr ;ted stranku mov a,R7 mov R5,a mov R4,#0 ;stranka Dalsich8pix: mov a,R5 clr c subb a,#8 ;odecist 8 pixelu jc StrankaOk mov R5,a inc R4 ;dalsi stranka jmp Dalsich8pix StrankaOk: inc R5 mov a,#10000000b RotData: rl a djnz R5,RotData mov R3,a ;datovy byte pro LCD mov a,R4 orl a,#10111000b ;nastav stranku acall PosliInstr ret ;zpozdeni R2*(asi 132000) SC Delay1: mov R1,#0 mov R0,#0 djnz R0,$ djnz R1,$-4 djnz R2,Delay1 ret ;zpozdeni Delay2: mov R1,#8 mov R0,#0 djnz R0,$ djnz R1,$-4 ret ;posila byty z tabulky na LCD Vypisuj: mov R6,#64 ;64 sloupcu mov R7,#0 ;ukazatel v tabulce PisZtab: mov a,R7 movc a,@a+dptr acall PosliData inc R7 djnz R6,PisZtab ret ;posle instrukci na LCD PosliInstr: clr RS mov P1,a nop setb E nop clr E ;cekat na busy=0 mov P1,#255 setb RW PosliInstrB: nop setb E nop mov a,P1 clr E jb acc.7,PosliInstrB clr RW ret ;posle data byte na LCD PosliData: setb RS mov P1,a nop setb E nop clr E ret ;'LCD 128x64' Tab1: db 01111111b ;L db 01000000b db 01000000b db 01000000b db 01000000b db 0 db 00111110b ;C db 01000001b db 01000001b db 01000001b db 00100010b db 0 db 01111111b ;D db 01000001b db 01000001b db 01000001b db 00111110b db 0 db 00000000b ; db 00000000b db 00000000b db 00000000b db 00000000b db 0 db 00000000b ;1 db 01000010b db 01111111b db 01000000b db 00000000b db 0 db 01000010b ;2 db 01100001b db 01010001b db 01001001b db 01000110b db 0 db 00110110b ;8 db 01001001b db 01001001b db 01001001b db 00110110b db 0 db 00000000b ;x db 00010100b db 00001000b db 00010100b db 00000000b db 0 db 00111110b ;6 db 01001001b db 01001001b db 01001001b db 00110010b db 0 db 00011000b ;4 db 00010100b db 00010010b db 01111111b db 00010000b db 0,0,0,0,0 ;do konce radku ;' KS0107' Tab2: db 00000000b ; db 00000000b db 00000000b db 00000000b db 00000000b db 0 db 01111111b ;K db 00001000b db 00010100b db 00100010b db 01000001b db 0 db 01000110b ;S db 01001001b db 01001001b db 01001001b db 00110001b db 0 db 00111110b ;0 db 01010001b db 01001001b db 01000101b db 00111110b db 0 db 00000000b ;1 db 01000010b db 01111111b db 01000000b db 00000000b db 0 db 00111110b ;0 db 01010001b db 01001001b db 01000101b db 00111110b db 0 db 00000011b ;7 db 00000001b db 01110001b db 00001001b db 00000111b db 0 db 0,0,0,0,0 ;do konce radku db 0 db 0,0,0,0,0 db 0 db 0,0,0,0,0 db 0,0,0,0,0 end