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

📄 net.asm

📁 这是一个基于485的矩阵键盘程序源码
💻 ASM
字号:
;串行中断
;
PSI:    JBC    RI,PS1
        RETI
PS1:    PUSH   A
        PUSH   PSW
        SETB   RS1
        CLR    RS0
        JB     FREC_OVER,PS7      ;如果一条有效的命令接收完毕,停止响应接收数据直接退出
        JNB    FREC_COM,PS3       ;接收的第一阶段
        MOV    REC_COM,SBUF
        CLR    FREC_COM
        SETB   FREC_LEN
        SJMP   PS2

PS3:    JNB    FREC_LEN,PS4       ;接收的第二阶段
        CLR    FREC_LEN
        MOV    A,SBUF
        ANL    A,#0FH
        MOV    LEN,A
        JZ     PS2
        MOV    R7,A
        SETB   FREC_DATA
        MOV    REC_P,#REC_DATA
        SJMP   PS2

PS4:    JNB    FREC_DATA,PS6      ;接收的第三阶段
        MOV    R0,REC_P
        MOV    @R0,SBUF
        INC    REC_P
        DJNZ   R7,PS2
        CLR    FREC_DATA
        SETB   FREC_EDC
        SJMP   PS2

PS6:    JNB    FREC_EDC,PS2
        MOV    EDC,SBUF
        CLR    FREC_EDC
        LCALL  REC_V
        JC     PS2
        SETB   FREC_OVER
        SJMP   PS7
PS2:
        MOV    A,SBUF
        CJNE   A,#0FFH,PS7
        SETB   FREC_COM
        CLR    FREC_LEN
        CLR    FREC_DATA
        CLR    FREC_EDC
        CLR    FREC_OVER
PS7:    POP    PSW
        POP    A
        RETI



;串行命令处理
NET:
        JBC    FREC_OVER,NET_01
        RET
NET_01:
        MOV    A,REC_COM
        CJNE   A,#10H,NET_CHANGENO
        MOV    R0,#REC_DATA
        MOV    A,@R0
        CJNE   A,MACNO,NET_RET          ;非本机数据则退出
        MOV    A,LEN
        CJNE   A,#1,NET_RET
        JB     FKEYA,NET_02
        MOV    R0,#REC_DATA
        MOV    @R0,MACNO
        INC    R0
        MOV    @R0,#00H                 ;无按键时返回值
        MOV    LEN,#2
        LCALL  GEDC
        LJMP   SEND
NET_02:
        MOV    R0,#REC_DATA
        MOV    @R0,MACNO
        INC    R0
        MOV    @R0,KEYSEND              ;
        MOV    LEN,#2
        LCALL  GEDC
        LCALL  SEND
        MOV    JSQ_LOCAL_LOOP,#100
        CLR    FLAG2
NET_03:
        JBC    FREC_OVER,NET_04
        JNB    FLAG2,NET_03
        MOV    WDT,#3FH
        SJMP   NET_03
NET_04:
        MOV    R0,#REC_DATA
        MOV    A,@R0
        CJNE   A,MACNO,NET_RET          ;非本机数据则退出
        MOV    A,REC_COM
        CJNE   A,#10H,NET_RET
        MOV    A,LEN
        CJNE   A,#1,NET_RET
        CLR    FKEYA
        INC    NUMDIS
        MOV    JSQ_SPEAK,#10            ;有按键,发音
        SETB   WORKLED
        CLR    SPEAK
NET_RET:
        RET
;-------------------------------------------
;更改机号
;本身的物理编号长度为四字节        
NET_CHANGENO:
        CJNE   A,#20H,SENDMAC            ;更改机号命令
        MOV    A,LEN
        CJNE   A,#05H,NET_RET            ;长度
        MOV    R0,#REC_DATA+1
        MOV    DPTR,#MAC
        MOV    R7,#4
NET_CHANGENO_01:
        CLR    A
        MOVC   A,@A+DPTR
        MOV    B,@R0
        CJNE   A,B,NET_CHANGENO_RET
        INC    R0
        INC    DPTR
        DJNZ   R7,NET_CHANGENO_01
        MOV    R0,#REC_DATA
        MOV    MACNO,@R0
        LCALL  WRITEMAC
        LCALL  READMAC
        MOV    @R0,MACNO
        MOV    LEN,#1
        LCALL  GEDC
        LJMP   SEND
NET_CHANGENO_RET:
        RET        
;----------------------------------------
SENDMAC:
        CJNE   A,#30H,SENDMAC_RET
        MOV    A,LEN
        CJNE   A,#01H,SENDMAC_RET
        MOV    DPTR,#MAC
        MOV    R7,#4
        MOV    R0,#REC_DATA
        MOV    @R0,MACNO
        INC    R0
SENDMAC_01:
        CLR    A
        MOVC   A,@A+DPTR
        MOV    @R0,A
        INC    R0
        INC    DPTR
        DJNZ   R7,SENDMAC_01
        MOV    LEN,#5
        LCALL  GEDC
        LJMP   SEND        
SENDMAC_RET:
        RET                

;校验EDC
REC_V:
        CLR    A
        XRL    A,REC_COM
        XRL    A,LEN
        MOV    R7,LEN
        MOV    R0,#REC_DATA
RV1:    XRL    A,@R0
        INC    R0
        DJNZ   R7,RV1
        JNB    ACC.7,RV3
        CPL    A
RV3:    CJNE   A,EDC,RV2
        RET
RV2:    SETB   C
        RET

;EDC运算
GEDC:
        CLR    A
        MOV    R7,LEN
        MOV    R0,#REC_DATA
GE1:    XRL    A,@R0
        INC    R0
        DJNZ   R7,GE1
        JNB    ACC.7,GE2
        CPL    A
GE2:    MOV    EDC,A
        RET



;串行数据发送子程序
SEND:
        CLR    TI
        MOV    R7,LEN
        MOV    R0,#REC_DATA
SE1:    MOV    A,@R0
        MOV    SBUF,A
        JNB    TI,$
        CLR    TI
        INC    R0
        DJNZ   R7,SE1
        MOV    SBUF,EDC
        JNB    TI,$
        CLR    TI
SE2:    RET

;--------------------------------------
;ASCII转换为16进制数
ASCII_HEX:
        MOV    A,@R0
        CJNE   A,#3AH,AH1
AH1:    JC     AH2
        SUBB   A,#55
        SJMP   AH3
AH2:    ANL    A,#0FH
AH3:    MOV    B,A
        INC    R0
        MOV    A,@R0
        CJNE   A,#3AH,AH4
AH4:    JC     AH5
        SUBB   A,#55
        SJMP   AH6
AH5:    ANL    A,#0FH
AH6:    SWAP   A
        ORL    A,B
        INC    R0
        RET
;---------------------------------------
;HEX转十六进制
HEX_ASCII:
        MOV    B,A
        ANL    A,#0FH
        CJNE   A,#0AH,HA1
HA1:    JC     HA2
        ADD    A,#55
        SJMP   HA3
HA2:    ORL    A,#30H
HA3:    MOV    @R0,A
        INC    R0
        MOV    A,B
        SWAP   A
        ANL    A,#0FH
        CJNE   A,#0AH,HA4
HA4:    JC     HA5
        ADD    A,#55
        SJMP   HA6
HA5:    ORL    A,#30H
HA6:    MOV    @R0,A
        INC    R0
        RET
;-----------------------------------------
;显示错误
DERR:
        MOV    DIS_BUF+0,#0DH
        MOV    DIS_BUF+1,#0EH
        MOV    DIS_BUF+2,#0EH
        MOV    DIS_BUF+3,#0AH
        MOV    DIS_BUF+4,#0AH
        MOV    DIS_BUF+5,A
        MOV    JSQ_LOCAL_LOOP,#200
        CLR    FLAG2
DERR_01:
        LCALL  NET
        JNB    FLAG2,DERR_01
DERR_RET:
        RET

⌨️ 快捷键说明

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