📄 shanghai.asm
字号:
;*******************************************************************
; The program is sample for your main system connect with CE06V01
; in LD-FORM , read the ML10 card
;*******************************************************************
; BIT ADDRESS
CNTT EQU 70H
;******** 常量定义 *******************************************************
ByteWait5us EQU 50 ; 串行口读写重试次数
Cpu1RsqNum EQU 30 ; CPU1发命令的重试次数
Cpu1WaitNum EQU 100 ; CPU1接收应答的重试次数
FrCPU1Cmd EQU 23h ; CPU1的命令帧头
FrCPU2Ack EQU 45H ; CPU2的响应帧头
FrCpu2Asw EQU 67H ; CPU2的应答帧头
FrCPU1Ack EQU 89H ; CPU1的响应帧头
ByteWait2 EQU 240
CommandOK EQU 00H ; 命令执行成功
;******** I/O port define **************************************************
SPBIT EQU P1.0 ; LD FORM data
SPCLK EQU P1.1 ; LD FORM clock
REDLED EQU P1.3 ;
;******** Register define *******************************************************
;BYTE DEFINITE
REGTEMP EQU 09H
REGTEMP2 EQU 78H
CNTREG1 EQU 10H
CNTREG2 EQU 11H
ICCMD EQU 26H ; 命令代码寄存器
RETCODE EQU 27H
Cpu1CmdLen EQU 28H ; CPU1命令帧长度寄存器
Cpu2AswLen EQU 29H ; CPU2应答帧长度寄存器
Cpu2AswBuf EQU 2AH ; CPU2应答帧存放缓冲区(40H--4FH)
Cpu1CmdBuf EQU 2AH ; 数据块A寄存器
SNR0 EQU 20H ; card serial no. buffer
;
OK EQU 00H
FAILED EQU 01H
;******** 位地址 *******************************************************
;BIT DEFINITE
HIGHRATE BIT 00H
ORG 0000H
LJMP MAIN
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
ORG 000BH
LJMP INT_T0 ; LED REFRESH INT PROGRAM !
;
ORG 0030H
MAIN:
SETB SPBIT
SETB SPCLK
CLR REDLED ;Clear the red LED
MOV IE,#00H ; 清中断允许寄存器
MOV SP,#0E0H ; 设置堆栈指针
CLR EA
LCALL T0_SET ;
SETB EA ;
SETB ET0 ;
;
YLOOP0:
MOV ICCMD,#0H
MOV Cpu1CmdLen,#0
LCALL Cpu1NsendCommand ;Connect with CE06V01
MOV A,RETCODE ;
CJNE A,#00H,AAA1 ;
;
SJMP AAA
AAA1: LJMP ER1 ;If retcode<>0,error
AAA: MOV ICCMD,#0A1H ;
MOV CPU1CMDLEN,#00 ;
LCALL CPU1NSENDCOMMAND ;Read the module no.
MOV A,RETCODE ;
CJNE A,#00H,AAA1
;
MOV ICCMD,#0A9H ;
MOV CPU1CMDLEN,#01H ;
MOV R0,#CPU1CMDBUF ;
MOV A,#00H ;
MOV @R0,A ;
LCALL CPU1NSENDCOMMAND ;Set the password mode
MOV A,RETCODE ;
CJNE A,#00H,AAA1 ;
;
MOV ICCMD,#0A4H ;Download the password #FFFFFFFFFFFF
MOV CPU1CMDLEN,#07H ;
MOV R0,#CPU1CMDBUF ;
MOV A,#00H ;
MOV @R0,A ;
INC R0 ;
MOV A,#033H ;
MOV @R0,A ;
INC R0 ;
MOV @R0,A ;
INC R0 ;
MOV @R0,A ;
INC R0 ;
MOV @R0,A ;
INC R0 ;
MOV @R0,A ;
INC R0 ;
MOV @R0,A ;
LCALL CPU1NSENDCOMMAND ; Download the password
MOV A,RETCODE ;
CJNE A,#00H,AAA1 ;
;
; SETB EA ;
; SETB ET0 ;OPEN THE INT.
YLOOP3:
; SETB EA ;
; SETB ET0 ;
MOV ICCMD,#0AAH ;
MOV CPU1CMDLEN,#00H ;
LCALL CPU1NSENDCOMMAND ; Read the card type
MOV A,RETCODE ;
CJNE A,#00H,ER1 ;
;
CLR EA ;
CLR ET0 ;Close the int t0
MOV ICCMD,#0ABH
MOV Cpu1CmdLen,#0
LCALL Cpu1NsendCommand ;Read serial no.
MOV A,RETCODE ;
CJNE A,#00H,ER1 ;
;
; LJMP ER0 ;
MOV R0,#SNR0 ;
MOV R1,#CPU2ASWBUF ;
MOV R2,#04H ;
YLOOP1:
MOV A,@R1 ;SAVE THE SERIAL NO.
MOV @R0,A ;
INC R1 ;
INC R0 ;
DJNZ R2,YLOOP1 ;
;
MOV ICCMD,#0ACH ;
MOV CPU1CMDLEN,#05H ;
MOV A,#02H ;
MOV CPU1CMDBUF,A ;
MOV R0,#SNR0 ;
MOV R1,#CPU1CMDBUF+1 ;
MOV R2,#04H ;
YLOOP2: MOV A,@R0 ;
MOV @R1,A ;
INC R0 ;
INC R1 ;
DJNZ R2,YLOOP2 ;
LCALL Cpu1NsendCommand ;Read the data block 2
MOV A,RETCODE ;
CJNE A,#00H,ER1 ;
;
ER0:
SETB REDLED ;
LJMP YLOOP3
ER1:
CLR REDLED ;Clear the RED LED
LJMP YLOOP3 ;
;***************************************************************************
;Your system transmit the command to CE06V01 and wait for return data
;****************************************************************************
Cpu1NSendCommand:
CLR EA ;
LCALL InitSP ;Init. LD form line
CPU1NSD1Z:
MOV R7, #Cpu1RsqNum ; 第一次握手
Cpu1NSD1:
MOV R5, #FrCpu1Cmd ; 发送Cpu1的命令帧头
LCALL SendCharSP
JC Cpu1NSD3
LCALL ReceCharSP ; 接收CPU2的响应帧头
JC Cpu1NSD3
CJNE R5, #FrCpu2Ack, Cpu1NSD3 ; "........ L
SJMP Cpu1NSD4 ; 握手成功
Cpu1NSD3:
DJNZ R7, Cpu1NSD1 ; 重复握手过程
CPU1NSD32:
SJMP Cpu1NSD_Err ; 握手失败
Cpu1NSD4:
MOV R7,#30H ;;;;;;
YLOOPA: DJNZ R7,YLOOPA ;;;;;Insert the user program
MOV A,ICCMD
MOV R5,A
LCALL SendCharSP
MOV R5, CPU1CMDLEN ; 取CPU1命令帧长度
XCH A,R5
MOV R7,A
XCH A,R5
XRL A,R5
LCALL SendCharSP ; 发送CPU1的命令
XCH A,R7
JZ CPU1NSD6
XCH A,R7
MOV R0,#Cpu1CmdBuf
Cpu1NSD5:
XCH A,@R0
MOV R5,A
XCH A,@R0
XRL A,R5
INC R0
LCALL SendCharSP ; 发送CPU1的命令帧
JC Cpu1NSD_Err
DJNZ R7,Cpu1NSD5
LJMP CPU1NSD7
CPU1NSD6:
XCH A,R7
CPU1NSD7:
MOV R5,A ;SEND CHECKSUM
LCALL SendCharSP
JC Cpu1NSD_Err
;-----------------------------------------------------------------------
; Wait Some Moment ! ( CPU1 PROCESS PROCEDURE)
MOV R7,#30H ;;;;;;
YLOOPB: DJNZ R7,YLOOPB ;;;;;Insert the user program
;-----------------------------------------------------------------------
MOV R7, #Cpu1WaitNum
Cpu1NSD10:
MOV R1, #20
Cpu1NSD11:
LCALL ReceCharSP ; 第二次握手
JC Cpu1NSD12
CJNE R5, #FrCPU2Asw, Cpu1NSD12 ; 判是否收到CPU2的应答帧头
MOV R5, #FrCPU1Ack
LCALL SendCharSP ; 发送CPU1的响应帧头
JC Cpu1NSD_Err
SJMP Cpu1NSD13
Cpu1NSD12:
DJNZ R1, Cpu1NSD11
DJNZ R7, Cpu1NSD10
SJMP Cpu1NSD_Err
Cpu1NSD13:
LCALL ReceCharSP ; 接收CPU2应答帧长度
JC Cpu1NSD_Err
MOV A,R5
MOV RETCODE,A
LCALL ReceCharSP ; 接收CPU2应答帧长度
MOV CPU2ASWLEN,R5
MOV R7,CPU2ASWLEN
XRL A,R5
XCH A,R7
JZ CPU1NSD15
XCH A,R7
MOV R0, #Cpu2AswBuf ; CPU2应答帧首地址
Cpu1NSD14:
LCALL ReceCharSP ; 接收命令帧
JC Cpu1NSD_Err
XCH A,R5
MOV @R0,A
XCH A,R5
XRL A,R5
INC R0
DJNZ R7,Cpu1NSD14
LJMP CPU1NSD16
CPU1NSD15:
XCH A,R7
CPU1NSD16:
LCALL ReceCharSP ; 收校验和
JC Cpu1NSD_Err
XRL A, R5
JNZ Cpu1NSD_Err ; 校验和不对
Cpu1NSD_OK: ; 成功
CLR C
SJMP Cpu1NSD_Exit
Cpu1NSD_Err: ; 失败
SETB C
Cpu1NSD_Exit: ; 退出
SETB EA ;
RET
;***************************************************************************
; 初始化软件串行口
;***************************************************************************
InitSP:
SETB SPCLK
SETB SPBIT
RET
;***************************************************************************
; LD FORM 发送子程序
; 入口: R5: 待发字符
; 出口: C=0: 成功, C=1: 失败 (A,R6)
;***************************************************************************
SendCharSP:
PUSH ACC
MOV A,R6 ;
PUSH ACC ;
SETB SPCLK ; Send 1 start bits
lcall delay
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -