⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd通用显示.asm

📁 讲述GPS的简单应用
💻 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 + -