📄 lcd通用显示.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;R0,R3,R4:串口中断
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;R1,R2,R5:显示
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;R6,R7:延时
PLED EQU P3.3 ;LED灯控制端口
RS BIT P3.4 ;LCD1602的RS
RW BIT P3.5 ;LCD1602的RW
E BIT P3.7 ;LCD1602的E
DAT EQU P1 ;LCD1602数据和控制字口
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP START
ORG 0023H
LJMP INTS ;串口中断
ORG 0030H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START: LCALL CRAM ;清内存
MOV PSW,#00H
MOV SCON,#50H ;串口方式1,允许接收
MOV TMOD,#20H ;T1方式2
MOV TH1,#0FDH ;波特率9600
MOV TL1,#0FDH
MOV IE,#90H ;ES=1,EA=1
SETB IT0 ;下降沿中断
SETB TR1 ;T2开始计数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LCD1602初始化
LCALL DELAY1
MOV DAT,#01H ;清屏,光标回首址
LCALL ENABLE
MOV DAT,#38H ;设置显示模式:8位2行5X7点阵
LCALL ENABLE
MOV DAT,#0CH ;显示器开、光标开、光标允许闪烁
LCALL ENABLE
MOV DAT,#06H ;光标自动右移
LCALL ENABLE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;主程序
MAIN: JNB PLED,YDWXS
LCALL XSLCD1
LJMP MAIN
YDWXS:LCALL XSLCD
LJMP MAIN
NOP ;程序跑飞时执行复位操作
NOP
NOP
LJMP START
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;有定位时显示
XSLCD: MOV DAT,#80H ;LCD第一行首地址
LCALL ENABLE
MOV DAT,#20H ;显示空格
LCALL WRITE
;;;;;;;;;;;;;;;;;;;;;
MOV R1,#31H ;纬度的首地址,30H单元存的是豆号
MOV R2,#9 ;XXXX.XXXX
XS1:MOV A,@R1
MOV DAT,A
LCALL WRITE
INC R1
DJNZ R2,XS1
;;;;;;;;;;;;;;;;;;;;;
MOV A,3BH
MOV DAT,A ;N
LCALL WRITE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV R1,#4AH ;速度首地址
XS2:MOV A,@R1
CJNE @R1,#2CH,XS22 ;是豆号吗?
INC R1
MOV B,R1
LJMP NEX ;是豆号跳第二行显示
XS22:MOV DAT,A
LCALL WRITE
INC R1
LJMP XS2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NEX: MOV DAT,#0C0H ;LCD第二行首地址
LCALL ENABLE
MOV R1,#3DH ;经度的首地址
MOV R2,#10 ;XXXXX.XXXX
XS3:MOV A,@R1
MOV DAT,A
LCALL WRITE
INC R1
DJNZ R2,XS3
;;;;;;;;;;;;;;;;;;;;;
MOV A,48H
MOV DAT,A ;E
LCALL WRITE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV R1,B ;方位角首地址
MOV R2,#00H
XS4:MOV A,@R1
CJNE @R1,#2CH,NEX1 ;是豆号吗
CJNE R2,#00H,FH ;方位角第一个数据不是豆号,返回
MOV R5,#5 ;第一个是豆号,则显示5个"-"
XS44:MOV DAT,#0B0H
LCALL WRITE
DJNZ R5,XS44 ;返回
LJMP FH
NEX1:MOV DAT,A
LCALL WRITE
INC R1 ;地址加一
INC R2 ;豆号数加一
LJMP XS4
FH:RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;没定位时显示
XSLCD1: MOV DAT,#80H ;LCD第一行首地址
LCALL ENABLE
MOV DPTR,#TAB
MOV R2,#00H
MDWXS:MOV A,R2
MOVC A,@A+DPTR
MOV DAT,A
LCALL WRITE
INC R2
CJNE R2,#16,MDWXS
MOV DAT,#0C0H ;LCD第二行首地址
LCALL ENABLE
MOV R2,#16
MDWXS1:MOV DAT,#20H
LCALL WRITE
DJNZ R2,MDWXS1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;串口中断服务程序
INTS: CLR RI ;清接收中断标志位
PUSH PSW
PUSH A
MOV A,SBUF
CJNE A,#24H,INTSOUT ;$
;;;;;;;;;;;;;;;;;;
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#47H,INTSOUT ;G
;;;;;;;;;;;;;;;;;;
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#50H,INTSOUT ;P
;;;;;;;;;;;;;;;;;;
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#52H,INTSOUT ;R
;;;;;;;;;;;;;;;;;;
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#4DH,INTSOUT ;M
;;;;;;;;;;;;;;;;;;
JNB RI,$
CLR RI
MOV A,SBUF
CJNE A,#43H,INTSOUT ;C
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;跳过头两个豆号之间的时间数据
MOV R3,#02H ;两个豆号
DDJS:JNB RI,$ ;等待接收
CLR RI
MOV A,SBUF ;数据存入A中
CJNE A,#2CH,DDJS ;是豆号吗?
DJNZ R3,DDJS ;两个豆号都接收完了吗?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
JNB RI,$ ;等待接收
CLR RI
MOV A,SBUF ;数据存入A中
CJNE A,#41H,MDW ;判断第二个豆号后的是否为A
CLR PLED ;有定位LED灯亮
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV R0,#30H ;存数据首地址
MOV R4,#40 ;接收40个数据
DDJS1:JNB RI,$ ;等待接收
CLR RI
MOV A,SBUF ;数据存入A中
MOV @R0,A ;把有用的数据存入内存单元中
INC R0 ;地址指针加一
DJNZ R4,DDJS1 ;40个数据都接收完了吗?
LJMP INTSOUT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MDW:SETB PLED ;没定位,LED灯灭
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INTSOUT:POP A
POP PSW
RETI ;中断返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;液晶写控制字
ENABLE: CLR RS
CLR RW
CLR E
LCALL DELAY1
SETB E
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;液晶写数据
WRITE: SETB RS
CLR RW
CLR E
LCALL DELAY1
SETB E
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;液晶延时
DELAY1:MOV R7,#255
D1:MOV R6,#50
D2:DJNZ R6,D2
DJNZ R7,D1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清内存
CRAM: MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV R4,#00H
MOV R5,#00H
MOV R6,#00H
MOV R7,#00H
MOV B,#77H
MOV R0,#09H
CRAM1:MOV @R0,#00H
INC R0
DJNZ B,CRAM1
MOV R0,#00H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Please wait.....
TAB: DB 50H,6CH,65H,61H,73H,65H,20H,77H,61H,69H,74H,2EH,2EH,2EH,2EH,20H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -