?? disp4.asm
字號:
; Ctyrbitove ovladani dvouradkoveho displeje pro procesory x51;; ; Popis pripojeni displeje;; ; K portu P1 je ctyrbitove pripojen dvouradkovy LCD displej takto:; P1.4 az P1.7 ... D4 az D7 displeje,; P1.1 ... RS; P1.2 ... RW; P1.3 ... E; -------------------------- EQU pro hardware --------------------------------- .equ disp, 0x90 ;Port 1 .equ RS, 0x91 ;P1.1 ;Instrukce/data displeje .equ RW, 0x92 ;P1.2 ;Read/write displeje .equ E, 0x93 ;P1.3 ;Enable displeje .equ ST, 0x97 ;P1.7 ;status displeje;PROCEDURY PRO DISPLEJ.global d_inst, d_data, d_clr, d_home, d_read, d_init .bitcomm flag_disp, 1 ;display init .text; ----------------------- Cekani na ready stav displeje -----------------------d_wait: ;cekani na bussy flag displeje mov disp,#0xf4 ;nastaveni cteni a nahozeni bitu dat clr await_znovu: setb E jnb ST,dumy ;uz to spadlo? clr E ;vynulovani E setb E ; Pulz E na displej clr E ;dumy cyklus (4 bit) djnz acc,wait_znovu ; timeout !!!dumy: setb E ; Pulz E na displej ;dumy cyklus (4 bit) clr E ;vynulovani E ret ; ------------------------ Vyslani dat na displej -----------------------------; Data nebo instrukce se daji do R7 a zavola se tahle rutinka; ----- Instrukce -----d_inst: push acc push psw clr c ;jedna se o instrukci sjmp d_send ;vlastni zapisy na displej; ----- Data -----d_data: push acc push psw setb c; ----- Vlastni zapis ----- d_send: lcall d_wait mov a,#0b11110000 ;priprava masky anl a,r7 ;prevzeti a vymaskovani instrukce z R7 mov disp,a ;vystaveni dat mov RS,c setb E ; Pulz E na displej ;zapis pulzem na E clr E ;vynulovani E mov a,#0b00001111 ;priprava masky anl a,r7 ;prevzeti a vymaskovani instrukce z R7 swap a ;prehozeni niblu mov disp,a ;vystaveni dat mov RS,c setb E ; Pulz E na displej ;zapis pulzem na E clr E ;vynulovani E pop psw pop acc ret; ----------------------------- Cursor home -----------------------------------d_home: mov r7,#0b00000010 sjmp d_inst ; ---------------------------- Display clear ----------------------------------d_clr: mov r7,#0b00000001 ;Clear Home sjmp d_inst; ------------------------------- Readout displeje ----------------------------d_read: lcall d_wait setb RS ; read data setb E ; Pulz E na displej mov a,disp clr E ;vynulovani E anl a,#0xF0 mov r7,a setb E ; Pulz E na displej mov a,disp clr E ;vynulovani E swap a ;prehozeni niblu anl a,#0x0F orl a,r7done: ret; ------------------------------- Oziveni displeje ----------------------------d_init: jb flag_disp, done setb flag_disp clr E ;E dolu mov a,#7 ;10 ms minL1: lcall plongpause ;1.6 ms djnz Acc,L1 ;cekani (jeste nefunguje BUSY flag) mov disp,#0b00110000;Prvni zapis setb E ; Pulz E na displej clr E ;vynulovani E mov a,#3 ;4.1 ms minL2: lcall plongpause ;1.6 ms djnz Acc,L2 ;cekani (jeste nefunguje BUSY flag); mov disp,#0b00110000 setb E ; Pulz E na displej ;odeslani dat clr E ;vynulovani E mov a,#0 ;100 us min djnz Acc,. ;cekani (jeste nefunguje BUSY flag); mov disp,#0b00110000 setb E ; Pulz E na displej ;odeslani dat clr E ;vynulovani E mov a,#0 ;100 us min djnz Acc,. ;cekani (128 us @ 48 MHz) mov disp,#0b00100000;4bitovy interface setb E ; Pulz E na displej ;odeslani dat clr E ;vynulovani E; .................... Odtud uz se pouziva BUSY flag displeje ................. mov r7,#0b00101000 ;4Bit, 2radkovy, 5*7 lcall d_inst mov r7,#0b00001000 ;Display off lcall d_inst mov r7,#0b00001100 ;Display on, cursor on, blink off lcall d_inst mov r7,#0b00000110 ;Entry mode increment, no shift lcall d_inst ljmp d_clr ;Clear displeje; A tady uz je displej Vas a pomoci call d_inst nebo call d_data mu muzete ; posilat veskera Vase prani. ;; END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -