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

📄 24c02.asm

📁 此程序为调试通过的程序
💻 ASM
字号:
clk       bit  p2.5
dout      bit  p2.6
SDA	  BIT	P3.5
SCL	  BIT	P3.4
en        bit  p2.7
KEYBUF    EQU  35H
KEY       EQU  39H
DISPBUF   EQU  20H
FLAG0     EQU  0
;***************************************************
            ORG   000H
            AJMP  START
;***************************************************
            ORG   0100H
START:
            MOV   R0,#7FH
            CLR   A
CLRRAM:     MOV   @R0,A
            DJNZ  R0,CLRRAM
            MOV   SP,#7DH
;***************************************************
            MOV   P0,#0FFH
            MOV   P1,#0FFH
            MOV   P2,#0FFH
            MOV   P3,#0FFH
;***************************************************
;初始化参数
;***************************************************
;主程序
;***************************************************
WAIT:

;***************************************************
        LCALL   KEYINPUT           ;是否有键按下?
        MOV     A,FLAG0
        CJNE    A,#1,WAIT
        MOV     A,KEY
;***************************************************

           CJNE  A,#0BH, PANDUAN1
           LJMP  DISPMIMA
PANDUAN1:  CJNE  A,#0CH, PANDUAN2
           LJMP  CLRDISP
PANDUAN2:  CJNE  A,#0AH, PANDUAN3
           LJMP  SETMIMA
PANDUAN3:

           LJMP  WAIT
;******************************************************************************
;清屏:  LED
;******************************************************************************
CLRDISP:
        LCALL   CLRLED          ;LED显示6个0
        LJMP    WAIT


;**********************************************
;设置密码
;**********************************************

SETMIMA:
           LCALL  TIANC
           MOV     R3,#0A0H
           MOV     R4,#01H
           MOV     R1,#DISPBUF
           INC     R1            ;密码在DISPBUF+1处
           MOV     R7,#6
           LCALL  WR24C02
           LJMP   WAIT
;**********************************************
;填充显示缓冲区556688
TIANC:
        MOV     A,#DISPBUF
        MOV     R0,A
        MOV     A,#0H             ;小数点位/不显示
        MOV     @R0,A
        inc     r0
        mov     a,#8H
        mov     @r0,a
        inc     r0
        mov     a,#08H
        mov     @r0,a
        inc     r0
        mov     a,#06H
        mov     @r0,a
        inc     r0
        mov     a,#06H
        mov     @r0,a
        inc     r0
        mov     a,#05H
        mov     @r0,a
        inc     r0
        mov     a,#05H
        mov     @r0,a
        inc     r0
        mov     a,#01H		;识别码=01
        mov     @r0,a
        inc     r0
        mov     a,#01H		;蜂鸣器鸣叫,二次分频
        mov     @r0,a
        LCALL   DELY10MS
        RET
;*********************************************************
;****************************************************************************
;写串行E2PROM子程序WR24C02
; (R3)=10100000(命令1010+器件3位地址+读/写(1/0)。 器件地址:一个芯片是000)
; (R4)=片内字节地址
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数n
;****************************************************************************
WR24C02:
     MOV    P3,#0FFH
     CLR    SDA     ; 发开始信号
     MOV    A,R3    ; 送器件地址
     ACALL  SUBS
     MOV    A,R4    ; 送片内字节地址
     ACALL  SUBS
AGAIN:
     MOV     A,@R1
     ACALL   SUBS   ;调发送单字节子程序
     INC     R1
     DJNZ    R7,AGAIN;连续写n个字节
     CLR     SDA     ;SDA置0, 准备送停止信号
     ACALL   DELAY2  ;延时以满足传输速率要求
     SETB    SCL     ;发停止信号
     ACALL   DELAY2
     SETB    SDA
     RET
SUBS:
     MOV     R0,#08H ;发送单字节子程序
LOOP11:
     CLR     SCL
     RLC     A
     MOV     SDA,C
     NOP
     SETB    SCL
     ACALL   DELAY2
     DJNZ    R0,LOOP11 ;循环8次送8个bit
     CLR     SCL
     ACALL   DELAY2
     SETB    SCL
REP: MOV     C,SDA
     JC      REP        ;判应答到否,未到则等待
     CLR     SCL
     RET

DELAY2:
     NOP
     NOP
     NOP
     NOP
     NOP
     NOP
     RET


 ;*******************************************************************************************
;键盘处理子程序
;input:   KEYBUF,TAB
;OUTPUT:  KEY:键值
;出口:FLAG0=1 有按键
;            0 无
;*******************************************************************************************
KEYINPUT:
            MOV         KEYBUF,#2
;
            MOV         P0,#0FFH
            CLR         P0.4
            MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH          ;有键按下吗?
            JZ          NOKEY1
            LCALL       DELY10US
            MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH          ;真的有键按下吗?
            JZ          NOKEY1
            MOV         A,P0
            ANL         A,#0FH
            CJNE        A,#0EH,NK1      ;键码的值是多少?P0.4xP0.0
            MOV         KEYBUF,#3
            LJMP        DK1
NK1:        CJNE        A,#0DH,NK2      ;键码是P0.4xP0.1 ?
            MOV         KEYBUF,#2
            LJMP        DK1
NK2:        CJNE        A,#0BH,NK3      ;键码是P0.4xP0.2 ?
            MOV         KEYBUF,#1
            LJMP        DK1
NK3:        CJNE        A,#07H,NK4      ;键码是P0.4xP0.3 ?
            MOV         KEYBUF,#0
            LJMP        DK1
NK4:        NOP
DK1:
            MOV         A,KEYBUF
            MOV         DPTR,#TAB
            MOVC        A,@A+DPTR       ;查表,取键值
            MOV         KEY,A
            MOV         FLAG0,#1        ;FLAG0=1

DK1A:       MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH          ;按键有没有松开?
            JNZ         DK1A
NOKEY1:
            MOV         P0,#0FFH
            CLR         P0.5
            MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JZ          NOKEY2
            LCALL       DELY10US
            MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JZ          NOKEY2
            MOV         A,P0
            ANL         A,#0FH
            CJNE        A,#0EH,NK5
            MOV         KEYBUF,#7
            LJMP        DK2
NK5:        CJNE        A,#0DH,NK6
            MOV         KEYBUF,#6
            LJMP        DK2
NK6:        CJNE        A,#0BH,NK7
            MOV         KEYBUF,#5
            LJMP        DK2
NK7:        CJNE        A,#07H,NK8
            MOV         KEYBUF,#4
            LJMP        DK2
NK8:        NOP
DK2:
            MOV         A,KEYBUF
            MOV         DPTR,#TAB
            MOVC        A,@A+DPTR
            MOV         KEY,A
            MOV         FLAG0,#1        ;FLAG0=1

DK2A:       MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JNZ         DK2A
NOKEY2:
            MOV         P0,#0FFH
            CLR         P0.6
            MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JZ          NOKEY3
            LCALL       DELY10US
            MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JZ          NOKEY3
            MOV         A,P0
            ANL         A,#0FH
            CJNE        A,#0EH,NK9
            MOV         KEYBUF,#0bh
            LJMP        DK3
NK9:        CJNE        A,#0DH,NK10
            MOV         KEYBUF,#0ah
            LJMP        DK3
NK10:       CJNE        A,#0BH,NK11
            MOV         KEYBUF,#9
            LJMP        DK3
NK11:       CJNE        A,#07H,NK12
            MOV         KEYBUF,#8
            LJMP        DK3
NK12:       NOP
DK3:
            MOV         A,KEYBUF
            MOV         DPTR,#TAB
            MOVC        A,@A+DPTR
            MOV         KEY,A
            MOV         FLAG0,#1        ;FLAG0=1

DK3A:       MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JNZ         DK3A
NOKEY3:
            MOV         P0,#0FFH
            CLR         P0.7
            MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JZ          NOKEY4
            LCALL       DELY10US
            MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JZ          NOKEY4
            MOV         A,P0
            ANL         A,#0FH
            CJNE        A,#0EH,NK13
            MOV         KEYBUF,#0fh
            LJMP        DK4
NK13:       CJNE        A,#0DH,NK14
            MOV         KEYBUF,#0eH
            LJMP        DK4
NK14:       CJNE        A,#0BH,NK15
            MOV         KEYBUF,#0dH
            LJMP        DK4
NK15:       CJNE        A,#07H,NK16
            MOV         KEYBUF,#0ch
            LJMP        DK4
NK16:       NOP
DK4:
            MOV         A,KEYBUF
            MOV         DPTR,#TAB
            MOVC        A,@A+DPTR
            MOV         KEY,A
            MOV         FLAG0,#1        ;FLAG0=1

DK4A:       MOV         A,P0
            ANL         A,#0FH
            XRL         A,#0FH
            JNZ         DK4A
NOKEY4:
            RET
;**********************************************
DELY10MS:
            MOV         R6,#10
D1:         MOV         R7,#248
            DJNZ        R7,$
            DJNZ        R6,D1
            RET

DELY10US:
            MOV       R6,#10
            DJNZ      R6,$
            RET
DELY3US:
            MOV       R6,#3
            DJNZ      R6,$
            RET
;/*********************************************************************/

;  清LED 显示6个0
;*********************************************************
CLRLED:
        MOV     R0,#DISPBUF
        MOV     A,#0H     ;小数点位/不显示
        MOV     @R0,A
        MOV     A,#8
        ADD     A,R0
        MOV     R0,A      ;R0=DISPBUF+8指向蜂鸣器设定位
        MOV     R1,A
        DEC     R1
        DEC     R1
        MOV     A,#0      ;蜂鸣器不鸣叫
        MOV     @R0,A
        dec     r0
        mov     a,#01H	  ;识别码=01
        mov     @r0,a
        DEC     R0
;
        MOV     R2,#0
SET0:                     ;缓冲区全填为0
        MOV     A,#0
        MOV     @R1,A
        INC     R2
        DEC     R1
        CJNE    R2,#6,SET0
        LCALL   TSLED
        RET
;*********************************************************





;******************************************************************************
;显示密码
;******************************************************************************
DISPMIMA:
;
        MOV     R3,#0A0H
        MOV     R4,#01H
        MOV     R1,#DISPBUF
        INC     R1                ;密码在DISPBUF+1处
        MOV     R7,#6
        LCALL   RD24C02           ;读密码(从24C02)
        LCALL   SETXIAO           ;设置小数位、识别码、蜂鸣器
        LCALL   TSLED             ;在LED上显示密码
;****************************************************************************
;读串行E2PROM子程序RD24C02
;(R1)=欲读数据存放地址指针
;(R3)=10100001(命令1010+器件3位地址+读/写(1/0)。 器件地址:一个芯片是000)
;(R4)=片内字节地址
;(R7)=连续读字节数
;****************************************************************************
RD24C02:
     MOV       P3,#0FFH
;     SETB      SDA
;     SETB      SCL
;     NOP
     CLR       SDA     ;发开始信号
     MOV       R3,#0A0H
     MOV       A,R3    ;送器件地址
     ACALL     SUBS    ;调发送单字节子程序
     MOV       A,R4    ;送片内字节地址
     ACALL     SUBS
     MOV       P3,#0FFH
     CLR       SDA     ;再发开始信号
     MOV       A,R3
     SETB      ACC.0   ;发读命令
     ACALL     SUBS
MORE:
     ACALL     SUBR
     MOV       @R1,A
     INC       R1
     DJNZ      R7,MORE
     CLR       SDA
     ACALL     DELAY2
     SETB      SCL
     ACALL     DELAY2
     SETB      SDA       ;送停止信号
     RET


SUBR:
     MOV       R0,#08H   ;接受单字节子程序
LOOP2:
     SETB      SCL
     ACALL     DELAY2
     MOV       C,SDA
     RLC       A
     CLR       SCL
     ACALL     DELAY2
     DJNZ      R0,LOOP2
     CJNE      R7,#01H,LOW1
     SETB      SDA        ;若是最后一个字节置A=1
     AJMP      SETOK
LOW1:
     CLR       SDA        ;否则置A=0
SETOK:
     ACALL     DELAY2
     SETB      SCL
     ACALL     DELAY2
     CLR       SCL
     ACALL     DELAY2
     SETB      SDA        ;应答毕,SDA置1
     RET

;*********************************************************
;设置小数位、识别码、蜂鸣器
;*********************************************************
SETXIAO:
        MOV     A,#DISPBUF
        MOV     R0,A
        MOV     R1,A
        MOV     A,#00H          ;小数点位/不显示
        MOV     @R1,A
        MOV     A,#7
        ADD     A,R1
        MOV     R1,A
        MOV     A,#01           ;识别码=01
        MOV     @R1,A
        INC     R1
        MOV     A,#01           ;蜂鸣器设定开/二次分频
        MOV     @R1,A
        RET
;**********************************************

tsled:
	CLR	CLK
	CLR	EN
        NOP
	LCALL	DELY10us
	LCALL	DELY10us
	LCALL	DELY10us
	LCALL	DELY10us
        MOV     A,#0
        MOV     R2,A		;//9个字节
        MOV     R3,A		;一个字节中的4个位
        MOV     R0,#DISPBUF
DISP0:
        MOV     A,@R0
        SWAP	A
DISP2:
        SETB    CLK
        RLC      A
        JNC     ZHI0
        SETB    DOUT
        SJMP    NEI
ZHI0:   CLR     DOUT
NEI:
        NOP
        CLR     CLK
        LCALL	DELY3uS
        LCALL	DELY3uS
        LCALL	DELY3uS
        INC     R3
        CJNE    R3,#4,DISP2
;
        MOV     R3,#0
        INC     R2
        INC     R0
        CJNE    R2,#9,DISP0
        SETB    EN
        RET
;*****************************************************************



TAB:    DB	01H,02H,03H,0aH	;/*键盘码00,01,02,03,*/
        DB	04H,05H,06H,0bH	;/*键盘码04,05,06,07,*/
        DB	07H,08H,09H,0cH	;/*键盘码08,09,0a,0b,*/
        DB	0eH,00H,0fH,0dH	;/*键盘码0c,0d,0e,0f*/


        END

⌨️ 快捷键说明

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