LCD1602的51汇编驱动

 	  ;宏定义
	  LCDIO EQU  P0	  ;LCD数据总线连接P0口
	  RS    EQU  P2.0   ;Register select 连接P2.0
	  RW    EQU  P2.1   ;Read/Write 连接P2.1
	  E     EQU  P2.2	  ;Enable 连接P2.2
	  BF    EQU  P0.7

      ORG 0000H
	  AJMP MAIN
	  ORG 0100H
MAIN: ACALL LCD_INIT

	  MOV A, #80H ;设置写入第一行
	  ACALL W_CMD
	  MOV DPTR, #TAB1
	  MOV R0, #0
LINE1:MOV A, R0
	  MOVC A, @A+DPTR
	  ACALL W_DAT
	  INC R0
	  CJNE R0, #10, LINE1

	  MOV A, #0C0H ;设置写入第二行
	  ACALL W_CMD
	  MOV DPTR, #TAB2
	  MOV R0, #0
LINE2:MOV A, R0
	  MOVC A, @A+DPTR
	  ACALL W_DAT
	  INC R0
	  CJNE R0, #10, LINE2

LOOP: AJMP LOOP 

;**************** LCD1602初始化 *********************
LCD_INIT:
	  MOV A, #01H  ;写入清屏命令 
	  ACALL W_CMD
	  MOV A, #38H  ;设置显示模式16*2显示
	  ACALL W_CMD
	  MOV A, #0CH  ;设置屏幕显示,无光标
	  ACALL W_CMD
	  MOV A, #14   ;设置右移
	  ACALL W_CMD
	  RET
;***************************************************
	  
;**************** LCD1602忙标志 *********************      
	  
WAIT: MOV LCDIO,#0FFH
	  CLR RS
	  SETB RW
	  CLR E
	  NOP
	  SETB E
	  JB BF, WAIT
	  RET
;***************************************************

;***************** 写入命令函数 *********************

W_CMD:MOV LCDIO, A ;把命令写到IO口处
	  CLR RS	   ;0,选择命令寄存器
	  CLR RW
	  SETB E	   ;模拟下降沿,命令写入LCD中
	  NOP
	  CLR E
	  ACALL DELAY  ;延时
	  RET
;***************************************************

;***************** 写入数据函数 *********************

W_DAT:MOV LCDIO, A
	  SETB RS	   ;1,选择数据寄存器
	  CLR RW	   ;0,为写入,置1,为读取
	  SETB E	   ;模拟下降沿
	  NOP 
	  CLR E
	  ACALL DELAY ;延时
	  RET
;***************************************************

;****************** 延时函数 ***********************
DELAY: MOV  R7,#150     
   D1: MOV  R6,#100      
   D2: DJNZ  R6,D2          
       DJNZ  R7,D1          
       RET 
;***************************************************

TAB1: DB '0123456789'
TAB2: DB 'ABCDEFGHIJ'
	  END

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_50303783/article/details/111318693