⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd8.asm

📁 It is a LCD Program in 8 Bit mode
💻 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 + -