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

📄 mima.asm

📁 一个用单片机实现密码锁程序
💻 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 + -