Atmel AT89C2051 LCD sample project
نمونه در ادامه مطلب.
Atmel AT89C2051 LCD sample project
This shows how to interface an Hitachi 2×16 LCD display to a 2051. To minimise the usage of processor pins the LCD will be driven in 4 bit mode.
LCD project running sample program.
LCD mounted on a 1 inch prototype board. A DT004 is used as a mother board and a DT104 is used as the processor board.
Circuit of the Simmbus to LCD interface
Mounting of the LCD 14 pin single inline header connector to a Dontronics 1 inch prototype board. The connections from the LCD connector to the Simmbus is done on the back of the board.
The pot is for LCD contrast.
Back view showing jumpers.
Sample program used to get the display shown above in the photos.
;Written by Peter Averill
;LCD demo program
;
$mod2051
CR EQU 0dh ; carriage return
LF EQU 0ah ; line feed
;lcd equates
rs equ p1.2
en equ p1.3
db4 equ p1.4
db5 equ p1.5
db6 equ p1.6
db7 equ p1.7
count equ r0
datcom bit 0
DSEG AT 0020H
ORG 0030H ; stack origin
stack: DS 20H ; stack depth
;
CSEG
ORG 0000H ; power on/reset vector
Jmp cold_start
ORG 0003H ; external interrupt 0 vector
Reti ; undefined
ORG 000BH ; timer 0 overflow vector
reti
ORG 0013H ; external interrupt 1 vector
Reti ; undefined
ORG 001BH ; timer 1 overflow vector
reti ; undefined
ORG 0023H ; serial I/O interrupt vector
reti
;
ORG 40H ; begin constant data space
setup: DB 033h,032h,028h,00eh
db 002h,001h,0ffh
mess: db 'Victoria Uni',0ffh
mess1: db 'Electronics',0ffh
;
;
USING 0 ; register bank zero
cold_start:
mov sp, #(stack-1) ; initialize stack pointer
mov a,#0ffh
call delay_ms
clr datcom ;send commands
mov dptr, #setup ;lcd setup string
call send_string
setb datcom ;send data
mov dptr, #mess
call send_string
mov a,#0c0h ;select second row of lcd
clr datcom ;send command
call send_char
mov dptr, #mess1
setb datcom ;send data
call send_string
repeat:
jmp repeat
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
send_string:
; Transmit string pointed to by DPTR.
; String may be of any length, but must be null-terminated.
Push acc
push dpl
push dph
ss1:
clr a
movc a, @a+dptr ; get character
inc a
jz ss2 ; check for terminator
dec a
call send_char ; send character
inc dptr ; point to next character
jmp ss1
ss2:
pop dph
pop dpl
pop acc
ret
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
send_char: mov c,datcom
mov rs,c
clr en
mov c,acc.4
mov db4,c
mov c,acc.5
mov db5,c
mov c,acc.6
mov db6,c
mov c,acc.7
mov db7,c
setb en
clr en
push acc
mov a,#4h
call delay_ms
pop acc
mov c,acc.0
mov db4,c
mov c,acc.1
mov db5,c
mov c,acc.2
mov db6,c
mov c,acc.3
mov db7,c
setb en
clr en
mov a,#4h
call delay_ms
ret
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay_ms:
; Delay for one mS times the value in the accumulator.
Push acc
push b
mov b, #0
dd:
djnz b, $ ; 500 uS @ 12 MHz
djnz b, $ ; 500 uS @ 12 MHz
djnz acc, dd
pop b
pop acc
ret
;
end





