📄 b13-10.asm
字号:
;FUNCTION : ADD 4 BYTES IN DATA MEMORY
;(R0+3)(R0+2)(R0+1)(R0)=(R0+3)(R0+2)(R0+1)(R0)+(R1+3)(R1+2)(R1+1)(R1)
;
DATA_ADD_4BYTE
MOV R2,#04H
CLR C
$1 MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,$1
RET
;
;
;FUNCTION NAME : DATA_SUBTRACT
;FUNCTION : SUBTRACT 4 BYTES,RESULT IN DATA MEMORY
;(R0+3)(R0+2)(R0+1)(R0)=(R0+3)(R0+2)(R0+1)(R0)-(R1+3)(R1+2)(R1+1)(R1)
;
DATA_SUBTRACT
MOV R2,#04H
CLR C
$1 MOV A,@R0
SUBB A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,$1
RET
;
;FUNCTION NAME : DATA_COMPLEMENT
;FUNCTION : COMPLEMENT 4 BYTES IN (07)(06)(05)(04)
;
DATA_COMPLEMENT
MOV R0,#04
MOV R2,#04H ;COUNT
SETB C ;CY=1
$1 MOV A,@R0
CPL A
ADDC A,#00H ;A=A+CY
MOV @R0,A
INC R0
DJNZ R2,$1
RET
;
;
;FUNCTION NAME : INTERNAL_DATA_COMPARE
;FUNCTION : COMPARE 2 BLOCKS INTERNAL DATA MEMORY (R2) TIMES
;
INTERNAL_DATA_COMPARE
$1 MOV A,@R0
MOV B,@R1
CJNE A,B,$2
DEC R0
DEC R1
DJNZ R2,$1
$2 RET
;
;FUNCTION NAME : ACC_COMPARE
;FUNCTION : COMPARE ACC WITH (R0) IN DATA MEMORY (R2) TIMES
;
ACC_COMPARE
$1 MOV B,@R0
CJNE A,B,$2
INC R0
DJNZ R2,$1
CLR A
SJMP $3 ;IF FOUND THEN A=0
$2 MOV A,#01H ;ELSE A=1
$3 RET
;
;FUNCTION NAME :MUL_4BYTE
;FUNCTION : UNSIGNED 4 BYTE MULTIPLY
;(07H)(06H)(05H)(04H)=(07H)(06H)(05H)(04H) X (0FH)(0EH)(0DH)(0CH)
;WORKING AREA DATA MEMORY : (0BH),(0AH),(09H),(08H)
;
MUL_4BYTE
LCALL CLEAR_INTERNAL_DATA_MEMORY
MOV R3,#33 ;SHIFT COUNT
CLR C
$1 MOV R1,#0BH
MOV R2,#08H
$2 MOV A,@R1
RRC A
MOV @R1,A
DEC R1
DJNZ R2,$2
JNC $3
CLR C
MOV R0,#08H
MOV R1,#0CH
LCALL DATA_ADD_4BYTE
$3 DJNZ R3,$1
RET
;
;FUNCTION NAME :DIV_4BYTE
;FUNCTION : UNSIGNED 4 BYTE DIVIDE
;(07H)(06H)(05H)(04H)=(07H)(06H)(05H)(04H) / (0FH)(0EH)(0DH)(0CH)
;WORKING AREA DATA MEMORY :(0BH),(0AH),(09H),(08H)
;
DIV_4BYTE
LCALL CLEAR_INTERNAL_DATA_MEMORY
MOV R3,#32 ;SHIFT COUNT
CLR C
$1 MOV R1,#04H
MOV R2,#08H
$2 MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ R2,$2
MOV R0,#0BH
MOV R1,#0FH
MOV R2,#04H
LCALL INTERNAL_DATA_COMPARE
JC $3
MOV R0,#08H
MOV R1,#0CH
LCALL DATA_SUBTRACT
$3 CPL C
DJNZ R3,$1
MOV R1,#04H
MOV R2,#04H
$4 MOV A,@R1
RLC A
MOV @R1,A
INC R1
DJNZ R2,$4
RET
;
CHECK_EE
MOV R0,#00H ;PAGE BLOCK (3 bits)
MOV R1,#FFH ;8 bits
CALL IIC_READ ;RESULT IN A
ADD A,#01H
MOV B,A
PUSH A
;
MOV R0,#00H
MOV R1,#FFH
CALL IIC_WRITE ;SAVE AGAIN
CALL DELAY
MOV R0,#00H ;PAGE BLOCK (3 bits)
MOV R1,#FFH ;8 bits
CALL IIC_READ ;RESULT IN A
MOV B,A ;NEW DATA
POP A
CJNE A,B,$ERR
SJMP $END
$ERR MOV BEEP,#10 ;BUZZER ON 0.1S
MOV A,#99H
MOV BUFFER,A ;DISPLAY 99
CALL DELAY
CALL DELAY
MOV A,#FFH
MOV BUFFER,A
CALL DELAY
CALL DELAY
SJMP $ERR
$END RET
;
READ_ID MOV R0,#00H ;PAGE BLOCK (3 bits)
MOV R1,#00H ;8 bits
CALL IIC_READ
MOV BINARY,A
JZ $SET
CJNE A,#10,$CHK
$CHK JC $CONT
$SET MOV A,#01H ;ID=1
MOV BINARY,A
MOV R0,#00H
MOV R1,#00H
MOV B,A
CALL IIC_WRITE ;SAVE AGAIN
$CONT MOV BEEP,#100
;KEY CHECK
SETB KEY
JB KEY,$NOKEY
$0 MOV A,BINARY
ADD A,#01H
MOV BINARY,A
CJNE A,#10,$1
$1 JC $2
MOV A,#01H
MOV BINARY,A
$2 MOV A,BINARY
CALL CONV
MOV A,BINARY
MOV B,A
MOV R0,#00H
MOV R1,#00H
CALL IIC_WRITE ;SAVE AGAIN
CALL DELAY
CALL DELAY
CALL DELAY
JMP $CONT
;
$NOKEY MOV A,BINARY
MOV EE_ID,A
MOV A,BINARY
CALL CONV ;DISPLAY IT
$LOOP MOV A,BEEP
JNZ $LOOP ;LOOP UNTIL BEEP=0
RET
;
;MEM BLOCK IN R0
;ADDRESS IN R1
;DATA IN B
IIC_WRITE
CALL IIC_START
MOV A,R0
ANL A,#07H ;MASK BIT7-BIT3
RL A
ORL A,#A0H ;WR=TRUE(0) AS BIT0=1
CALL IIC_OUT ;COMMAND OUT
CALL IIC_ACK ;9 CLK
;
MOV A,R1
CALL IIC_OUT ;ADDR OUT
CALL IIC_ACK
;
MOV A,B
CALL IIC_OUT ;DATA OUT
CALL IIC_ACK
;
CALL IIC_STOP
RET
;
IIC_OUT CLR SCLK
CALL DLY
MOV R7,#8
$RL RLC A
JC $O1
$O0 CLR SDA
JMP $NEXT
$O1 SETB SDA
$NEXT
CALL DLY
SETB SCLK
CALL DLY
CLR SCLK
CLR SDA
CALL DLY
DJNZ R7,$RL
RET
;
;MEM BLOCK IN R0
;ADDRESS IN R1
;DATA RETURN AT ACC
;
IIC_READ
CALL IIC_START
MOV A,R0
ANL A,#07H ;MASK BIT7-BIT3
RL A
ORL A,#A0H ;RD/!WR=0 AS BIT0=1
CALL IIC_OUT ;COMMAND OUT(WR)
CALL IIC_ACK
;
MOV A,R1
CALL IIC_OUT ;ADDR OUT
CALL IIC_ACK
;
CALL IIC_START
MOV A,R0
ANL A,#07H ;MASK BIT7-BIT3
RL A
ORL A,#A1H ;RD=1 AS BIT0=1
CALL IIC_OUT ;COMMAND OUT(RD)
CALL IIC_ACK
;
CALL IIC_IN ;DATA IN
CALL IIC_ACK
;
CALL IIC_STOP
RET
;
IIC_ACK
SETB SCLK
NOP
CLR SCLK
NOP
RET
;
IIC_IN SETB SDA
CLR SCLK
MOV R2,#8
MOV R0,#00H
$SI SETB SCLK
JB SDA,$SI1
$SI0 CLR C
JMP $SNX
$SI1 SETB C
$SNX NOP
MOV A,R0 ;LOW BYTE
RLC A
MOV R0,A
CLR SCLK
DJNZ R2,$SI
MOV A,R0
RET
;
IIC_INIT
SETB SCLK
SETB SDA
RET
;
IIC_START
SETB SCLK
SETB SDA
;
CLR SDA
NOP
CLR SCLK
NOP
RET
;
IIC_STOP
SETB SCLK
SETB SDA
RET
;
DLY NOP
NOP
NOP
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -