Inicjalizacja wyświetlacza LCD 2051 ? jak rozwiązać trudności w programowaniu?
Re: Problem z LCD
From: Milosz Skowyra <miloszek_at_nospam_fido.net.org.pl>
Subject: Re: Problem z LCD
Date: Wed, 02 Oct 2002 00:58:48 +0200
AzaZeL wrote:
Witam
mam problem z inicjacją wyswietlacza lcd za pomoca 2051
napisałem taki program
To co ponizej dziala na 100% wiec sprobuj.
;8 BIT LCD DISPLAY ROUTINES
; 1-ST LINE STARTS ADDRES 080h, 2-ND AT ADDRES 0C0h
;LCD CONNECTION:
;ALMOST ALL REGISTERS UNCHANGED, DPTR CHANGED IN SENDING STRING
;P1.0 - DB 0
;P1.1 - DB 1
;P1.2 - DB 2
;P1.3 - DB 3
;P1.4 - DB 4
;P1.5 - DB 5
;P1.6 - DB 6
;P1.7 - DB 7
;P2.6 - EN Level Trigger 1 -> 0
;P2.7 - RS Command - 0 Char - 1
;R/W - GND
EN EQU P2.6
RS EQU P2.7
LCD_PORT EQU P0
D_D_ON EQU 00001100b ;display on
D_D_OFF EQU 00001000b ;display off
D_C_ON EQU 00001010b ;cursor on
D_C_OFF EQU 00001000b ;cursor off
D_B_ON EQU 00001001b ;blink on (blinking solid box)
D_B_OFF EQU 00001000b ;blink off (solid underscore)
;=============================================================================
; ALL COMMANDS EXCEPT BUSY CHECK, PARAMETER IN ACC
; CHANGES LCD_PORT, AND ACC
LCD_SEND_COMMAND: MOV LCD_PORT,A
SETB EN
CLR EN
ACALL LCD_DELAY_SHORT
RET
;=============================================================================
; DISPLAY NUMBER 8 BIT, NUMBER IN ACC, DO NOT CHANGE ANY REGS, EXCEPT
ACC
;=============================================================================
LCD_SEND_NUMBER: PUSH PSW
PUSH B
PUSH ACC
MOV B,#100
DIV AB
JZ LCD_SEND_NUMBER_1
ADD A,#30H
ACALL LCD_SEND_ASCII
LCD_SEND_NUMBER_1:
MOV A,B
MOV B,#10
DIV AB
JZ LCD_SEND_NUMBER_2
ADD A,#30H
ACALL LCD_SEND_ASCII
LCD_SEND_NUMBER_2:
MOV A,B
ADD A,#30H
ACALL LCD_SEND_ASCII
POP ACC
POP B
POP PSW
RET
;=============================================================================
; DISPLAY NUMBER IN BCD FORMAT, NUMBER IN ACC, DO NOT CHANGE ANY REGS,
EXCEPT ACC
;=============================================================================
LCD_SEND_NUMBER_BCD:
PUSH ACC
PUSH ACC
SWAP A
ANL A,#00001111b
LCALL LCD_SEND_NUMBER
POP ACC
ANL A,#00001111b
LCALL LCD_SEND_NUMBER
POP ACC
RET
;=============================================================================
; DISPLAY CHARACTER IN ACC
LCD_SEND_ASCII: MOV LCD_PORT,A
SETB RS
SETB EN
CLR EN
CLR RS
ACALL LCD_DELAY_SHORT
RET
;=============================================================================
; CLEAR DISPLAY AND SET DD_ADDRES TO 1 LINE
LCD_CLEAR: PUSH ACC
MOV A,#1
ACALL LCD_SEND_COMMAND
ACALL LCD_DELAY_LONG
POP ACC
RET
;=============================================================================
LCD_1_LINE: PUSH ACC
MOV A,#080H
ACALL LCD_SEND_COMMAND
POP ACC
RET
;=============================================================================
LCD_2_LINE: PUSH ACC
MOV A,#0C0H
ACALL LCD_SEND_COMMAND
POP ACC
RET
;=============================================================================
LCD_INIT: CLR RS
MOV LCD_PORT,#0
ACALL LCD_DELAY_LONG ; INIT 8 BIT
MOV LCD_PORT,#00110000B
SETB EN
CLR EN
ACALL LCD_DELAY_LONG
MOV LCD_PORT,#00110000B ; INIT 8 BIT
SETB EN
CLR EN
ACALL LCD_DELAY_SHORT
MOV LCD_PORT,#00110000B ; INIT 8 BIT
SETB EN
CLR EN
ACALL LCD_DELAY_LONG
MOV LCD_PORT,#00111100B ;8 BIT, 2 LINES, 5X8 ARRAY
SETB EN
CLR EN
ACALL LCD_DELAY_SHORT
MOV LCD_PORT,#00010100B ; CURSOR MOVE, SHIFT RIGHT
SETB EN
CLR EN
ACALL LCD_DELAY_SHORT
MOV LCD_PORT,#(D_D_ON OR D_C_ON OR D_B_ON) ; DISPLAY ON, CURSOR ON,
BLINK ON
SETB EN
CLR EN
ACALL LCD_DELAY_SHORT
RET
;=============================================================================
; 4 x 210 x 2 x 750 ns = 1.26 ms
LCD_DELAY_LONG: PUSH 01
PUSH 02
MOV 01,#7
LCD_DEL_JMP: MOV 02,#250
DJNZ 02,$
DJNZ 01,LCD_DEL_JMP
POP 02
POP 01
RET
;=============================================================================
; 40 x 2 x 250ns = 60us
LCD_DELAY_SHORT: PUSH 02
MOV 02,#80
DJNZ 02,$
POP 02
RET
;=============================================================================
; SENDS STRING TO LCD, STRING MUST BE FINISHED WITH CHR(16)
; DPTR MUST POINT TO BEGINING OF TEXT.
;=============================================================================
LCD_SEND_STRING: PUSH ACC
LCD_SEND_STRING_LOOP: CLR A
MOVC A,_at_nospam_A+DPTR
CJNE A,#16,LCD_SEND_STRING_CONT
POP ACC
RET
LCD_SEND_STRING_CONT: LCALL LCD_SEND_ASCII
INC DPTR
SJMP LCD_SEND_STRING_LOOP
;=============================================================================
LCD_SHIFT_LEFT: PUSH ACC
MOV A,#00011000B
LCALL LCD_SEND_COMMAND
POP ACC
RET
--
Regards. Przy odpowiedzi usun "." przed "net" z adresu!!!
|-----------------------------------------------------|
| Milosz Skowyra GSM Mobile +48 600 95 35 72 |
| miloszek_at_nospam_fido.net.org.pl 2:484/2.47 on fidonet |
|-----------------------------------------------------|
Dzisiaj slonce nie wzejdzie, bo za zimno.