📄 dmjv11.bak
字号:
;USE AT89C2051
;PEI 2004.3 大卖家
;v1.1 修正RCVBUF中的Bug,并开通了CRC效验
P_STB BIT P3.1
P_SCK BIT P1.1
P_SD BIT P1.0
PLED BIT P3.7
led2 bit p1.7
tr bit p3.3
PID BIT P3.7
;------BITS------
CMDOK BIT 7FH ;pc serial command ok
TREADY BIT 7EH
BOK BIT 7DH
FB_DP BIT 7CH
SENDSTOP BIT 6EH ;发送停止
SENDEMPTY BIT 6DH ;BUFF空
;-----RAMS------
;BITCNT EQU 30H
;ADDR EQU 31H
SEND_BUF EQU 32H
REC_BUF EQU 33H
SHOWLEN EQU 34H
TOT EQU 36H ;Timer Count
;DELAY EQU 37H
;DELAY1 EQU 38H
ID EQU 39H
RDD EQU 40H ;串口临时数据
RDN EQU 41H ;接收数据计数
RCVTAIL EQU 42H ;接收数据尾指针
RCVHEAD EQU 43H ;接收数据头指针
SENDHEAD EQU 44H ;发送数据头指针
SENDTAIL EQU 45H ;发送数据尾指针
CMD EQU 46H ;串口命令
RCVNN EQU 47H
CHKSUM EQU 48H
SHOWD0 EQU 50H ;显示数据区
SHOWD1 EQU 51H
SHOWD2 EQU 52H
SHOWD3 EQU 53H
SHOWD4 EQU 54H
SHOWD5 EQU 55H
SHOWD6 EQU 56H
SHOWD7 EQU 57H
;----常数------
TON EQU 20 ;lamp flash time const
RCVADDR EQU 60H ;Recv Buffer Start
RCVLEN EQU 10H ;Recv Buffer Length
COMH0 EQU 0AAH;串口命令头
COMH1 EQU 55H
CMD1H EQU 21H
CMD2H EQU 22H
;*********************************
ORG 0000H
START: LJMP INIT ;goto initializing program
ORG 0003H
LJMP INT0INT
ORG 000BH
LJMP T0INT ;goto T0 interrupt scanning program
ORG 0023H
LJMP SERINT ;goto series port interrupt program
ORG 0030H
INIT: CLR EA
MOV PSW,#00H
MOV SP,#07H
MOV IE,#13H ;enable series port and T0,INT0 interrupt
MOV IP,#10H ;series port interrupt priority high
MOV PCON,#80H ; pcon:baud rate double( PCON address: 87H)
MOV TCON,#00000101B ; tcon:
MOV TMOD,#21H ;T1 working at MODE 2 T0 working at MODE 1
MOV TL0,#98H ;TIMER T0 interrupt every 17 ms
MOV TH0,#0BDH
MOV TH1,#0FDH ;11.059M 19200Baud(SMOD=1) 9600B(SMOD=0)
MOV TL1,#0FDH
MOV SCON,#50H ;series port working at MODE 1
SETB REN ;
;
setb tr;CLR RCVE ;MAX1487 RCV MODE
;
INIT1: MOV R0 , #30H
CLR A
INIT11: MOV @R0 , A ;
INC R0 ;
CJNE R0 , #80H , INIT11
MOV A,P1
RR A
RR A
ANL A,#03FH
MOV ID,A ;地址编号
;mov id,#1
MOV TOT,#TON
CLR CMDOK
SETB TR0 ;Start T0,T1
SETB TR1
SETB IT0 ;int0下跳沿有效
SETB EA ;Enable IRQ
;CALL SHOWID ;
;####### MAIN PROCESS ######
;main processing program
MAIN: NOP
NOP
JNB TREADY,MAIN1
CLR TREADY
CPL PLED
;CALL DISP ;刷新显示
MAIN1: JNB CMDOK,MAIN2
LCALL PROCESS
MAIN2:
MAIN3:
MAIN4: SJMP MAIN
PROCESS:;Process Serial Command...
CLR CMDOK;;;;
CALL CHECKCMD
JNB BOK,PRORT
cpl led2
;CALL SHOWMODE1
PRORT: RET
CHECKCMD:
CLR BOK
MOV A,RCVADDR+1 ;Board ID
XRL A,ID ;是我的接收地址?
JNZ CCMDERR
MOV A,RCVADDR+2 ;Command
MOV CMD,A
CJNE A,#CMD1H,CCMD1 ;是我可以处理的命令?
SJMP CRCCHK
CCMD1: CJNE A,#CMD2H,CCMD11
SJMP CRCCHK
CCMD11:
CCMD12: SJMP CCMDERR
CRCCHK: ;SJMP CCRCOK
MOV R0,#RCVADDR
MOV CHKSUM,#0
MOV A,@R0
CJNE A,#RCVLEN,CCRC1
CCRC1: JNC CCMDERR
MOV A,@R0
MOV R1,A ;LEN
INC R0
CCRC2: MOV A,@R0
XRL A,CHKSUM
MOV CHKSUM,A
INC R0
DJNZ R1,CCRC2
MOV A,CHKSUM
CJNE A,#0,CCRC3
CCRCOK:
SETB BOK
RET
CCRC3: ;要求重发数据
CCMDERR:CLR BOK
RET
SHOWMODE1:
MOV R0,#RCVADDR+3
MOV R1,#SHOWD0
MOV A,RCVADDR
CLR C
SUBB A,#3
MOV R3,A
MOV SHOWLEN,A
SHOWM2: ;
MOV A,@R0
MOV @R1,A
INC R0
INC R1
DJNZ R3,SHOWM2
JMP DISP
SHOWID:
MOV R0,#SHOWD0
MOV R3,#10
MOV SHOWLEN,#10
CLR A
JNB PID,SHOWID1
SHOWT1: MOV @R0,A
INC R0
INC A
DJNZ R3,SHOWT1
JMP DISP
SHOWID1:;SHOW ID 显示地址编号
MOV A,ID
MOV B,#10
DIV AB
MOV SHOWD0,A
MOV SHOWD1,B
MOV R0,#SHOWD0+2
MOV R3,#8
MOV A,#0FH
JMP SHOWT1
;****************
INT0INT:
RETI
;series port interrupt program
SERINT:
CLR EA
JNB RI,SENDINT ;receiving interrupt? N goto SEND
JMP SIN ;call SIN sub_program
SENDINT: JNB TI,SINTRT
;CALL SOUT
CLR TI
SINTRT: SETB EA
RETI
;receiving sub_program
SIN: PUSH PSW
PUSH ACC
MOV A,SBUF ;read SBUF
MOV RDD,A
MOV A,RDN
CJNE A,#00,SIN1
SIN0: MOV A,RDD
CJNE A,#COMH0,SIERR;判断3个命令头数据
SJMP SINS;
SIN1: CJNE A,#01,SIN12
MOV A,RDD
CJNE A,#COMH1,SIERR;
SJMP SINS
SIN12: CJNE A,#02,SIN2
MOV A,RDD
MOV RCVNN,A ;后继数据包长度
INC RCVNN
;注意:从长度数据开始保存
SIN2: MOV A,RDD
CALL RCVBUF ;写缓冲区
DJNZ RCVNN,SINS ;数据接收完毕?
SETB CMDOK
MOV RDN,#0
MOV RCVTAIL,#0
SJMP SIRT
;
SIERR: MOV RDN,#0
SJMP SIRT
SINS: INC RDN
SIRT: CLR RI ;clear RI flag
POP ACC
POP PSW
SETB EA
RETI ;!!
RCVBUF: ;写串口接收缓冲区
PUSH 00H ;save R0 ( address: 00H)
PUSH ACC ;Data
MOV A,RCVTAIL
CJNE A,#RCVLEN,RCVBF2
;Stop数据包超长,数据不再保存
;mov rdn,#0 ;Bug?yes!没有清除RcvTail,使后继命令不能正常保存
POP ACC
POP 00H
RET
RCVBF2: MOV A,#RCVADDR ;
ADD A,RCVTAIL ;get RCV buffer tail pointer point_to_address
MOV R0,A
POP ACC ;Data
MOV @R0,A
INC RCVTAIL
POP 00H
RET
; T0 interrupt scanning program
T0INT: PUSH PSW
CLR TR0 ;stop TIMER T0 run
MOV TL0,#00H ;low 8 bits of T0 initializing value 17ms
MOV TH0,#0F0H ;high 8 bits of T0 initializing value ;OK..
SETB TR0
DJNZ TOT,T0RET
SETB TREADY
MOV TOT,#TON
T0RET: POP PSW
RETI
;***************************
DISP:
CLR P_STB ;CLR SCK,STB
CLR P_SCK
MOV A,SHOWLEN
ADD A,#SHOWD0-1
MOV R1,A
MOV R4,SHOWLEN
DIS1:
; MOV A,R4
; CJNE A,#1,DIS2
; SETB FB_DP
; AJMP DIS3
;DIS2:
CLR FB_DP
;DIS3:
MOV A,@R1
JNB ACC.4,DIS4
SETB FB_DP
CLR ACC.4
DIS4:
ACALL SEND
DEC R1
DJNZ R4,DIS1
DISE:
SETB P_STB
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR P_STB
RET
;***************************
;SEND 1 DIGIT
;IN: A IS ONE BCD
;OUT: 74595 HAVE BIG7
;USE: R2
;***************************
SEND: ACALL GET_BIG7
JNB FB_DP,SEND0
CLR ACC.0
SEND0:
MOV R2,#8
SEND1: RLC A
JC SEND2
CLR P_SD
AJMP SEND3
SEND2: SETB P_SD
SEND3: NOP
NOP
NOP
NOP
SETB P_SCK
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR P_SCK
DJNZ R2,SEND1
RET
;***************************************
GET_BIG7:
MOV DPTR,#DTAB
MOVC A,@A+DPTR
RET
;***************************************
;显示译码 ABCDEFGP
;***************************************
DTAB: DB 03H ;0000 0011 0
DB 9FH ;1001 1111 1
DB 25H ;0010 0101 2
DB 0DH ;0000 1101 3
DB 99H ;1001 1001 4
DB 49H ;0100 1001 5
DB 41H ;0100 0001 6
DB 1FH ;0001 1111 7
DB 01H ;0000 0001 8
DB 09H ;0000 1001 9
DB 0FFH ;1111 1111 A(HIDE)
DB 0FEH ;1111 1110 .
DB 0FFH
DB 0FFH
DB 0FFH
DB 0FFH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -