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

📄 led.a51

📁 keil下ISO7816规则的APDU程序
💻 A51
📖 第 1 页 / 共 2 页
字号:
?PR?PLY_APDU?PLY_APDU  	SEGMENT CODE
PUBLIC PLY_APDU
RSEG  ?PR?PLY_APDU?PLY_APDU
;编程代码文件信息存放的地址0x10820   		文件名称0x10820~0x1082
;编程代码文件起始地址0x10828~0x1082B     文件的长度0x1082C~0x1082

;文件信息放在0030H开始
;数据存放起始地址  页地址0x104   偏移地址0x00		地址10C20H
;程序的时间写入放入FBF5H~FBFBH		FBFCH是否第一次编程
;CPU的FBFDH~FBFFH存放应用程序的前三个字节
;口线定义
EXIO   		EQU 0C000H	;U11--HC273
IMG_EX 		EQU 3DH    	;Image Unit DR_CN --D0
DT0    		EQU P1.3 	;DATA
WRS    		EQU P1.1 	;WR CLK
LCDM   		EQU P3.4 	;LCD CS
LCD_DIG_BUF 	EQU 0E4H	;E4-EDH, LCD digital DIS Buffer (10-1)
LCD_LOG_BUF 	EQU 0EEH	;EE-EFH, LCD LOG display Buffer (15-0)

;C_RST45  	EQU 	P1.0  
;C_SO45   	EQU 	P1.4    
;C_SI45   	EQU 	P1.5
;C_SCK45  	EQU 	P1.3 
;C_CS45   	EQU 	P1.2
;ISP功能寄存器定义
;FAH		EQU 	0F4H	;编程高位地址(CPU地址)
;FAL   		EQU	0F5H	;编程低位地址(CPU地址)
;FDATA 		EQU	0F6H	;编程数据
;FCR		EQU	0F7H	;控制编程或擦除	
;SCONF		EQU	0BFH	;控制ISP使能
;
;BUF		EQU	60H
;CON1		EQU	73H	;
;LEN_L		EQU	74H	;编程缓冲区长度低位
;LEN_H		EQU	75H	;编程缓冲区长度高位
;PAH1		EQU	76H	;编程地址高位	
;PAL1		EQU	77H	;编程地址低位
;CON		EQU	78H	;移位计数器
;PA_H        	EQU 	79H    	;Page address H8 PAG=0-2048
;P;A_L        	EQU 	7AH    	;Page address L8
;BA_H        	EQU 	7BH    	;Byte/Buf1/Buf2 addr H8 BA:0-264
;BA_L        	EQU 	7CH    	;Byte/Buf1/Buf2 addr L8
;CON2		EQU    	7DH
;CON3		EQU	7EH
;AT_45_ADD	EQU	0C000H	;45D卡选通芯片地址
;ISP_DATA	EQU	2000H	;编程数据缓冲256个字节
;PRO_NAME	EQU 	1100H	;文件名称1100H~1107H
;PRO_STAADD	EQU	1108H	;文件数据起始地址1108H~110BH
;PRO_LEN	EQU	110CH	;文件长度110C~110FH
;PRO_DATE	EQU	1110H	;文件生成日期1110H~1117H
;PRO_NAME	EQU 	30H	;文件名称1100H~1107H
;PRO_STAADD	EQU	38H	;文件数据起始地址1108H~110BH
;PRO_LEN		EQU	3CH	;文件长度110C~110FH
;PRO_DATE	EQU	40H	;文件生成日期1110H~1117H
;TIMEADD		EQU	21F5H
;ORG 0FC00H
;ORG 0000H
;ISP_SERVER:
	;判断是否有卡,有041卡
;	MOV SP,#80H
;	MOV DPTR,#AT_45_ADD
;	MOV A,#08H
;	MOVX @DPTR,A
;	SETB C_RST45
;	JNB C_RST45,RETURN1
;	SETB C_SO45
;	JNB C_SO45,RETURN1
;	SETB C_SI45
;	JNB C_SI45,RETURN1
;	SETB C_SCK45
;	JNB C_SCK45,RETURN1
;	SETB C_CS45
;	JNB C_CS45,RETURN1
;	LCALL LCD_INI
;	MOV DPTR,#ISP_PSW_TB
;	LCALL SW_BACK_MODE2
;	MOV DPTR,#ISP_PSW_OK
;	LCALL SW_BACK_MODE2
;	MOV DPTR,#CPU_ERR
;	LCALL SW_BACK_MODE2
;============================================================
;读文件信息存放在 X:0030H~0047H
;============================================================
;	LCALL RED_INFO		;读出下载文件信息0030H~0047H
;	MOV R7,#18H
;	MOV R0,#30H
;	MOV DPTR,#30H
;AA:
;	MOVX A,@DPTR
;	INC DPTR
;	MOV @R0,A
;	INC R0
;	DJNZ R7,AA
;============================================================
;比较名称 X:0030H~0036H是否为"KTD1101"OK继续比较时间ERR退出
;============================================================
;	MOV R2,#7
;	MOV R0,#30H		;外部SRAM:0030H
;	MOV DPTR,#KTD1101	;"KTD1101"
;	MOV R6,DPL
;	MOV R7,DPH
;	MOV R0,#30H
;COMP_NAME:
;	MOV P2,#0		;外部SRAM:0030H
;	PUSH DPL
;	PUSH DPH
;	MOV DPL,R6
;	MOV DPH,R7
;	CLR A
;	MOVC A,@A+DPTR
;	INC DPTR
;	MOV B,A
;	MOV R6,DPL
;	MOV R7,DPH
;	CLR A
;	POP DPH
;	POP DPL
;	MOV A,@R0
;	CJNE A,B,RETURN1	;名称不相同则退出
;	INC R0
;	DJNZ R2,COMP_NAME	;
;	LJMP ENFORCE_LOAD	;名称相同则判断是否强制下载
;	LJMP COMP_TIME
;	JMP RETURN1
;RETURN1:
;	LJMP ISPEND
;===============================================================
;判断是否强制下载
;===============================================================
;ENFORCE_LOAD:
;	MOV R0,#47H
;	MOV A,@R0
;	CJNE A,#0,PRO_SATA	;不为0强制下载,为0则判断时间
;===============================================================
;比较时间 X:0040H~0046H和C:FBF5H比较,如X大于C则开始编程,否则退出 
;===============================================================
;COMP_TIME:
;	MOV DPTR,#0FBF5H	;CPU里存放时间的地址
;	CLR A
;	MOVC A,@A+DPTR		;得到时间的第一个字节
;	CJNE A,#0FFH,COMP_TIME1	;不是第一次编程
;	LJMP PRO_SATA		;第一迟编程
;COMP_TIME1:	
;	MOV DPTR,#0FBF5H
;	MOV R5,DPL
;	MOV R6,DPH
;;	MOV R7,#7
;	MOV R0,#40H
;COMP_TIME2:	
;	PUSH DPL
;	PUSH DPH
;	MOV DPL,R5
;	MOV DPH,R6
;	CLR A
;	MOVC A,@A+DPTR
;	MOV B,A
;	INC DPTR
;	MOV R5,DPL
;	MOV R6,DPH
;	POP DPH
;	POP DPL
;	MOVX A,@R0
;	INC R0
;	MOV CON,A
;	CLR C
;	SUBB A,B
;	JC RETURN1		;小于则结束
;	MOV A,CON
;	CJNE A,B,PRO_SATA	;大于则开始编程
;	DJNZ R7,COMP_TIME2
;	JMP RETURN1		;等于则结束
;=======================================================================
;编程0000H~F900H 将X:2000H~21FFH的 数据编程到一页(512个字节),共编程125页
;=======================================================================
PLY_APDU:
	MOV DPTR,#0C000H
	MOV A,#0FBH
	MOVX @DPTR,A
	LCALL LCD_INI
	MOV DPTR,#ISP_PSW_TB
	LCALL SW_BACK_MODE2
	RET
;	LCALL INIT_45D
;	MOV PA_H,#01H		;45D041页高位地址
;	MOV PA_L,#04H		;45D041页低位地址
;	MOV BA_H,#0		;45D041页内偏移地址高位
;	MOV BA_L,#0		;45D041页内偏移地址低位
;	MOV PAH1,#0		;编程地址高位
;	MOV PAL1,#0		;编程地址低位
;	MOV CON2,#7DH
;ISP_SERVER1:
;	MOV DPTR,#ISP_DATA	;存放编程数据的缓冲
;	LCALL READ_PAGE
;	LCALL COMPILE_CPU	;将取出的数据编程到一PAH1,PAL1起始地址并改变地址
;	DJNZ CON2,ISP_SERVER1
;=================================================================
;编程FA00H~FB00H 将当前时间和代码前三个字节编程到C:FBF5H
;=================================================================
;	LCALL INIT_45D
;	LCALL RED_INFO
;	LCALL READ_PAGE

;	MOV R3,#7		;时间长度
;	MOV R0,#40H	;日期存放地址	
;	MOV DPTR,#KTD1101
;	MOV R6,DPH
;	MOV R5,DPL
;	MOV DPTR,#TIMEADD	;日期在SRAM中的地址
;ISP_SERVER2:
;	PUSH DPH
;	PUSH DPL
;	MOV DPL,R5
;	MOV DPH,R6
;	CLR A
;	MOV A,@R0		;取出日期数据
;	MOVC A,@A+DPTR
;	INC R0		
;	MOV R6,DPH
;	MOV R5,DPL
;	POP DPL
;	POP DPH
;	MOVX @DPTR,A
;	INC DPTR
;	DJNZ R3,ISP_SERVER2

;	CLR A			;清是否第一次标志
;	MOVX @DPTR,A
;	INC DPTR		;将JMP的操作码02
;	MOV A,#02H
;	MOVX @DPTR,A
;
;	MOV DPTR,#1
;	CLR A
;	MOVC A,@A+DPTR
;	MOV DPTR,#21FEH
;	MOVX @DPTR,A
;	MOV DPTR,#2
;	CLR A
;	MOVC A,@A+DPTR
;	MOV DPTR,#21FFH
;	MOVX @DPTR,A
;	MOV PAH1,#0FAH		;编程地址高位
;	MOV PAL1,#00H		;编程地址低位
;	LCALL COMPILE_CPU
;	LCALL LCD_INI
;	MOV DPTR,#ISP_PSW_OK
;	LCALL SW_BACK_MODE2
;ISPEND:
;	LJMP 0FBFDH
;************************************************************
;
;************************************************************
;=================================================================
;读45D主页数据
;页地址 PA_H,PA_L; 字节地址 BA_H,BA_L
;读出来的数据放入 DPTR为起始地址,长度 R3,R2
;执行完后页地址PA_H,PA_L;字节地址BA_H,BA_L由长度LEN_H,LEN_L更新
;=================================================================
;CM_MEM_PAG_RD:
 ;      	MOV A,#52H		;读主程序的操作嘛
;CM_MEM_READ:       
 ;      	CLR C_CS45		;CS45=L
  ;     	LCALL CSD_OPC_PBA       ;发送操作码和24字节
   ;    	LCALL CSD_45_8B	        ;连续发4个随机字节
    ;   	LCALL CSD_45_8B
     ;  	LCALL CSD_45_8B
      ;	LCALL CSD_45_8B
;	CJNE R2,#00H,CM_MEM_PAG_RD1
;	MOV R2,#0FFH
;	LCALL CRD_45_8B
;     	MOVX @R0,A
;    	INC R0
;	JMP CM_MEM_PAG_RD6
;CM_MEM_PAG_RD1:			;读出256字节
 ;      	LCALL CRD_45_8B		;读出一个字节
;	MOV P2,CON3
 ;      	MOVX @DPTR,A
  ;     	INC DPTR
   ;    	DJNZ R2,CM_MEM_PAG_RD1
;CM_MEM_PAG_RD6:
;      	CJNE R3,#00H,CM_MEM_PAG_RD2
;      	SJMP CM_MEM_PAG_RD3
;CM_MEM_PAG_RD2:
;       DEC R3
;       SJMP CM_MEM_PAG_RD1
;CM_MEM_PAG_RD3:
    ;   	SETB C_CS45		;CS45=H


;CM_MEM_PAG_RD4:
;	MOV CON,#08H	
;CM_MEM_PAG_RD5:
;	MOV BA_L,#0
;	MOV BA_H,#0
;	MOV A,BA_L
;	ADD A,#1
;	MOV BA_L,A
;	DJNZ CON,CM_MEM_PAG_RD5
;      	CLR C			;连续读时页地址和页内地址的更新
;     	MOV A,BA_L		;将当前的地址设置为下一次要读的数据的				
;      	ADD A,LEN_L		;地址
;      	MOV BA_L,A
;      	MOV A,BA_H
;      	ADDC A,LEN_H
;      	MOV BA_H,A
;      	SETB C			
;      	MOV A,BA_L		;判断是否要翻页
;      	SUBB A,#07H
;      	MOV A,BA_H
;      	SUBB A,#01H
;      	JC RETURN		;不要翻页
;      	CLR C			;翻页;
;	MOV A,BA_L
;	SUBB A,#08H
;	MOV BA_L,A
;	MOV A,BA_H
;	SUBB A,#01H
;	MOV BA_H,A
;      	MOV A,PA_L
;      	ADD A,#1
;      	MOV PA_L,A
;      	MOV A,PA_H
;       ADDC A,#0
;       MOV PA_H,A
;RETURN:
;	CLR C
;	MOV A,PA_L		;页地址加一
;	ADD A,#1
;	MOV PA_L,A
;	MOV A,PA_H
;	ADDC A,#0
;	MOV PA_H,A
 ;      	RET
       
;=================================================================
;发送操作码
;PA--PA_H,PA_L BA--BA_H,BA_L
;=================================================================
;C;SD_OPC_PBA:
  ;     PUSH PA_H
 ;      PUSH PA_L
   ;    PUSH BA_H
    ;   PUSH BA_L
     ;;  LCALL COMBI_ADD		;
       ;LCALL CSD_45_8B		;发送操作码
     ;  MOV A,PA_H
      ; LCALL CSD_45_8B		;发送页地址低位的第8位和页地址的高位
       ;MOV A,PA_L
       ;LCALL CSD_45_8B		;发送页内地址的高字节的最后一位和页地址的低字节的前7位
       ;MOV A,BA_L
       ;LCALL CSD_45_8B		;发送页内地址的低八位
       ;POP BA_L
       ;POP BA_H
       ;POP PA_L
       ;POP PA_H
       ;RET
;=================================================================
;产生发送数据(由BA_H,BA_L,PA_H,PA_L产生)
;=================================================================
;COMBI_ADD:
 ;      PUSH ACC
  ;     MOV A,BA_H
   ;    RRC A		;将BA_H的最后一位放入C
    ;   MOV A,PA_L	;将BA_H的最后推入PA_L的最后一位PA_L的其它为依次左移
     ;  RLC A		;
      ; MOV PA_L,A	;将要发送的第3个字节放入PA_L
      ; MOV A,PA_H	;
      ; RLC A		;将PA_L的最高位推入PA_H的最低位其它的依次左移
      ; MOV PA_H,A	;将要发送的第2个字节放入PA_H
      ; POP ACC
      ; RET
;=================================================================
;发送一字节数据
;=================================================================
;CSD_45_8B:
 ;      MOV B,R2
  ;     MOV R2,#8
;CSD_45_8B1:
 ;      RLC A
  ;     CLR C_SCK45		;SCK-->L
   ;    JC CSD_45_8B2
    ;   CLR C_SI45		;SI-->L
     ;  SJMP CSD_45_8B3
;CSD_45_8B2:
 ;      SETB C_SI45		;SI-->H
;CSD_45_8B3:
 ;      SETB C_SCK45		;SCK-->H
  ;     DJNZ R2,CSD_45_8B1
   ;    MOV R2,B
    ;   RET
;=================================================================
;读一个字节
;=================================================================
;CRD_45_8B:
 ;      SETB C_SO45
  ;     MOV B,R2
   ;    MOV R2,#8
;CRD_45_8B1:
 ;      LCALL CLK_45		;SCK45 Pules L-->H
  ;     MOV C,C_SO45
   ;    RLC A
    ;   DJNZ R2,CRD_45_8B1
     ;  MOV R2,B
      ; RET
;=================================================================
;输出时钟信号
;=================================================================
;CLK_45:
 ;      CLR C_SCK45	   	;SCK -->L
  ;     NOP
   ;    NOP
    ;   NOP
     ;  SETB C_SCK45	   	;SCK -->H
      ; RET
;=================================================================
;45D041初始化
;=================================================================
;INIT_45D:  
;	MOV DPTR,#AT_45_ADD
;	MOV A,#38H
;	MOVX @DPTR,A
 ;    	SETB C_CS45 		;ORG_Status		
  ;     	SETB C_RST45       	;CS,RST,SI SCK=H
   ;    	SETB C_SI45	 
    ;   	SETB C_SCK45
;	LCALL DLY02S  
 ;      	RET
;=================================================================
;编程一页512字节
;长度LEN_H,LEN_L
;=================================================================
;COMPILE_CPU:
;	MOV DPTR,#ISP_DATA
;	MOV A,PAL1
;	CJNE A,#00H,COMPILE_CPU3
;	MOV A,PAH1
;	CJNE A,#00H,COMPILE_CPU3
;	MOV A,#0FFH
;	MOVX @DPTR,A
;COMPILE_CPU3:
;	LCALL ENABLE_ISP
;	MOV FAL,PAL1
;	MOV FAH,PAH1
;	MOV FCR,#82H
;	MOV FCR,#82H
;
;	MOV R4,#0
;COMPILE_CPU1:
;	LCALL COMPILE_DATA
;	DJNZ R4,COMPILE_CPU1
;	MOV R4,#0
;COMPILE_CPU2:
;	LCALL COMPILE_DATA
;	DJNZ R4,COMPILE_CPU2
;	MOV SCONF,#00H		;禁止ISP编程功能
;	RET
;=================================================================
;编程一个字节,并修改指针:将下次编程的数据指针DPTR+1
;			  将下次编程地址指针PAH1,PAL1+1
;=================================================================
;COMPILE_DATA:
;	PUSH DPL		;编程数据指针
;	PUSH DPH		;编程数据指针
;	LCALL ENABLE_ISP
;	MOV R5,#09H		;循环检验编程数据次数
;COMPILE_DATA1:
;	DJNZ R5,COMPILE_DATA2
;	LCALL LCD_INI
;	MOV DPTR,#CPU_ERR
;	LCALL SW_BACK_MODE2
;	LJMP $
;;	LJMP ERR_CPU		;CPU发生异常
;COMPILE_DATA2:
;	PUSH DPH		;保存编程数据指针
;	PUSH DPL		;保存编程数据指针
;	MOVX A,@DPTR
;	MOV B,A
;	MOV FDATA,A		;将编程数据放入编程数据寄存器
;	MOV FAL,PAL1		;准备编程地址
;	MOV FAH,PAH1		;
;	MOV FCR,#80H		;开始编程
;	
;	MOV DPL,PAL1

⌨️ 快捷键说明

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