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

📄 tic4.asm

📁 适用51单片机的2401存储器的读写操作
💻 ASM
📖 第 1 页 / 共 4 页
字号:
DEALPCOUT:      LCALL      SENDTOPC
DEALPCOUT1:
                RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GETPARA_RE:
                JNB        FLAG1.6,GETPARA_RE1
                CLR        FLAG1.6
                LCALL      WRREADIC                 ;无法正确读出数据
                SJMP       GETPARA_RE2
GETPARA_RE1:    LCALL      RIREADIC                 ;读出正确数据
GETPARA_RE2:     RET




;===========读2401中数据=============
GETPARA:
                MOV        TEMP0,#3EH               ;判断参数是否有效
                LCALL      READ24C01
                MOV        A,TEMP2
                CJNE       A,#5AH,GSTART_0_1
		LCALL	   READMAINPARA             ;读主参数区数据
		JNC	   GETPARA_OUT
		LCALL	   READBAKPARA              ;读备份参数区数据
		JNC	   GETPARA_OUT
		AJMP	   GSTART_0_3
GSTART_0_1:
                CJNE       A,#55H,GSTART_0_3
		LCALL	   READBAKPARA              ;备份参数区正确
		JNC	   GETPARA_OUT
GSTART_0_3:     SETB       FLAG1.6
                SJMP       GETPARA_OUT1
GETPARA_OUT:    CLR        FLAG1.6
GETPARA_OUT1:
	       	RET

;======================================
;从主记录区中得到参数
;======================================
READMAINPARA:
        MOV       R1,#DATACON3       ;单片机中地址
        MOV       R2,DATACON         ;2401中地址
        MOV       R4,DATACON1        ;需读数据个数
        LCALL     PARAM1
        LCALL     ADDALL
        MOV	  A,CHECKSUM
        MOV	  CHECKIC,A
        MOV       R1,#DATACON3       ;单片机中地址
        MOV       R2,DATACON         ;2401中地址
        MOV       R4,DATACON1        ;需读数据个数
        LCALL     PARAM1
        LCALL     ADDALL
        MOV	  A,CHECKSUM
       	CJNE	  A,CHECKIC,READMAINPARA_1
        CLR       C
        SJMP      READMAINPARA_OUT
READMAINPARA_1:
      	SETB	C
        MOV     TEMP0,#3EH
        MOV     TEMP2,#55H
        LCALL   WRITE24C01
READMAINPARA_OUT:
        	RET

;======================================
;从备份记录区中得到参数
;======================================
READBAKPARA:
        MOV       R1,#DATACON3        ;单片机中地址
        MOV       A,DATACON
        ADD       A,#40H
        MOV       R2,A                  ;2401中地址
        MOV       R4,DATACON1           ;需读数据个数
        LCALL     PARAM1
        LCALL     ADDALL
        MOV	  A,CHECKSUM
        MOV	  CHECKIC,A
        MOV       R1,#DATACON3        ;单片机中地址
        MOV       A,DATACON
        ADD       A,#40H
        MOV       R2,A                  ;2401中地址
        MOV       R4,DATACON1           ;需读数据个数
        LCALL     PARAM1
        LCALL     ADDALL
        MOV	  A,CHECKSUM
        CJNE	  A,CHECKIC,READBAKPARA_1
        CLR       C
        SJMP      READBAKPARA_OUT
READBAKPARA_1:
      	SETB	  C
        MOV       TEMP0,#3EH
        MOV       TEMP2,#0AAH
        LCALL     WRITE24C01
READBAKPARA_OUT:
           RET
;=============2401校验和(读数据用)============
ADDALL:
     	CLR   	  C
        MOV       R1,#DATACON3
        MOV       R2,DATACON1
        MOV	  A,#00H
PARA:
	ADD  	  A,@R1
        INC       R1
        DJNZ      R2,PARA
        MOV	  CHECKSUM,A
        RET
;==========读指定区域的数据==========
PARAM1:
        MOV       A,R2            ;读出所有数据
        MOV       TEMP0,A
        LCALL     READ24C01
        MOV       A,TEMP2
        MOV       @R1,A
        INC       R1
        INC       R2
        DJNZ      R4,PARAM1
        RET

;=========向2401中写数据==========
WRITESAVE :
             MOV           TEMP0,DATACON         ;2401中的地址
             MOV           R0,#DATACON2          ;需向2401写的数据
             MOV           R1,DATACON1           ;需写数据个数
             LCALL         SENDDATA
             MOV           A,DATACON
             ADD           A,#40H
             MOV           TEMP0,A
             MOV           R0,#DATACON2
             MOV           R1,DATACON1
             LCALL         SENDDATA
             MOV           TEMP0,#3EH
             MOV           TEMP2,#5AH             ;写标志
             LCALL         WRITE24C01
              RET
;=========向2401写数据=============
SENDDATA:
             MOV           TEMP2,@R0
             LCALL         WRITE24C01
             INC           TEMP0
             INC           R0
             DJNZ          R1,SENDDATA
             RET
;============校验和(写数据用)=========
 ADDALL1:
     	CLR	  C
        MOV       R1,#DATACON2
        MOV       R2,DATACON1
        MOV	  A,#00H
PARA1:
	ADD  	  A,@R1
        INC       R1
        DJNZ      R2,PARA1
	MOV	  CHECKSUM,A
        RET
;========读IC卡中数据============
READICCARD:
                MOV        R5,#08H                  ;(IN IC)上次写数据时是否拔卡
                MOV        R7,#01H                  ;
                MOV        R6,#CHECKIC              ;(IN RAM)
                LCALL      READ_CARD
                MOV        A,CHECKIC
                CJNE       A,#55H,USER_CARD_1
                MOV        A, DATACON             ;读备份区数据
                ADD        A,#90H
                MOV        R5,A                   ;(IN IC)
                MOV        R7,DATACON1            ; DATA LONG
                MOV        R6,#DATACON3           ;(IN RAM)
                LCALL      READ_CARD
                LCALL      ADDALL
                MOV	   A,CHECKSUM
                MOV	   CHECKIC,A
                MOV        A, DATACON             ;读备份区数据
                ADD        A,#90H
                MOV        R5,A                   ;(IN IC)
                MOV        R7,DATACON1            ; DATA LONG
                MOV        R6,#DATACON3           ;(IN RAM)
                LCALL      READ_CARD
                LCALL     ADDALL
                MOV	  A,CHECKSUM
                CJNE	  A,CHECKIC,USER_CARD_2
                LCALL     TRIOUTIC                      ;读写数据时是否拔卡
                CJNE      A,#0FFH,USER_CARD_0
                SJMP      USER_CARD_2
USER_CARD_0:
                MOV        A, DATACON                  ;将数据写到卡主区
                ADD        A,#20H
                MOV        R5,A                       ;(IN IC)
                MOV        R7,DATACON1                ; DATA LONG
                MOV        R6,#DATACON3               ;(IN RAM)
                LCALL      WRITE_CARD
                MOV        R5,#08H                     ;(IN IC)      将卡更新标志
                MOV        R7,#01H                     ;21H
                MOV        R6,#0AAH                    ;(IN RAM)
                LCALL      WRITE_CARD
                SJMP       USER_CARD_4
USER_CARD_1:
                MOV        A, DATACON                    ;读主区数据
                ADD        A,#20H
                MOV        R5,A                       ;(IN IC)
                MOV        R7,DATACON1                ; DATA LONG
                MOV        R6,#DATACON3               ;(IN RAM)
                LCALL      READ_CARD
                LCALL      ADDALL
                MOV	   A,CHECKSUM
                MOV	   CHECKIC,A
                MOV        A, DATACON             ;读备份区数据
                ADD        A,#20H
                MOV        R5,A                   ;(IN IC)
                MOV        R7,DATACON1            ; DATA LONG
                MOV        R6,#DATACON3           ;(IN RAM)
                LCALL      READ_CARD
                LCALL      ADDALL
                MOV	   A,CHECKSUM
                CJNE	   A,CHECKIC,USER_CARD_2
                LCALL      TRIOUTIC
                CJNE       A,#0FFH,USER_CARD_3
                SJMP       USER_CARD_2
USER_CARD_3:
                MOV        A, DATACON                ;将数据写到卡备份区
                ADD        A,#90H
                MOV        R5,A                       ;(IN IC)
                MOV        R7,DATACON1                ; DATA LONG
                MOV        R6,#DATACON3              ;(IN RAM)
                LCALL      WRITE_CARD
                SJMP       USER_CARD_4
USER_CARD_2:    SETB       FLAG1.6
                SJMP       USER_CARD_OUT
USER_CARD_4:    CLR        FLAG1.6
USER_CARD_OUT:  RET
;==========写IC卡中数据===========
WRITEICCARD:  JNB       TEMP1.1,WRITEIC_10
              LCALL     WRITEICKEY
WRITEIC_10:   MOV       CHECKIC,#55H
              MOV       R5,#08H         ;(IN IC)
              MOV       R7,#01H         ;21H
              MOV       R6,#CHECKIC     ;(IN RAM)
              LCALL     WRITE_CARD
              MOV       A, DATACON       ;将数据写到卡主区
              ADD       A,#20H
              MOV       R5,A              ;(IN IC)
              MOV       R7,DATACON1                ; DATA LONG
              MOV       R6,#DATACON2              ;(IN RAM)
              LCALL     WRITE_CARD
              MOV       CHECKIC,#0AAH
              MOV       R5,#08H         ;(IN IC)
              MOV       R7,#01H         ;21H
              MOV       R6,#CHECKIC         ;(IN RAM)
              LCALL     WRITE_CARD
              MOV       A, DATACON                ;将数据写到卡备份区
              ADD       A,#90H
              MOV       R5,A                       ;(IN IC)
              MOV       R7,DATACON1                ; DATA LONG
              MOV       R6,#DATACON2              ;(IN RAM)
              LCALL     WRITE_CARD
              RET
;======读写数据时是否拔卡===========
TRIOUTIC:
                MOV        A,#0FFH
                MOV        R0,DATACON1
                MOV        R1,#DATACON3
RIOUTIC:        ANL        A,@R1
                INC        R1
                DJNZ       R0,RIOUTIC
                RET

;============加密解密使用================
PASSKEY:        MOV     A,DATAL
                CJNE    A,#01H,PASSKEY1
                SJMP    PASSKEY_OUT
PASSKEY1:        MOV     R0,#01H
                MOV     R1,#DATACON
CONGET:         LCALL   GETREAL       ;得到加密结果
                INC     R0
                INC     R1
                MOV     A,R0
                CJNE    A,DATAL,CONGET
PASSKEY_OUT:    RET
;===========得到加密解密结果=============
GETREAL:
                MOV     A, #6EH
                ADD     A, R0
                MOV     B,S2
                MUL     AB
                ADD     A,S1
                MOV     TEMPS1,A
                MOV     A, #6FH
                ADD     A, R0
                MOV     B,S2
                MUL     AB
                ADD     A,S1
                MOV     B,TEMPS1
                MUL     AB
                XRL     A,@R1
                MOV     @R1, A
                RET
;====向PC送接收正确==========
RERIGHT:     MOV             DATAF,#0AAH
             MOV             DATAL,#01H
             LCALL           GENERALSEND
             RET
;====向PC送接收错误==========
REWRONG:       MOV             DATAF,#0BBH
               MOV             DATAL,#01H
               LCALL           GENERALSEND
               RET
;=======错卡(无效卡 )======
WRONGICSEND:  MOV             DATAF,#5AH
              MOV             DATAL,#01H
              LCALL           GENERALSEND
              RET
;============卡已拔出========
OUTCARD:     MOV             DATAF,#58H
             MOV             DATAL,#01H
             LCALL           GENERALSEND
             RET

;====插入本系统的卡==========
IN_IC:        MOV             DATAF,#57H
              MOV             DATAL,#01H
              LCALL           GENERALSEND
              RET
;====插入新卡==========
IN_NEWIC:     MOV             DATAF,#5BH
              MOV             DATAL,#01H
              LCALL           GENERALSEND
              RET
;========向PC送读到的数据========
RIREADIC:    MOV             DATACON2,#0AAH
             MOV             A,#04H
             ADD             A,DATACON1
             MOV             DATAL,A
             LCALL           GENERALSEND
             RET
;========向PC送读写数据失败========
WRREADIC:    MOV             DATACON2,#55H
             MOV             DATAL,#04H
             LCALL           GENERALSEND
             RET
;=======向PC送写数据成功========
RIGHTSAVE:   MOV             DATACON2,#0AAH
             MOV             DATAL,#04H
             LCALL           GENERALSEND
             RET
;=======送数时的公共子程序============
GENERALSEND:
             LCALL           GETRANDOM
             MOV             A,#04H
             ADD             A,R
             ADD             A,DATAL
             MOV             DATALONG,A
             MOV             A,#R
             ADD             A,DATAL
             MOV             R0,A
             MOV             R1,#00H
             LCALL           GETWI
             LCALL           PASSKEY
             LCALL           SEDATAADD
             RET

⌨️ 快捷键说明

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