|
****************************************************************************
; LCD Test Program ( 4 bit INTERFACE )
;----------------------------------------------------------------------------
; Version: 1.0 By P. TECHER
;----------------------------------------------------------------------------
; External compiler used:
; ASM51.EXE, RL51.EXE, OH.EXE
; LST Line model:
; ModelLST=AAAA----------------NNNN-----LLLLLLLLL--
;----------------------------------------------------------------------------
; LCD Connections:
; ---------------
; (RW)R/W = P1.1 D4 = P1.4 D0..D3 = 1
; (DI) DI = P1.3 D5 = P1.5
; (EN) E = P1.2 D6 = P1.6
; D7 = P1.7
;****************************************************************************
; CONST
;****************************************************************************
BEEP equ 2 ; P3.2/INT0
LCDData equ P1
RW BIT P1.1
EN BIT P1.2
DI BIT P1.3
INIT_P1 equ 11110001B
;****************************************************************************
; VARIABLES
;****************************************************************************
DSEG AT 20H
org 40h
Stack: ds 1 ; STACK address
;****************************************************************************
; INTERRUPT VECTOR
;****************************************************************************
CSEG
org RESET
jmp XRESET
org EXTI0
org TIMER0
org EXTI1
org TIMER1
org SINT
org 30H
reti
;****************************************************************************
; ROM Constant
;****************************************************************************
;012345678901234567890
Msg1: db 'LCD 2 Lines X 20 Chr'
eMsg1:
Msg2: db '*** Test program ***'
eMsg2:
;****************************************************************************
; INITIALISATION
;****************************************************************************
XRESET: mov IE,#00 ; INTERRUPT Stopped
clr TR1 ; TIMER 1 = OFF
clr TR0 ; TIMER 0 = OFF
mov PSW,#00 ; PSW = 00
mov SP,#Stack ; PILE after register bank
mov P1,#Init_P1 ; Initialize Port 1
call LCDInit ; LCD INIT
mov DPTR,#Msg1 ; Send 1°Line to the LCD
mov R0,#Low(eMsg1 - Msg1)
clr A
call SendMsg
mov DPTR,#Msg2 ; Send 2°Line to the LCD
mov R0,#Low(eMsg2 - Msg2)
mov A,#040h
call SendMsg
loop: mov A,#50
mov R0,#200
call BeepTone
sjmp loop
;****************************************************************************
; FATAL ERROR
;----------------------------------------------------------------------------
; - FatalLCD : Waiting time too long for BUSY FLAG (sirene)
FtLTEMP: mov R0,#9
Ft_0: djnz R0,Ft_0
ret
FatalLCD: mov A,#20
FtL_0: mov R3,A
setb BEEP
FtL_1: call FtLTEMP
djnz R3,FtL_1
clr BEEP
mov R3,A
FtL_2: call FtLTEMP
djnz R3,FtL_2
inc A
cjne A,#100,FtL_0
jmp FatalLCD
BeepTone: mov R1,A ; ACC = Frequency
setb BEEP ; R0 = Duration
FtB_1: call FtLTEMP ; R1 = used to count
djnz R1,FtB_1
clr BEEP
mov R1,A
FtB_2: call FtLTEMP
djnz R1,FtB_2
djnz R0,BeepTone
ret
;****************************************************************************
; Send a message to the LCD Panel
; - DPTR = Address for ROM message
; - ACC = Address of the first screen character
SendMsg: orl A,#080h ; Define DD Ram ADDRESS
call LCDIWrite
IMsg_1: movx a,@DPTR
call LCDDWrite
inc DPTR
djnz R0,IMsg_1
ret
;****************************************************************************
; LCD Routines, LCDInit
;----------------------------------------------------------------------------
; (RW)R/W = P1.1 D4 = P1.4 D0..D3 = 1
; (DI) DI = P1.3 D5 = P1.5
; (EN) E = P1.2 D6 = P1.6
; D7 = P1.7
Wait772: push ACC
mov A,#02
W772_L: inc a
jnz W772_L
pop ACC
ret
LCDInit:
clr EN ; Disable LCD PANNEL bus
mov R7,#40 ; Wait 40 * 772µS = 31mS
LCDI_0: call Wait772
djnz R7,LCDI_0
mov A,#2Ch ; Function SET (4 BIT mode)
call LCDXWrite
mov R7,#32 ; Wait 32 * 772µS = 25mS
LCDI_1: call Wait772
djnz R7,LCDI_1
mov A,#2Ch ; Function SET (4 BIT mode)
call LCDXWrite
mov R7,#200 ; Wait 2*200µS = 400 µS
LCDI_2: djnz R7,LCDI_2
mov A,#2Ch ; Function SET (4 BIT mode)
call LCDXWrite
mov R7,#200 ; Wait 2*200µS = 400 µS
LCDI_3: djnz R7,LCDI_3
mov R7,#200 ; Wait 2*200µS = 400 µS
LCDI_4: djnz R7,LCDI_4
mov A,#2Ch ; Function SET (4 BIT mode)
call LCDXIWrite
mov A,#08h ; Display OFF
call LCDIWrite
mov A,#01h ; Display CLEAR
call LCDIWrite
mov A,#06h ; Entry MODE
call LCDIWrite
mov A,#0Fh ; Display ON
call LCDIWrite
mov A,#80h ; Memory address = 0
call LCDIWrite
; Ready du write CHARACTERS
ret
;****************************************************************************
; Input/Output a byte from/to the LCD panel
;----------------------------------------------------------------------------
; (RW)R/W = P1.1 - 2 D4 = P1.4 D0..D3 = 1
; (DI) DI = P1.3 - 8 D5 = P1.5
; (EN) E = P1.2 - 4 D6 = P1.6
; D7 = P1.7
;
; LCDIWrite: Write an INSTRUCTION byte to LCD
; LCDXWrite: Write ONLY a 4Bit INSTRUCTION word to LCD
; LCDDWrite: Write a DATA byte to LCD
; LCDDRead : Read a DATA byte from LCD
; LCDIRead : Read BUSY Flag and address counter from LCD
LCDIWrite:
clr EN ; Disable LCD PANNEL bus
push ACC ; WAIT until BUSY Flag = 0
mov R6,#3
mov R7,#00
LCDIWr_0: djnz R7,LCDIWr_1 ; Error If waiting more than 20 ms
djnz R6,LCDIWr_1
jmp FatalLCD
LCDIWr_1: call LCDIRead
jb ACC.7,LCDIWr_0
pop ACC
LCDXIWrite:
mov B,A
anl A,#0F0h ; DI = 0
mov LCDData,A
setb EN
nop
clr EN
mov A,B
swap A
anl A,#0F0h ; DI = 0 / WR = 0 / EN = 0
mov LCDData,A
setb EN
nop
clr EN
ret
LCDXWrite: anl A,#0F0h ; DI = 0 / WR = 0 / EN = 0
mov LCDData,A
setb EN
nop
clr EN
ret
LCDDWrite: push ACC
mov R7,#00
LCDDWr_0: djnz R7,LCDDWr_1 ; Error If waiting more than 10*255 µS
jmp FatalLCD
LCDDWr_1: call LCDIRead
jb ACC.7,LCDDWr_0
pop ACC
mov B,A
anl A,#0F0h ; WR = 0 / EN = 0
orl A,#009h ; DI = 1 & Disable 4051 (H1)
mov LCDData,A
setb EN
mov A,B
clr EN
swap A
anl A,#0F0h
orl A,#009h ; DI = 1 & Disable 4051 (H1)
mov LCDData,A
setb EN
nop
clr EN
ret
LCDDRead: mov LCDData,#0FBh ; DI = 1, RW = 1 & Disable 4051 (H1)
setb EN ; EN = 1
mov A,LCDData
clr EN ; EN = 0
anl A,#0F0h
mov B,A
setb EN
mov A,LCDData
anl A,#0F0h
orl A,B
clr EN
ret
LCDIRead: mov LCDData,#0F3h ; DI = 0, RW = 1 & Disable 4051 (H1)
setb EN ; EN = 1
nop
mov A,LCDData
clr EN ; EN = 0
mov LCDData,#0F3h ; DI = 0, RW = 1 & Disable 4051 (H1)
anl A,#0F0h
mov B,A
setb EN
nop
mov A,LCDData
swap A
anl A,#0Fh
orl A,B
clr EN
ret
;****************************************************************************
end
E-mail: info@telesys.ru