📄 mima.asm
字号:
KEY_BIT EQU 3AH
KEYS EQU 3BH
OPEN EQU 00H
FLASH EQU 3EH;闪动次数
COUNT EQU 39H
NUMBYT EQU 3DH
SCL bit P1.2
SDA bit P1.0
CC EQU 3CH
WEI EQU 3FH
ORG 0000H
LJMP START
ORG 000BH
LJMP IN1
ORG 100H
START:MOV TMOD, #11H
MOV IE,#10001010B
MOV P0,#0FFH
MOV P2,#00010000B
CLR P1.1
MOV NUMBYT,#4
MOV SP,#60H
;内存密码
MOV 30H,#0F9H
MOV 31H,#0F9H
MOV 32H,#0F9H
MOV 33H,#0F9H
MOV 3AH,#00H; 闪动位
CLR OPEN
MOV FLASH,#0
MOV 3CH,#25
MOV KEYS,#0
SETB TR0
MOV 2AH,#0BFH; 显示—
MOV 2BH,#0BFH
MOV 2CH,#0BFH
MOV 2DH,#0BFH ;最高位
A1: LCALL DISP
LCALL L0
LCALL KEY
JMP A1
DISP:MOV R4,#4
MOV WEI,#01H; 显示位
MOV 46H,#00H
MOV R0,#2AH
LP: MOV A,P2
ANL A ,#00100000B
MOV 2EH,A
MOV A,FLASH
CJNE A,#0,L1
MOV A,46H; 放显示位到A
CJNE A,3AH, L2 ;显示位与闪动位是否相同
L1: CLR C
MOV A,3CH
CJNE A,#15,PP
PP: JC L2
MOV P0,#0FFH
JMP L4
L2: MOV P0,@R0
L4: MOV A,WEI
ORL A,2EH
MOV WEI,A
MOV P2,WEI
LCALL DELAY10MS
DJNZ R4 ,RE
RET
RE: INC R0
MOV A,WEI
ANL A,#11011111B
RL A
MOV WEI,A
INC 46H
JMP LP
L0: MOV P3,#00001100B
MOV A,P3
ANL A,#00001100B
CJNE A,#00001100B,JIN
MOV R3,#0
RET
JIN:LCALL DELAY30MS
JIN0:MOV R2,#4
MOV R3,#80H
JIN1:MOV A,R3
CPL A
MOV P3,A
MOV A,P3
ANL A,#00001100B
CJNE A,#00001100B,JIN2
MOV A,R3
RR A
MOV R3,A
DJNZ R2,JIN1
RET
JIN2:DEC R2
MOV R1,#0
JNB ACC.3,JIN3
MOV R1,#4
JIN3:MOV A,R1
ADD A,R2
INC A
MOV R3,A
JIN4:MOV A,P3
ANL A,#00001100B
CJNE A,#00001100B, JIN4
RET
KEY:
MOV A,R3
CJNE A,#0,A2
A3: RET
A2:
CJNE A,#7,A7
CLR C
MOV A,KEYS
CJNE A,#4,LQ
LQ:JC LQ1
JNB OPEN,LQ1
LCALL WRNBYT
MOV FLASH,#3
CLR OPEN
JMP A3
LQ1:MOV 2AH,#0BFH; 显示—
MOV 2BH,#0BFH
MOV 2CH,#0BFH
MOV 2DH,#0BFH
MOV KEYS,#0
MOV 3AH,#0
JMP A3
A7:CJNE A,#8,A8
CLR C
MOV A,KEYS
CJNE A,#4,LQ8
LQ8:JC LQ1
LCALL REDBYT
NOP
MOV A,35H
CJNE A,2AH,LQ9
MOV A,36H
CJNE A,2BH,LQ9
MOV A,37H
CJNE A,2CH,LQ9
MOV A,38H
CJNE A,2DH,LQ9
SETB OPEN
SETB P2.5
MOV COUNT,#18
JMP LQ10
LQ9: MOV A,30H
CJNE A,2AH,LQ10
MOV A,31H
CJNE A,2BH,LQ10
MOV A,32H
CJNE A,2CH,LQ10
MOV A,33H
CJNE A,2DH,LQ10
SETB OPEN
SETB P2.5
MOV COUNT,#18
LQ10:JMP LQ1
A8: MOV R2,A
MOV A,#2AH
ADD A,3AH
MOV R1,A
MOV A,R2
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV @R1,A
INC 3AH
INC KEYS
MOV A,3AH
CJNE A,#4,A4
MOV 3AH,#0
A4: JMP A3
IN1:PUSH ACC
PUSH PSW
MOV TH1,#0B8H
MOV TL1,#00H
DJNZ 3CH,LL
MOV 3CH,#25
MOV A,FLASH
CJNE A,#0,LLL
JNB OPEN,LL
DJNZ COUNT,LL
CLR P2.5
CLR OPEN
LL:POP PSW
POP ACC
RETI
LLL:DEC FLASH
MOV A,FLASH
CJNE A,#0,LL
MOV 2AH,#0BFH; 显示—
MOV 2BH,#0BFH
MOV 2CH,#0BFH
MOV 2DH,#0BFH
MOV KEYS,#0
MOV 3AH,#0
CLR P2.5
JMP LL
DELAY10MS: ;不是10MS
MOV R5,#12
DELAY1:MOV R7,#250
DJNZ R7,$
DJNZ R5,DELAY1
RET
DELAY30MS: MOV R4,#55
DE: MOV R3,#250
DJNZ R3,$
DJNZ R4,DE
RET
STA:
SETB P1.0 ;SDA=1
NOP
NOP
NOP
NOP
SETB P1.2 ;SCL=1
NOP
NOP
NOP
NOP
CLR P1.0 ;SDA=0
NOP
NOP
NOP
NOP
NOP
CLR P1.2 ;SCL=0
NOP
NOP
NOP
NOP
RET
STOP:
CLR SCL
NOP
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
RET
SACK:
CLR SDA
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
RET
SNACK:
SETB SDA
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NOP
NOP
NOP
NOP
NOP
RET
ACK_CHK:
SETB SDA ;将P1.7拉高,以便让
NOP
NOP
NOP
NOP
NOP
SETB SCL ;输出时钟
NOP
NOP
NOP
NOP
CLR F0 ;预先设为会发应答
MOV A, P1
JNB ACC.0,EXIT ;查接收端是否
SETB F0 ;不是,则置F0=1
NOP
NOP
NOP
NOP
NOP
EXIT:CLR SCL ;结束时钟
NOP
NOP
NOP
NOP
NOP
RET
;入口参数: A(存待发送数)
WRBYT:
CLR SCL
MOV R0,#08H
WLP: RLC A
JC WR1
AJMP WDR2
WLP1:DJNZ R0,WLP
RET
WR1: SETB SDA
NOP
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
AJMP WLP1
WDR2:
CLR SDA
NOP
NOP
NOP
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SCL
NOP
NOP
NOP
NOP
NOP
AJMP WLP1
;出口参数 : R2 (读取的数据移放入R2)
RDBYT: MOV R0,#08H
RLP: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
NOP
MOV A,P1
JNB ACC.0,RD0 ; 读入的是”0”则转RD0
AJMP RD1 ;否则跳转到 RD1
RLP1: DJNZ R0, RLP ;8位未读完则转RLP
RET
RD0: CLR C
MOV A,R2
RLC A
MOV R2,A
CLR SCL
NOP
NOP
NOP
NOP
NOP
AJMP RLP1
RD1: SETB C
MOV A,R2
RLC A
MOV R2,A
CLR SCL
NOP
NOP
NOP
NOP
NOP
AJMP RLP1
; 入口参数: NUMBYT(存发送字节数单元)
WRNBYT:PUSH ACC
PUSH PSW
WRNBYT1: MOV PSW,#18H
WRNBYT2: LCALL STA ;启动
MOV A,#10100000B
LCALL WRBYT ;调发1个字节子程序发寻址字节
LCALL ACK_CHK
JB F0, WRNBYT2
MOV A,#00H
LCALL WRBYT
LCALL ACK_CHK
JB F0,WRNBYT2
WRDA: MOV A,2AH ;取一数
LCALL WRBYT
LCALL ACK_CHK
JB F0,WRNBYT2 ;非应答则重发
MOV R4,#255
DJNZ R4,$
MOV A,2BH ;取一数
LCALL WRBYT
LCALL ACK_CHK
JB F0,WRNBYT2 ;非应答则重发
MOV R4,#255
DJNZ R4,$
MOV A,2CH ;取一数
LCALL WRBYT
LCALL ACK_CHK
JB F0,WRNBYT2 ;非应答则重发
MOV R4,#255
DJNZ R4,$
MOV A,2DH ;取一数
LCALL WRBYT
LCALL ACK_CHK
JB F0,WRNBYT2 ;非应答则重发
MOV R4,#255
DJNZ R4,$
LCALL STOP
NOP
NOP
NOP
NOP
NOP
POP PSW
POP ACC
RET
;____________________________________________________________
REDBYT: PUSH PSW
REDBYT1:MOV PSW,#18H
REDBYT2:LCALL STA
MOV A,#10100000B
LCALL WRBYT
LCALL ACK_CHK
JB F0,REDBYT2
MOV A,#00H
LCALL WRBYT
LCALL ACK_CHK
JB F0,REDBYT2
LCALL STA
MOV A,#10100001B
LCALL WRBYT
LCALL ACK_CHK
JB F0,REDBYT2
NOP
NOP
NOP
NOP
NOP
MOV R4,#255
DJNZ R4,$
RED:
RED1: LCALL RDBYT
NOP
NOP
NOP
NOP
NOP
LCALL SACK
NOP
NOP
NOP
NOP
NOP
MOV R4,#255
DJNZ R4,$
MOV 35H,R2
LCALL RDBYT
NOP
NOP
NOP
NOP
NOP
LCALL SACK
NOP
NOP
NOP
NOP
NOP
MOV 36H,R2
LCALL RDBYT
NOP
NOP
NOP
NOP
LCALL SACK
NOP
NOP
NOP
NOP
MOV 37H,R2
LCALL RDBYT
NOP
NOP
NOP
NOP
LCALL SACK
NOP
NOP
NOP
NOP
MOV 38H,R2;MOV @R1,
NOP
NOP
NOP
NOP
LCALL SNACK
NOP
NOP
NOP
NOP
NOP
LCALL STOP
NOP
NOP
NOP
NOP
NOP
POP PSW
RET
TAB: DB 0BFH,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -