📄 lcd.asm
字号:
;LCD引脚定义
LCM_RS EQU P2.0
LCM_EN EQU P2.2
LCM_DATA EQU P0
;作者:刘玉宏
;...........................................
;变量定义
RCAP_BUF0_H EQU 08H
RCAP_BUF0_L EQU 09H
RCAP_BUF1_H EQU 0AH
RCAP_BUF1_L EQU 0BH
FRQ_H EQU 0CH
FRQ_L EQU 0DH
DISBUF0 EQU 0EH
DISBUF1 EQU 0FH
;位定义
FLAG EQU 20H
RCAP_END_FG EQU FLAG.0
RCAP_FULL_FG EQU FLAG.1
CF_END_FG EQU FLAG.2
;------------------------------------------
T2CON DATA 0C8H
RCAP2L DATA 0CAH
RCAP2H DATA 0CBH
TL2 DATA 0CCH
TH2 DATA 0CDH
TF2 BIT 0CFH
EXF2 BIT 0CEH
RCLK BIT 0CDH
TCLK BIT 0CCH
EXEN2 BIT 0CBH
TR2 BIT 0CAH
C_T2 BIT 0C9H
CP_RL2 BIT 0C8H
;作者:刘玉宏
;以下是主程序开始
ORG 0000H
AJMP START ;转主程序
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
ORG 0023H
RETI
ORG 002BH
RETI
;-------------------------------------------
ORG 0030H
START: MOV SP,#60H
;...........................................
CLR LCM_EN ;LCD_EN初始状态0
LCALL INIT_LCD ;初始化LCD
MOV R5,#10 ;延时等待
LCALL DELAY
;...........................................
MOV A,#0 ;0行
MOV B,#0 ;0列
MOV DPTR,#TITLE ;字符串
LCALL LCD_PRN_STR ;显示字符串"89c51 R TEST"
MOV A,#1 ;1行
MOV B,#0 ;0列
MOV DPTR,#R_INFO ;字符串
LCALL LCD_PRN_STR ;显示字符串 "R="
SJMP $
;...........................................
;初始化LCD
;功能设定指令
;;作者:刘玉宏
;┌──────┬─────────────────────────────┬───┐
;ㄧ ㄧ 指令编码 ㄧ 执行 ㄧ
;ㄧ 指令功能 ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├──────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼───┤
;ㄧ 功能设定 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 1 ㄧ DL ㄧ N ㄧ F ㄧ X ㄧ X ㄧ 40 ㄧ
;└──────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┘
;功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下:
; 位名 设置
; DL 0=数据总线为4位 1=数据总线为8位
; N 0=显示1行 1=显示2行
; F 0=5×7点阵/每字符 1=5×10点阵/每字符
;显示开关控制指令
;┌──────┬─────────────────────────────┬───┐
;ㄧ ㄧ 指令编码 ㄧ 执行 ㄧ
;ㄧ 指令功能 ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├──────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼───┤
;ㄧ显示开关控制ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 1 ㄧ D ㄧ C ㄧ B ㄧ 40 ㄧ
;└──────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┘
;功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下:
; 位名 设置
; D 0=显示功能关 1=显示功能开
; C 0=无光标 1=有光标
; B 0=光标闪烁 1=光标不闪烁
;设定显示屏或光标移动方向指令
;
;┌──────┬─────────────────────────────┬───┐
;ㄧ ㄧ 指令编码 ㄧ 执行 ㄧ
;ㄧ 指令功能 ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├──────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼───┤
;ㄧ设定显示屏或ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 1 ㄧS/C ㄧR/L ㄧ X ㄧ X ㄧ 40 ㄧ
;ㄧ光标移动方向ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ
;└──────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┘
;功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下:
; S/C R/L 设定情况
; 0 0 光标左移1格,且AC值减1
; 0 1 光标右移1格,且AC值加1
; 1 0 显示器上字符全部左移一格,但光标不动
; 1 1 显示器上字符全部右移一格,但光标不动
;清屏指令
;
;┌──────┬─────────────────────────────┬───┐
;ㄧ ㄧ 指令编码 ㄧ 执行 ㄧ
;ㄧ 指令功能 ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /ms ㄧ
;├──────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼───┤
;ㄧ 清屏 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 0 ㄧ 1 ㄧ 1.64 ㄧ
;└──────┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴───┘
;功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入"空白"的ASCII码20H;
; <2> 光标归位,即将光标撤回液晶显示屏的左上方;
; <3> 将地址计数器(AC)的值设为0。
INIT_LCD:
MOV LCM_DATA,#30H ;4位I/O初始化
LCALL EN ;写动作
MOV R5,#2 ;延时等待
LCALL DELAY
;作者:刘玉宏
MOV LCM_DATA,#30H ;4位I/O初始化
LCALL EN ;写动作
MOV R5,#2 ;延时等待
LCALL DELAY
MOV LCM_DATA,#30H ;4位I/O初始化
LCALL EN ;写动作
MOV R5,#2 ;延时等待
LCALL DELAY
;作者:刘玉宏
MOV LCM_DATA,#20H ;4位I/O初始化
LCALL EN ;写动作
MOV R5,#2 ;延时等待
LCALL DELAY
MOV A,#28H
LCALL WCOM
MOV R5,#1 ;延时等待;作者:刘玉宏
LCALL DELAY
MOV A,#0CH
LCALL WCOM
MOV R5,#1 ;延时等待;作者:刘玉宏
LCALL DELAY
MOV A,#01H ;显示清屏
LCALL WCOM
MOV R5,#1 ;延时等待
LCALL DELAY
RET
;-----------------------------------------------------------------
;产生下降沿用于写命令;作者:刘玉宏
EN:
SETB LCM_EN
LCALL DE
CLR LCM_EN
LCALL DE
RET
;-----------------------------------------------------------------
DE:
MOV R7,#10
DJNZ R7,$
RET
;-----------------------------------------------------------------
;写命令
;参数传递A;作者:刘玉宏
WCOM:
PUSH B
MOV B,A ;A暂存
ANL A,#0F0H ;清除低4位,保持LCD_EN为0
MOV LCM_DATA,A;写高4位
CLR LCM_RS ;写命令LCM_RS=0
LCALL EN ;写动作
MOV A,B ;取出保存的参数
RLC A
RLC A
RLC A
RLC A ;4位方式先写高4位,再写低4位
ANL A,#0F0H ;清除低4位,保持LCD_EN为0
MOV LCM_DATA,A
CLR LCM_RS ;写命令LCM_RS=0
LCALL EN ;写动作
POP B
RET;作者:刘玉宏
;--------------------------------------------------------------------
;-----------------------------------------------------------------
;写数据
;参数传递A
WDATA:
PUSH B
MOV B,A ;A暂存
ANL A,#0F0H ;清除低4位,保持LCD_EN为0
MOV LCM_DATA,A
SETB LCM_RS ;写数据LCM_RS=1
LCALL EN ;写动作
MOV A,B ;取出保存的参数
RLC A
RLC A
RLC A
RLC A ;4位方式先写高4位,再写低4位
ANL A,#0F0H ;清除低4位,保持LCD_EN为0
MOV LCM_DATA,A
SETB LCM_RS ;写数据LCM_RS=1
LCALL EN ;写动作
POP B;作者:刘玉宏
RET
;--------------------------------------------------------------------
;延时R5*10MS
DELAY:
MOV R6,#50
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;--------------------------------------------------------------------
;在第0行指定位置显示字符
;参数A显示字符的ascii码,B显示的位置
LCDP0:
PUSH ACC
MOV A,B
;设定DDRAM地址指令
;
;┌──────┬─────────────────────────────┬───┐
;ㄧ ㄧ 指令编码 ㄧ 执行 ㄧ
;ㄧ 指令功能 ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├──────┼──┼──┼──┼──┴──┴──┴──┴──┴──┴──┼───┤
;ㄧ设定CGRAM ㄧ 0 ㄧ 0 ㄧ 1 ㄧ DDRAM的地址(7位) ㄧ 40 ㄧ
;ㄧ 地址 ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ
;└──────┴──┴──┴──┴────────────────────┴───┘
;功能:设定下一个要存入数据的CGRAM的地址。
;DDRAM地址与显示位置的对应关系;作者:刘玉宏
;
;╭┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
;┊ ┊
;┊00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH ┊
;┊ ┊
;┊40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH ┊
;┊ ┊
;╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
ADD A,#80H ;第一行地址
LCALL WCOM
POP ACC ;数据
LCALL WDATA
RET
;--------------------------------------------------------------------
;在第1行指定位置显示字符
;参数A显示字符的ascii码,B显示的位置
LCDP1:
PUSH ACC
MOV A,B
;设定DDRAM地址指令
;
;┌──────┬─────────────────────────────┬───┐
;ㄧ ㄧ 指令编码 ㄧ 执行 ㄧ
;ㄧ 指令功能 ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┤ 时间 ㄧ
;ㄧ ㄧ RS ㄧR/W ㄧDB7 ㄧDB6 ㄧDB5 ㄧDB4 ㄧDB3 ㄧDB2 ㄧDB1 ㄧDB0 ㄧ /us ㄧ
;├──────┼──┼──┼──┼──┴──┴──┴──┴──┴──┴──┼───┤
;ㄧ设定CGRAM ㄧ 0 ㄧ 0 ㄧ 1 ㄧ DDRAM的地址(7位) ㄧ 40 ㄧ
;ㄧ 地址 ㄧ ㄧ ㄧ ㄧ ㄧ ㄧ
;└──────┴──┴──┴──┴────────────────────┴───┘
;功能:设定下一个要存入数据的CGRAM的地址。
;DDRAM地址与显示位置的对应关系
;
;╭┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
;┊ ┊
;┊00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH ┊
;┊ ┊
;┊40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH ┊
;┊ ┊
;╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╯
ADD A,#0C0H ;第二行地址
LCALL WCOM
POP ACC ;数据
LCALL WDATA
RET
;--------------------------------------------------------------------
;在指定位置显示一行字符串(以0结尾),不检查是否超长,没有考虑空格覆盖以后的内容
;参数A行,B列,DPTR字符串指针
LCD_PRN_STR:
CJNE A,#0,LINE2
LINE1:
MOV A,B
ADD A,#80H ;第0行地址;作者:刘玉宏
LCALL WCOM
LJMP FILL
LINE2:
MOV A,B
ADD A,#0C0H ;第1行地址
LCALL WCOM
LJMP FILL
FILL:
CLR A
MOVC A,@A+DPTR
CJNE A,#0,L1
RET
L1:;作者:刘玉宏
LCALL WDATA
INC DPTR
AJMP FILL
;--------------------------------------------------------------------
TITLE: DB '89C51 R TEST',0
R_INFO: DB 'R=',0
;--------------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -