📄 lcd.asm
字号:
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 + -