📄 1602232.asm
字号:
;********************************************************************************
;232通信程序2400速率,12m晶体, 烧写后关掉XLISP软件,编程仿真切换到仿真状态(按下 *
;使用配套光盘的工具软件:串口调试助手,设置波特率2400, 连接232电缆到串口, *
;连接1602液晶到开发板, *
用串口调试助手发送字符, 开发板的1602液晶显示相应字符 *
;********************************************************************************
;* 日期: 2007-3-25 *
;* 版本: 3.0 *
;* 作者: 深圳学林电子有限公司 专业8051单片机教学站 *
;* 邮箱: sxj1974@163.com *
;* 网站: http://www.51c51.com http://www.8951.com 更多例程请登陆网站 *
;********************************************************************************
;* 硬件:此程序在本公司xlisp系列单片机实验仪运行通过 *
;********************************************************************************
;* 【版权】 Copyright(C)深圳学林电子有限公司 www.51c51.com All Rights Reserved *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;********************************************************************************
TEMP EQU 30H
TEMP1 EQU 31H
BUF EQU 32H
DISBUF EQU 40H
RS EQU P2.0
RW EQU P2.1
EN EQU P2.2
LCD_X EQU 2FH
PLAYFLAG BIT 20H.0
;*********************************************************
ORG 0000H
LJMP MAIN
ORG 0023H
LJMP T_SERIL
ORG 0030H
;*********************************************************
; 主程序
;*********************************************************
MAIN:
MOV SP,#60H
MOV P0,#0FFH
MOV P2,#0FFH
MOV TEMP,#00H
MOV TEMP1,#00H
CLR PLAYFLAG
MOV R1,#DISBUF ;清显存单元
CLR1:
MOV @R1,#20H
INC R1
CJNE R1,#50H,CLR1
CALL SET_LCD ;LCD1602初始显示
MOV TMOD,#20H ;定时器1工作于8位自动重载模式,用于产生波特率
MOV TH1,#0F3H
MOV TL1,#0F3H ;波特率2400
MOV SCON,#50H ;设定串行口工作方式
ANL PCON,#0EFH ;波特率不倍增
SETB EA ;允许总中断
SETB ES ;允许串行中断
SETB TR1 ;启动定时器1
MOV LCD_X,#00H
MOV R1,#DISBUF
MAIN1:
CALL PLAY
JMP MAIN1
;*********************************************************
; LCD1602 初始化子程序
;*********************************************************
INIT_LCD: ;8位I/O控制 LCD 接口初始化
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY5MS
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY5MS
MOV A,#38H ;双列显示,字形5*7点阵
CALL WCOM
CALL DELAY5MS
MOV A,#0CH ;开显示,关光标,
CALL WCOM
CALL DELAY5MS
MOV A,#01H ;清除 LCD 显示屏
CALL WCOM
CALL DELAY5MS
RET
;*********************************************************
; LCD1602 显示字符程序
; 在LCD的第一行或第二行显示信息字符
;*********************************************************
LCD_SHOW:
CJNE A,#1,LINE2 ;判断是否为第一行
LINE1:
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#80H ;设置 LCD 的第一行地址
CALL WCOM ;写入命令
JMP FILL
LINE2:
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM ;写入命令
CALL CLR_LINE ;清除该行字符数据
MOV A,#0C0H ;设置 LCD 的第二行地址
CALL WCOM
FILL:
CLR A ;填入字符
MOVC A,@A+DPTR ;由消息区取出字符
CJNE A,#0,LC1 ;判断是否为结束码
RET
LC1:
CALL WDATA ;写入数据
INC DPTR ;指针加1
JMP FILL ;继续填入字符
RET
CLR_LINE: ;清除该行 LCD 的字符
MOV R0,#24
CL1:
MOV A,#' '
CALL WDATA
DJNZ R0,CL1
RET
;*********************************************************
; 写指令使能子程序
; RS=L,RW=L,D0-D7=指令码,E=高脉冲
;*********************************************************
WCOM:
MOV P0,A
CLR RS
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
;*********************************************************
;写数据使能子程序
;RS=H,RW=L,D0-D7=数据,E=高脉冲
;*********************************************************
WDATA:
MOV P0,A
SETB RS
CLR RW
SETB EN
CALL DELAY0
CLR EN
RET
DELAY0:
MOV R7,#250 ;延时500微秒
DJNZ R7,$
RET
;*********************************************************
;LCD第二行显示字符子程序
;A=ASC DATA
;*********************************************************
LCDP2:
MOV TEMP1,A
MOV A,LCD_X ;设置显示地址
ADD A,#0C0H ;设置LCD的第二行地址
CALL WCOM ;写入命令
MOV A,TEMP1
CALL WDATA ;写入数据
RET
;*********************************************************
; LCD 初始化设置
;*********************************************************
SET_LCD:
CLR EN
CALL INIT_LCD ;初始化 LCD
CALL DELAY5MS
MOV DPTR,#INFO1 ;指针指到显示信息1
MOV A,#1 ;显示在第一行
CALL LCD_SHOW
SET_LCD2:
MOV DPTR,#INFO2 ;指针指到显示信息2
MOV A,#2 ;显示在第二行
CALL LCD_SHOW
RET
INFO1: DB " SERIAL TRANFER ",0 ;LCD 第一行显示信息
INFO2: DB " ",0 ;LCD 第二行显示信息
;*********************************************************
; 串口中断服务子程序
;*********************************************************
T_SERIL:
PUSH ACC
CLR ES ;关闭串行中断
CLR RI ;清除串行接受标志位
MOV A,SBUF ;从串口缓冲区取得数据
CJNE A,#0DH,T_LOOP ;0D-回车
JMP T_END
T_LOOP:
CJNE A,#0AH,T_LOOP1 ;0A-换行
JMP T_END
T_LOOP1:
MOV BUF,A
CJNE A,#31H,T_LOOP2
MOV TEMP,#35H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP2:
CJNE A,#32H,T_LOOP3
MOV TEMP,#31H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP3:
CJNE A,#33H,T_LOOP4
MOV TEMP,#4CH ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP4:
CJNE A,#34H,T_LOOP5
MOV TEMP,#35H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP5:
CJNE A,#35H,T_LOOP6
MOV TEMP,#31H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP6:
CJNE A,#36H,T_LOOP7
MOV TEMP,#52H ;
CALL SENDDATA
JMP T_LOOP8
T_LOOP7:
MOV TEMP,A
CALL SENDDATA
T_LOOP8:
SETB PLAYFLAG
MOV @R1,BUF
INC R1
CJNE R1,#50H,T_END
MOV R1,#DISBUF
T_END:
SETB ES
POP ACC
RETI
;*********************************************************
; 串口发送数据子程序
;*********************************************************
SENDDATA:
MOV A,TEMP
MOV SBUF,A
JNB TI,$ ; 等特数据传送
CLR TI ; 清除数据传送标志
RET
;*********************************************************
; 显示子程序
;*********************************************************
PLAY:
JNB PLAYFLAG,PLAYEND ;判是否需要显示
CALL SET_LCD2 ;清LCD1602第二行
MOV R1,#DISBUF
MOV LCD_X,#00H
PLAY1:
MOV A,@R1 ;显示接收的数据
CALL LCDP2
INC LCD_X
INC R1
CJNE R1,#50H,PLAY1
MOV R1,#DISBUF ;清显存单元
CLR2:
MOV @R1,#20H
INC R1
CJNE R1,#50H,CLR2
CLR PLAYFLAG
MOV R1,#DISBUF
PLAYEND:
RET
;*********************************************************
; 延时5MS子程序
;*********************************************************
DELAY5MS:
MOV R6,#25
DL2:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
;*********************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -