📄 led.a51
字号:
?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 + -