[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Связь по 4-битной шине. По 8-битной будет даже проще.
#include
NAME char_lcd#define XTAL 4000000 ; Hz
#define ms *XTAL/4/1000
#define mks *XTAL/4/1000000#define LCDPort P1OUT_ ; bits <7-4> to LCD D<7-4>
; D<3-0> pulled low in LCD internaly
#define _RS (1<<3) ; bit <3> to LCD RS pin
#define _E (1<<2) ; bit <2> to LCD E pinPUBLIC InitLCD ;void InitLCD(void);
PUBLIC WriteChar ;void WriteChar(char Char);
PUBLIC WriteLCDCommand ;void WriteLCDCommand(char Command);
PUBLIC WriteString ;void WriteString(char *String);
PUBLIC Delay ;void Delay(unsigned int Time);
PUBLIC ClearScreen ;void ClearScreen(void);RSEG CODE
InitLCD:
BIC.B #_RS,&LCDPort
MOV #50 ms,R12
CALL #Delay;assume display can be here in unknown (8-bit or 4-bit) mode
;3 states possible here:
;(1) 8-bit mode
;(2) 4-bit mode waiting for higher nibble
;(3) 4-bit mode waiting for lower nibble
MOV.B #0x30,R12
;data reconized as:
;(1)"set 8-bit mode" command -> DL=8,LINES=1,FONT=5*7
;(2)"set 8-bit mode" command higher nibble (*) -> DL=8
;(3)"dummy", lower nibble of previous command
CALL #OutNibble
MOV #50 ms,R12
CALL #Delay;now states are:
;(1) 8-bit mode
;(2) 4-bit mode waiting for lower nibble
;(3) 4-bit mode waiting for higher nibble
MOV.B #0x30,R12
;(1)"set 8-bit mode" command -> DL=8,LINES=1,FONT=5*7
;(2)lower nibble of (*) command -> LINES=1,FONT=5*7
;(3)"set 8-bit mode" command higher nibble (**) -> DL=8
CALL #OutNibble
MOV #200 mks,R12
CALL #Delay;now states are:
;(1) 8-bit mode
;(2) 8-bit mode
;(3) 4-bit mode waiting for lower nibble
MOV.B #0x30,R12
;(1)"set 8-bit mode" command -> DL=8,LINES=1,FONT=5*7
;(2)"set 8-bit mode" command -> DL=8,LINES=1,FONT=5*7
;(3)lower nibble of (**) command -> LINES=1,FONT=5*7
CALL #OutNibble
MOV #200 mks,R12
CALL #Delay;now states are:
;(1) 8-bit mode
;(2) 8-bit mode
;(3) 8-bit mode
MOV.B #0x20,R12 ; DL=4,LINES=1,FONT=5*7
CALL #OutNibble ; one nible because in 8-bit mode
MOV #40 mks,R12
CALL #Delay;display in 4-bit mode now and requires 2 nibbles per command
MOV.B #0x28,R12 ; DL=4,LINES=2,FONT=5*7
CALL #WriteLCDCommand
MOV.B #0x0C,R12 ; Display On, Cursor Off
CALL #WriteLCDCommand
ClearScreen:
MOV.B #0x01,R12 ;Clear Display, return cursor
CALL #WriteLCDCommand
MOV #1600-40 mks,R12
CALL #Delay
RETOutNibble: ; bits <7-4> of R12
AND.B #0xF0,R12 ; mask low tetrade
AND.B #0x0F,&LCDPort ; clear D<7-4>
BIS.B R12,&LCDPort ; write 4 bits to LCD
BIS.B #_E,&LCDPort
BIC.B #_E,&LCDPort
RETWriteLCDCommand: ; command code in R12
BIC.B #_RS,&LCDPort ; data is a CommandWriteChar: ; char code in R12
; _RS remains high after previous write if WriteChar
PUSH R13
MOV.B R12,R13 ; save lo tetr
call #OutNibble ; high nibble
RLC.B R13
RLC.B R13
RLC.B R13
RLC.B R13
MOV.B R13,R12
CALL #OutNibble ; low nibble
BIS.B #_RS,&LCDPort ; next data is a character
MOV #40 mks,R12
POP R13
Delay: ; Time in R12
NOP ; 1 cycle
ADD #-1,R12 ; 1 cycle
JNE Delay ; 2 cycles
RETWriteString: ; pointer to string in R12
PUSH R13
MOV R12,R13
WriteStrLoop:
MOV.B @R13+,R12
TST.B R12
JEQ WriteStrDone
CALL #WriteChar
JMP WriteStrLoop
WriteStrDone:
POP R13
RETEND
E-mail: info@telesys.ru