Ответ: скопировал загляни
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Andre8051 25 июня 2003 г. 12:46
В ответ на: Ответ: umps есть пример отправлено Andre8051 25 июня 2003 г. 12:40

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