📄 lcd8.asm
字号:
; Chip P89C51RD2, Crystal 6 MHz,12Clk Mode.
;
;*****************************************************************************
;
$TITLE(PROGRAM FOR 8 BIT LCD, MSEC, HSEC and SEC DELAY)
$DATE(14-10-04)
$MOD51
;
;*****************************************************************************
;
; The LCD Buffer is 16 memory locations (enough for one LCD line).
; To write a line, the characters are put in the buffer and then
; the whole line is written to the LCD.
B0 EQU 070H ;BUFFER POSITION 1
B1 EQU 071H ;
B2 EQU 072H ;
B3 EQU 073H ;
B4 EQU 074H ;
B5 EQU 075H ;
B6 EQU 076H ;
B7 EQU 077H ;
B8 EQU 078H ;
B9 EQU 079H ;
B10 EQU 07AH ;
B11 EQU 07BH ;
B12 EQU 07CH ;
B13 EQU 07DH ;
B14 EQU 07EH ;
B15 EQU 07FH ;BUFFER POSITION 16
;
;*****************************************************************************
;
ORG 00H
AJMP START ;jump to START (first command of program)
;
;*****************************************************************************
;
; INTERRUPTS ;place interrupt routines at appropriate
;memory locations
ORG 03H ;external interrupt 0
RETI
ORG 0BH ;timer 0 interrupt
RETI
ORG 13H ;external interrupt 1
RETI
ORG 1BH ;timer 1 interrupt
RETI
ORG 23H ;serial port interrupt
RETI
ORG 2BH ;locate beginning of rest of program
;
;*****************************************************************************
;
INITIALIZE: ;set up control registers
;
MOV TCON,#00H
MOV TMOD,#00H
MOV PSW,#00H
MOV IE,#00H ;disable interrupts
RET
;
;*****************************************************************************
;
;DELAY ROUTINES
;
;*****************************************************************************
;
MSEC:
MOV R2,#00
LOOP: INC R2
;CJNE R2,#80,LOOP ; Actual it was
;CJNE R2,#39,LOOP
CJNE R2,#19,LOOP
RET
HSEC:
;
MOV R5,#00
MOV R6,#00
LOOPA: INC R6
LOOPB: INC R5
ACALL MSEC
CJNE R5,#248,LOOPB
CJNE R6,#02,LOOPA
RET
SEC:
ACALL HSEC
ACALL HSEC
RET
;
;*****************************************************************************
;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
;GND VCC Adj RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 LED+ LED-/GND
;
;
; LCD Example Program
; Works with P2 as data port, Enable to P1.0, R/W connected to P1.1, RS to P1.2 to LED+
;
;*****************************************************************************
;
WRITELCD:
SETB P1.0 ;enable LCD
ACALL MSEC ;wait for write completion
CLR P1.0 ;disable LCD
RET
;
;*****************************************************************************
;
EXECUTELCD:
CLR P1.2 ;0 for instruction register (when writing),
;1 for Data register (when writing & reading)
;Busy flag & address counter (When reading)
SETB P1.0 ;enable LCD
ACALL MSEC
CLR P1.0
SETB P1.2 ;Make rs=1
RET
;
;*****************************************************************************
;
LCDSETUP:
;
MOV P2,#03CH ;set up LCD 8 bits and 2 lines
ACALL EXECUTELCD
MOV P2,#00DH ;turn on display and cursor off
ACALL EXECUTELCD
MOV P2,#006H ;set increment one and shift
ACALL EXECUTELCD
MOV P2, #02H ; Home Display
ACALL EXECUTELCD
RET
;
;*****************************************************************************
;
CLEARBUFFER: ; uses R0
;
MOV R0,#070H
CBONE:
MOV @R0,#' ' ; put a blank in the memory address specified in R0
INC R0 ; go to next memory address
CJNE R0,#080H,CBONE ; stop when address is 80H
RET
;
;*****************************************************************************
;
WRITEBUFFER: ;uses R0
;
MOV R0,#070H
WBONE:
MOV P2,@R0 ; get character stored in the memory address specified in R0
ACALL WRITELCD
INC R0 ; go to next memory address
CJNE R0,#080H,WBONE ; stop when address is 80H
RET
;
;
;*****************************************************************************
;
LINE1: ;write Line1 to LCD
;
ACALL CLEARBUFFER
MOV B0,#'E'
MOV B1,#'N'
MOV B2,#'G'
MOV B3,#'I'
MOV B4,#'N'
MOV B5,#'E'
MOV B6,#'E'
MOV B7,#'R'
MOV B8,#'I'
MOV B9,#'N'
MOV B10,#'G'
ACALL WRITEBUFFER
RET
;
;***************************************************************************
;
LINE2: ;write Line2 to LCD
;
ACALL CLEARBUFFER
MOV B0,#'C'
MOV B1,#'O'
MOV B2,#'M'
MOV B3,#'P'
MOV B4,#'L'
MOV B5,#'E'
MOV B6,#'X'
MOV B7,#'.'
MOV B8,#'.'
MOV B9,#'.'
MOV B10,#'.'
MOV B11,#'.'
MOV B12,#'.'
MOV B13,#'.'
ACALL WRITEBUFFER
RET
;
;**************************************************************************
;
BEGLINEONE:
;
MOV P2,#080H ;go to beginning of line one
ACALL EXECUTELCD
RET
;
;***************************************************************************
;
BEGLINETWO:
;
MOV P2,#0C0H ;go to beginning of line two
ACALL EXECUTELCD
RET
;
;***************************************************************************
;
CLEARDISPLAY:
;
MOV P2,#001H ;clear display
ACALL EXECUTELCD
ACALL BEGLINEONE ;go to beginning of line one
RET
;
;***************************************************************************
;
;***************************************************************************
;
START: ;beginning of main program
CLR P1.3 ;LCD backlight ON
;
MOV SP,#02FH ;initialize stack pointer to 2FH
ACALL INITIALIZE ;initialize registers
ACALL HSEC
CLR P1.1 ;make LCD R/W low (Stays low since we are just
ACALL LCDSETUP ;writing to LCD) initialize LCD
LCDLOOP:
ACALL CLEARDISPLAY ; erase LCD screen
ACALL HSEC
ACALL BEGLINEONE ; move cursor to beginning of top line
ACALL LINE1
ACALL HSEC
ACALL BEGLINETWO ; move cursor to beginning of bottom line
ACALL LINE2
ACALL HSEC
L1: ;AJMP LCDLOOP ; go to LCDLOOP: (repeat)
SJMP L1
;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -