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

📄 lcd.asm

📁 串口通信及液晶显示
💻 ASM
📖 第 1 页 / 共 2 页
字号:
CS    BIT P3.2
PSB   BIT P3.6
SID   BIT P3.3
SCLK  BIT P3.4

RS    BIT P3.2
RW    BIT P3.3
E     BIT P3.4

LED1  BIT P2.0
LED2  BIT P2.1
LED3  BIT P2.2
SPK   BIT P2.3
LEDK  BIT P2.4

START EQU 10H
COM   EQU 11H
HDATA EQU 12H
LDATA EQU 13H
POS   EQU 40H

KEYENTER BIT P1.7
KEYUP    BIT P1.5
KEYDOWN  BIT P1.4
KEYINC   BIT P1.3
KEYDEC   BIT P1.2
KEYRIGHT BIT P1.1
KEYLEFT  BIT P1.0

SENDENABLE BIT P3.5   ;发送允许控制位,0为允许 1为不允许

BIZ_NONE   EQU 00H     ;0:等待业务
BIZ_UP     EQU 01H     ;1:手工上架
BIZ_DOWN   EQU 02H     ;2:手工下架
BIZ_OUT    EQU 03H     ;3:按指示出货
BIZ_CHECK  EQU 04H     ;4:按指示盘点
BIZ_QSTOCK EQU 05H    ;5:查库存

ITEM_NONE      EQU 00H
ITEM_GOODSCODE EQU 01H  ;  1:商品代码
ITEM_GOODSQTY  EQU 02H  ;  2:数量
ITEM_CONFIRM   EQU 03H  ;  3:输入确认

IDLEBUF EQU 01BH  ;本机无数据要求通信时,发送一个空闲状态给主机 为RS1=1 RS0=1时的R3开始
IDLELEN EQU 01CH
IDLECMD EQU 01DH
MADDR   EQU 01EH ;站点号
IDLECRC EQU 01FH

EBUFH   EQU 30H ;录入区的首址,个位地址
EBUFT   EQU 03EH ;录入区的尾址,最高位地址

BIZ     EQU 41H ;当前所处业务类型:0:等待业务 1:手工上架 2:手工下架 3:按指示出货 4:按指示盘点 5:查库存
ITEM    EQU 42H ;当前所处业务录入分项 1:商品代码 2:数量 (仅对业务为1和2的有效,其他不用录入
EPOS    EQU 43H ;录入区的字符数
KDELAYL EQU 44H ;抖动延时延时低字节
KDELAYH EQU 45H ;抖动延时延时高字节

KDOWN1  BIT 00H  ;是否有键按下
KDOWN2  BIT 01H  ;是否已过抖动延时
KDONE   BIT 02H  ;是否已处理过本次键盘处理程序
RCVFLAG BIT 03H  ;当前处于接收数据中
SNDFLAG BIT 04H  ;发送标志,检测到本站点时,如SNDFLAG=1则表示有数据要发送

CMD_IDLE         EQU 79H
CMD_DETECTMAC    EQU 80H
CMD_DETECTOK     EQU 81H
CMD_HOST         EQU 82H
CMD_GETGOODSNAME EQU 83H
CMD_GOODSNAME    EQU 84H
CMD_UPGOODS      EQU 85H

;包格式:目标机器号(1byte)+长度(1byte)
SENDBUF   EQU 70H  ;发送缓冲区首址
SENDLEN   EQU 71H  ;存放发送缓冲区长度
SENDDAT   EQU 72H  ;发送数据

RCVBUF    EQU 90H  ;接收缓冲区首址
RCVLEN    EQU 91H  ;存放接收缓冲区长度
RCVDAT    EQU 92H

BUF1      EQU 0C0H ;
BUF2      EQU 0E0H ;
BUF3      EQU 0F0H ;

TIMEOUT   EQU 46H  ;接收数据超时时间,真正的超时时间为:65ms*(256-n),n为其值

XLINE1  EQU  00H  ;XDATA内的第一行
XLINE2  EQU  20H  ;XDATA内的第二行

        LJMP MAIN
        ORG 000BH
        LJMP TIMERINT
        ORG 0023H
        LJMP COMINT

TIMERINT:
        PUSH ACC
        PUSH PSW
        JNB RCVFLAG,TIMERINT1
        INC TIMEOUT
        MOV A,TIMEOUT
        CLR C
        SUBB A,#30H
        JC TIMERINT1
;        CJNE A,#0F0H,TIMERINT1
        CLR RS1
        SETB RS0
        MOV R3,#00H
        MOV R0,#RCVBUF
        CLR RCVFLAG
TIMERINT1:
        POP PSW
        POP ACC
        RETI

COMINT:
        PUSH ACC
        PUSH PSW
        PUSH DPH
        PUSH DPL
        CLR RS1
        SETB RS0
        JNB SCON.0,COMINT3
        CLR SCON.0
        JNB SENDENABLE,COMINT3  ;本站处于发送中将不接收数据,以免接收到的数据是本站自已发送的数据
        SETB RCVFLAG
        MOV TIMEOUT,#00H
        MOV A,SBUF
        MOV @R0,A
        CJNE R3,#01H,COMINT1  ;R3存放接收的字节数
        ADD A,#01H           ;地址号加长度有两个字节,但要减一
        ADD A,#RCVBUF
        MOV R2,A             ;R2存放本包的结束地址
        SJMP COMINT2
COMINT1:
        MOV A,R3
        JZ COMINT2
        MOV A,R0
        CLR C
        SUBB A,R2
        JNZ COMINT2
        MOV R1,#RCVBUF
        MOV A,@R1
        CJNE A,MADDR,COMINT4
        ACALL PCOMPACKET
        SJMP COMINT_RCVEND
COMINT4:
        CJNE A,#0FFH,COMINT_RCVEND
        ACALL PCOMPACKET
        SJMP COMINT_RCVEND
COMINT2:
        INC R0
        INC R3
        SJMP COMINT_END
COMINT3:
        JNB SCON.1,COMINT_END
        CLR SCON.1
        DJNZ R4,COMINT_SENDNEXT1
        SETB SENDENABLE    ;发送结束,将发送使能不允许
        CLR SNDFLAG
        SJMP COMINT_RCVEND  ;
COMINT_SENDNEXT1:
        INC R1
        MOV SBUF,@R1
        SJMP COMINT_END
COMINT_RCVEND:
        MOV R0,#RCVBUF
        MOV R3,#00H
        CLR RCVFLAG
COMINT_END:
        POP DPL
        POP DPH
        POP PSW
        POP ACC
        RETI

PCOMPACKET:
        MOV R0,#RCVDAT
        MOV A,@R0  ;取命令码
        CJNE A,#CMD_HOST,PCOM_0
        ACALL P_CMD_HOST
        SJMP PCOMEND
PCOM_0:
        CJNE A,#CMD_DETECTMAC,PCOM_1
        ACALL P_CMD_DETECTMAC
        SJMP PCOMEND
PCOM_1:
        CJNE A,#CMD_GOODSNAME,PCOMEND
        ACALL P_CMD_GOODSNAME
        SJMP PCOMEND
PCOMEND:
        RET

P_CMD_HOST:
        JB SNDFLAG,P_CMD_HOST_1
        MOV R4,IDLELEN
        INC R4
        INC R4
        MOV R1,#IDLEBUF
        SJMP P_CMD_HOST_2
P_CMD_HOST_1:
        MOV R4,SENDLEN
        INC R4
        INC R4
        MOV R1,#SENDBUF
P_CMD_HOST_2:
        CLR SENDENABLE
        CLR SCON.1
        MOV SBUF,@R1
        RET

P_CMD_DETECTMAC:
        MOV R0,#RCVDAT
        INC R0
        MOV DPTR,#MACNO
P_CMD_DETECTMAC_2:
        MOV A,#00H
        MOVC A,@A+DPTR
        SUBB A,@R0
        JNZ P_CMD_DETECTMAC_3;判断MAC地址是否一致
        INC R0
        INC DPTR
        SJMP P_CMD_DETECTMAC_2
P_CMD_DETECTMAC_3:                    ;判断MAC地址是否一致
        MOV A,@R0
        CJNE A,#20H,P_CMD_DETECTMAC_END    ;检测地址是否检测完成(20H为下发的空隔符,下一字节为虚地址)
        MOV A,#00H      ;检测本地MAC地址地否检测完成
        MOVC A,@A+DPTR
        CJNE A,#00H,P_CMD_DETECTMAC_END    ;00H为结束符
        INC R0
        MOV MADDR,@R0  ;获得虚地址
        MOV A,IDLEBUF
        XRL A,IDLELEN
        XRL A,IDLECMD
        XRL A,MADDR
        MOV IDLECRC,A
        MOV R0,#SENDBUF
        MOV @R0,#00H    ;上位机的网络地址为0
        MOV R0,#SENDLEN
        MOV A,EPOS
        ADD A,#02H ;长度包括校验位及命令码
        MOV @R0,A
        MOV R0,#SENDDAT
        MOV @R0,#CMD_DETECTOK
        INC R0
        MOV R1,#EBUFH  ;以下将输入区的内容复制到发送缓冲区
        MOV R2,EPOS
        CJNE R2,#00H,P_CMD_DETECTMAC_5
        SJMP P_CMD_DETECTMAC_7
P_CMD_DETECTMAC_5:
        MOV A,@R1
        MOV @R0,A
        INC R0
        INC R1
        DJNZ R2,P_CMD_DETECTMAC_5
P_CMD_DETECTMAC_7:
        ACALL STARTSEND
P_CMD_DETECTMAC_END:
        RET

P_CMD_GOODSNAME:
        MOV R0,#RCVLEN
        MOV A,@R0
        MOV R3,A
        DEC R3
        DEC R3
        MOV R0,#RCVDAT
        INC R0  ;跳过一命令字节
        MOV R1,#BUF1
        MOV A,R3
        MOV @R1,A
        INC R1
        CJNE R3,#00H,P_CMD_GOODSNAME_1
        SJMP P_CMD_GOODSNAME_END
P_CMD_GOODSNAME_1:
        MOV A,@R0
        MOV @R1,A
        INC R0
        INC R1
        DJNZ R3,P_CMD_GOODSNAME_1
P_CMD_GOODSNAME_END:
        MOV @R1,#00H
        RET

STARTSEND:
        MOV R0,#SENDLEN
        MOV A,@R0 ;生成校验码
        ADD A,#01H ;R2内为参与校验的字节数,也即除了校验位之外的所有发送字节
        MOV R2,A
        MOV R4,A
        INC R4         ;R4内为总发送字节数,包含校验位
        ADD A,#SENDBUF
        MOV R1,A        ;R1内为校验码地址
        MOV A,#00H
        MOV R0,#SENDBUF
STARTSEND1:
        XRL A,@R0
        INC R0
        DJNZ R2,STARTSEND1
        MOV @R1,A
        CLR SENDENABLE
        CLR SCON.1
        MOV R1,#SENDBUF
        MOV SBUF,@R1
        RET


MAIN:
        MOV SP,#50H
        MOV R0,#00H
        CLR LED1
        CLR LED2
        CLR LED3
        CLR LEDK
        CLR PSB
;        ACALL DELAY
        SETB CS
        CLR E
;        ACALL DELAY
;        ACALL DELAY
        MOV START,#0F8H
        MOV COM,#30H
        ACALL WRITE
;        ACALL DELAY
        MOV COM,#0CH
        ACALL WRITE
;        ACALL DELAY
        MOV COM,#06H
        ACALL WRITE
        MOV COM,#01H
        ACALL WRITE
;        ACALL DELAY
        MOV DPTR,#LINE1
        MOV R0,#XLINE1
COPYLINE1:
        MOV A,#00H
        MOVC A,@A+DPTR
        MOVX @R0,A
        CJNE A,#00H,COPYOVER1
        SJMP COPYNEXT
COPYOVER1:
        INC R0
        INC DPTR
        SJMP COPYLINE1
COPYNEXT:
        MOV DPTR,#LINE2
        MOV R0,#XLINE2
COPYLINE2:
        MOV A,#00H
        MOVC A,@A+DPTR
        MOVX @R0,A
        CJNE A,#00H,COPYOVER2
        SJMP COPYOVER
COPYOVER2:
        INC R0
        INC DPTR
        SJMP COPYLINE2
COPYOVER:
        MOV R0,#XLINE1
        MOV POS,#0
        MOV COM,#80H
        MOV DPTR,#LINE1
        ACALL HZDISP
        MOV R0,#XLINE2
        MOV POS,#0
        MOV COM,#90H
        MOV DPTR,#LINE2
        ACALL HZDISP
        MOV TMOD,#23H
        MOV TL0,#0F0H
        MOV TH0,#00H
        MOV TL1,#0FDH
        MOV TH1,#0FDH
        ACALL CLEAREDIT
        MOV TMOD,#21H
        MOV TL0,#0F0H
        MOV TH0,#00H
        MOV TL1,#0FDH
        MOV TH1,#0FDH
        MOV SCON,#0D8H
        MOV PCON,#80H
        CLR RS1
        SETB RS0
        MOV R0,#RCVBUF
        MOV R3,#00H
        CLR RS1
        CLR RS0
        CLR RCVFLAG
        CLR SNDFLAG
        CLR KDOWN1
        CLR KDOWN2
        CLR KDONE
        MOV EBUFH,#30H
        MOV EPOS,#00H
        MOV BIZ,#BIZ_NONE
        MOV IDLEBUF,#00H
        MOV IDLELEN,#03H
        MOV IDLECMD,#CMD_IDLE
        SETB ES
        SETB TR0
        SETB TR1
        SETB ET0
        SETB EA

MAINLOOP:
        MOV P1,#0FFH
        JB KEYUP,KEYNEXT1
        SJMP KEYPROC
KEYNEXT1:
        JB KEYINC,KEYNEXT2
        SJMP KEYPROC
KEYNEXT2:
        JB KEYDEC,KEYNEXT3
        SJMP KEYPROC
KEYNEXT3:
        JB KEYDOWN,KEYNEXT4
        SJMP KEYPROC
KEYNEXT4:
        JB KEYLEFT,KEYNEXT5
        SJMP KEYPROC
KEYNEXT5:
        JB KEYRIGHT,KEYNEXT6
        SJMP KEYPROC
KEYNEXT6:
        JB KEYENTER,NOKEY
KEYPROC:
        JB KDONE,MAINLOOP
        JB KDOWN2,KEY11
        ACALL KEYDELAY
        SJMP MAINLOOP
KEY11:
        JB KDOWN1,KEY12
        SETB KDOWN1
        CLR KDOWN2
        MOV KDELAYL,#80H
        MOV KDELAYH,#00H
        SJMP MAINLOOP
KEY12:
        JB KEYUP,PKEYNEXT1
        ACALL PKEYUP
        SJMP PKEYEND
PKEYNEXT1:
        JB KEYINC,PKEYNEXT2
        ACALL PKEYINC
        SJMP PKEYEND
PKEYNEXT2:
        JB KEYDEC,PKEYNEXT3
        ACALL PKEYDEC
        SJMP PKEYEND
PKEYNEXT3:
        JB KEYRIGHT,PKEYNEXT4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -