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

📄 1547.asm

📁 这是一个关于89c51,max7219,93c46组成的计数器程序
💻 ASM
字号:
;定义MAX7219的引用
DIN  BIT     P2.6
CLK  BIT     P2.4
LOAD BIT     P2.5
;定义93C46 的引脚
CS   BIT     P2.3
SK   BIT     P2.2
DI   BIT     P2.1
D0   BIT     P2.0
DATSEND DATA    1FH
; --------按键-----------
KEY  BIT     P1.2  ;当KEY='0'时,93C46清零
;--------------------------
TEMP  EQU    1FH
DATA1 EQU    0EH   ;LED显示的地址
DATA2 EQU    0FH   ;LED显示的数值
;中断表
     ORG     0000H
     JMP     MAIN
     ORG     0003H
     JMP     MAIN
     ORG     000BH
     JMP     NO_0
     ORG     0013H
     JMP     MAIN
     ORG     001BH
     JMP     MAIN
     ORG     0023H
     JMP     MAIN
;主程序
MAIN: CLR    EA
      MOV    SP,     #70H
      MOV    R5,     #04H
      MOV    TMOD,   #66H
      MOV    TH0,    #0FEH
      MOV    TL0,    #0FEH
      MOV    TCON,   #50H
;     读93C46的数据到R1=08H指定的地址,一共读R2=12个字节
      MOV    R2,     #6
      MOV    R1,     #08H
      MOV    DATSEND,#08H
READ_ALL:
      CALL   READ
      MOV    @R1,    A     ;
      INC    R1
      INC    DATSEND
      DJNZ   R2,     READ_ALL
;开中断
      MOV    IP,     #00H
      MOV    IE,     #8AH
;6位LED
      MOV    DATA1,  #0bH
      MOV    DATA2,  #05H
      CALL   PLAY
;亮度
      MOV    DATA1,  #0AH
      MOV    DATA2,  #0FH
      CALL   PLAY
;BCD码
      MOV    DATA1,  #09H
      MOV    DATA2,  #0FFH
      CALL   PLAY
      mov    08, #0
      mov    09, #0
      mov    0ah, #0
      mov    0bh, #0
      mov    0ch, #0
      mov    0dh, #0
;显示器正常工作
      MOV    DATA1,  #0CH
      MOV    DATA2,  #01H
      CALL   PLAY
;显示进币数;
LOOP: MOV    DATA1,  #06H
      MOV    R1,     #0DH
      MOV    R7,     #06H
LOOP3:MOV    DATA2,  @R1
      CALL   PLAY
      DEC    DATA1
      DEC    R1
      DJNZ   R7,     LOOP3
;测试key值
      JB     KEY,    LOOP
      MOV    R0,     #0FFH
      CALL   LATER
      JB     KEY,    LOOP
      CALL   EWEN_93C46
      CALL   WRAL_93C46
      CALL   EWDS_93C46
      JMP     LOOP

;-------计算器0中断,加1-----
NO_0:
        PUSH	08H
        PUSH	09H
        PUSH	0AH
        PUSH	0BH
	MOV	R0,	#08H
	CJNE	@R0,	#09H,	LOOP5
	MOV	@R0,	#00H
	JMP	NEXT1
LOOP5:	INC	@R0
	CALL	writ_IN
	POP	00H
	RETI
NEXT1:	INC	R0
	CJNE	@R0,	#09H,	LOOP6
	MOV	@R0,	#00H
	JMP	NEXT2
LOOP6:	INC	@R0
	CALL	writ_in
	POP	00H
	RETI
NEXT2:	INC	R0
	CJNE	@R0,	#09H,	LOOP7
	MOV	@R0,	#00H
	JMP	NEXT3
LOOP7:	INC	@R0
	CALL	writ_in
	POP	00H
	RETI
NEXT3:	INC	R0
	CJNE	@R0,	#09H,	LOOP8
	MOV	@R0,	#00H
	JMP	NEXT4

LOOP8:	INC	@R0
	CALL	writ_in
	POP	00H
	RETI
NEXT4:	INC	R0
	CJNE	@R0,	#09H,	LOOP9
	MOV	@R0,	#00H
	JMP	NEXT5
