|
这是程序
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,#0FDH
MOV TL1,#0FDH ;波特率9600
MOV SCON,#50H ;设定串行口工作方式
ANL PCON,#00H ;波特率不倍增
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,#57H ;W
CALL SENDDATA
JMP T_LOOP8
T_LOOP2:
CJNE A,#32H,T_LOOP3
MOV TEMP,#49H ;I
CALL SENDDATA
JMP T_LOOP8
T_LOOP3:
CJNE A,#33H,T_LOOP4
MOV TEMP,#4CH ;L
CALL SENDDATA
JMP T_LOOP8
T_LOOP4:
CJNE A,#34H,T_LOOP5
MOV TEMP,#4CH ;L
CALL SENDDATA
JMP T_LOOP8
T_LOOP5:
CJNE A,#35H,T_LOOP6
MOV TEMP,#41H ;A
CALL SENDDATA
JMP T_LOOP8
T_LOOP6:
CJNE A,#36H,T_LOOP7
MOV TEMP,#52H ;R
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
接到什么就发回来什么。可是我发01,接收到的是BF BD
为什么会这样。
|
|