51单片机串行接收,并将其用LCD1602显示的汇编代码
时间: 2024-02-09 22:09:12 浏览: 70
51单片机Mlx90614红外测温,使用LCD1602显示.zip
以下是51单片机串行接收并用LCD1602显示的汇编代码:
```
ORG 0H
MOV P0,#0FFH ; P0口设置为输入
MOV P1,#0FFH ; P1口设置为输入
MOV P2,#0FFH ; P2口设置为输入
MOV P3,#0FFH ; P3口设置为输入
MOV TMOD,#20H ; 定时器1工作在方式2下
MOV TH1,#FDH ; 定时器1初值设为FDH
MOV SCON,#50H ; 串行口工作在模式1下
SETB TR1 ; 启动定时器1
SETB ES ; 使能串行中断
SETB EA ; 总中断使能
MOV DPTR,#LcdInit ; 初始化LCD
ACALL LcdWrite ; 调用写LCD子程序
MOV DPTR,#LcdClear ; 清屏
ACALL LcdWrite ; 调用写LCD子程序
MOV DPTR,#LcdPos ; 设定光标位置
ACALL LcdWrite ; 调用写LCD子程序
MOV A,#'R' ; 显示提示信息
ACALL LcdData ; 调用写LCD数据子程序
MOV A,#'e'
ACALL LcdData
MOV A,#'c'
ACALL LcdData
MOV A,#'e'
ACALL LcdData
MOV A,#'i'
ACALL LcdData
MOV A,#'v'
ACALL LcdData
MOV A,#'i'
ACALL LcdData
MOV A,#'n'
ACALL LcdData
MOV A,#'g'
ACALL LcdData
MOV A,#':'
ACALL LcdData
MOV R7,#0 ; 数据计数器清零
HERE:
JNB RI,HERE ; 等待串行数据接收完毕
CLR RI ; 清除接收中断标志
MOV A,SBUF ; 读取串行数据
MOV @R0,A ; 将数据存入存储器
INC R0 ; 存储器指针加1
INC R7 ; 计数器加1
CJNE R7,#16,HERE ; 判断是否接收完16个字节
MOV DPTR,#LcdPos ; 设定光标位置
ACALL LcdWrite ; 调用写LCD子程序
MOV A,@R1 ; 读取存储器数据
ACALL LcdData ; 调用写LCD数据子程序
INC R1 ; 存储器指针加1
DJNZ R7,HERE ; 判断是否显示完16个字节
SJMP HERE ; 循环等待串口数据
; 子程序:写LCD指令
LcdWrite:
MOVX A,@DPTR ; 读取指令
CLR RS ; RS=0,写入指令
CLR RW ; RW=0,写入模式
MOV P2,A ; 输出指令
SETB EN ; EN=1,启动LCD
CLR EN ; EN=0,停止LCD
RET
; 子程序:写LCD数据
LcdData:
MOVX A,@DPTR ; 读取数据
SETB RS ; RS=1,写入数据
CLR RW ; RW=0,写入模式
MOV P2,A ; 输出数据
SETB EN ; EN=1,启动LCD
CLR EN ; EN=0,停止LCD
RET
; LCD初始化指令
LcdInit:
DB 38H ; 8位数据接口,2行显示,5x7点阵字符
DB 0FH ; 显示开,光标开,光标闪烁开
DB 01H ; 清屏
DB 06H ; 光标右移,字符不移动
RET
; LCD清屏指令
LcdClear:
DB 01H ; 清屏
RET
; LCD设定光标位置指令
LcdPos:
DB 80H ; 设定光标位置为第1行第1列
RET
```
此代码实现了串口接收16个字节的数据,并通过LCD1602显示。其中,通过定时器1实现了串口中断,当接收到串口数据时,会触发中断并将数据存入存储器中。然后从存储器中读取数据并显示在LCD上。
阅读全文