LOOP9:	INC	@R0
NEXT5:	CALL	writ_in
        POP	03H
        POP	02H
        POP	01H
	POP	00H        ;
	RETI

;-------延时10毫秒子程序------
LATER:
       NOP
       NOP
       DJNZ    R0,    LATER
       NOP
       RET
;-------显示子程序------
PLAY:
       PUSH  00H
       PUSH  A
       PUSH  PSW
       CLR   C
       MOV   R0,  #DATA1
       MOV   R3,  #2
       CLR   LOAD
LOOP1: MOV   TEMP, @R0
       MOV   R2,    #8
LOOP2: CLR   CLK
       MOV   A,     TEMP
       RLC   A
       MOV   TEMP,A
       MOV   DIN,C
       NOP
       SETB  CLK
       DJNZ  R2,   LOOP2
       INC   R0
       DJNZ  R3,   LOOP1
       SETB  LOAD
       POP   PSW
       POP   A
       POP   00H
       RET
writ_in:
      ;--------写93C46-------
      PUSH  00H
      PUSH  A
      MOV     A,   R0
      ORL     A,   #80H
      MOV     R0,  A
      CALL    EWEN_93C46
write_1:
      MOV      DATSEND, R0
      CALL     START_93C46
      CLR      SK
      CLR      DI
      NOP
      SETB     SK
      CALL     SEND_DATA
      CLR      SK

      MOV     DATSEND,@R0
      CALL    START_93C46
      CLR     SK
      CLR     DI
      NOP
      SETB    SK
      CALL    SEND_DATA
      CLR     SK
      CALL    EWDS_93C46
      POP   A
      POP   00H
      RET
;----------------------
;-----子程序名称   功能
;-------READ    把R7指向地址的内容读入R6(H),R5(L)
;-------WRITE   把R6(H),R5(L)的内容写到R7指向地址上
;-------WRAL    把R(H),R5(L)的内容写到全部存储器上
;-------ERAL    把全部存储器的内容擦除
READ:
    PUSH   03H
    PUSH   A
    CALL    start_93c46
    CLR    SK
    SETB   DI
    NOP
    SETB   SK
    CALL   SEND_DATA
    CLR    SK
;    JNB    D0,$
    MOV    R3,    #08H
    SETB   SK
    NOP
READ1: CLR    SK
    MOV   C,  D0
    RLC    A
    SETB   SK
    DJNZ  R3,    READ1
    CLR   SK
    POP   A
    POP   03H
    RET

EWEN_93C46:   ;擦/写允许
     CALL     start_93c46
     CLR    SK
     CLR    DI
     NOP
     SETB    SK
     MOV   DATSEND,#60H
     CALL   SEND_DATA
     RET
ERAL_93C46:  ;擦除芯片
     CALL     start_93c46
     CLR    SK
     CLR    DI
     NOP
     SETB    SK
     MOV   DATSEND,#40H
     CALL   SEND_DATA
     RET
EWDS_93C46: ;擦/写禁止
     CALL     start_93c46
     CLR    SK
     CLR    DI
     NOP
     SETB    SK
     MOV   DATSEND,#00H
     CALL   SEND_DATA
     RET
WRAL_93C46: ;写芯片为'0'
     CALL    START_93C46
     CLR     SK         ;
     CLR     DI
     NOP
     SETB    SK
     MOV     DATSEND,	#20H
     CALL    SEND_DATA
     MOV     DATSEND,	#00H
     CALL    SEND_DATA
     RET

start_93c46: ;写串行输入首位'1'
	CLR	CS
	NOP
	SETB	CS
;	JNB	D0,	$
	CLR	SK
	SETB	DI
	NOP
	SETB	SK
	RET
SEND_DATA: ;写串行8位数据
        PUSH    03H
        PUSH    A
        PUSH    PSW
        CLR     C
	MOV	R3,	#08H
	MOV	A,	DATSEND
SEND1:  CLR	SK
	RLC	A
	MOV	DI,	C
	SETB	SK
	DJNZ	R3,	SEND1
        POP     PSW
        POP     A
        POP     03H
	RET            ;
        end

⌨️ 快捷键说明

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