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

📄 head.asm

📁 EMV2000 LEVEL 1实现的源码
💻 ASM
字号:

;	$XREF DEBUG SYMBOLS
;        NAME    withPC

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROG	SEGMENT	CODE
;BITVAR	SEGMENT	BIT

	public	sPC60
	public	rPCbyte
	public	rPCfirstbyte
	public	_sPCbyte
	public	Detu
	public	Detu_8
	public	D123T
	public	D122T
	public	D121T
	public	D42T
	public	D41T
	public	D40T
	public	D39T
	public	D38T
	public	D37T
	public	D36T
	public	D35T
	public	D34T
	public	D33T
	public	D32T
	public	D31T
	public	D30T
	public	D29T
	public	D28T
	public	D27T
	public	D26T
	public	D25T
	public	D24T
	public	D23T
	public	D22T
	public	D21T
	public	D20T
	public	D19T
	public	D18T
	public	D17T
	public	D16T
	public	D15T
	public	D14T
	public	D13T
	public	D12T
	public	D11T
	public	D10T
	public	D9T
	public	D8T
	public	D7T
	public	D6T
	public	D5T
	public	D4T
	public	D3T
	public	D2T
	public	D43000C

	EXTRN	BIT(CPU1_REST_FLAG)
	EXTRN	BIT(CPU2_REST_FLAG)
	EXTRN	BIT(STATE_FLAG)

	EXTRN	DATA(temp)
	EXTRN	DATA(bps)
	EXTRN	DATA(timer0)
	EXTRN	DATA(pointer)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     WDTC     	equ	09fh
     RCON		equ	085h
     DBANK     equ	086h

	IC_PWR1 	equ	P1.0
	IC_RST1	equ	P1.1
	IC_IO1	equ	P1.2
	IC_SW1	equ	P1.3
	IC_PWR2 	equ	P1.4
	IC_RST2	equ	P1.5
	IC_IO2	equ	P1.6
	IC_SW2	equ	P1.7
	CLK_CTR	equ	P3.7

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	RSEG	       PROG

;-----------------------------------------------------------------------
;======================================================================
;-----------------------------------------------------------------------
;延时一个etu
;主频:22.1184MHz 57600bps
;	一个时钟(T) = 12/22.1184 = 0.5425us = 12个振荡器周期(cycle)
;卡:5.5296MHz(22.1184MHz 4分频)
;	372/5.5296 = 67.274us = 14865bps = 124    T (对应3.579MHz下的  9600bps)
;-----------------------------------------------------------------------
;	;call DelayR0  	;2		2
;D121T:
;
;	mov	R4,#57		;1		3
;D121Tloop:
;	djnz	R4,D121Tloop	;2*57=114	117
;
;	mov	WDTC, #0a7h	;2		119		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
;
;	ret				;2		121
;-----------
D123T:
	mov	WDTC, #0a7h	;12C
D122T:
	mov	WDTC, #0a7h	;12C
								; 121T = 121*12Cycle = 1452C
	;call DelayR0  	;16C
D121T:

	mov	R4,#117		;8C				24C
D121Tloop:
	djnz	R4,D121Tloop	;12C	12*117=1404	1404+48C = 1452C

	mov	WDTC, #0a7h	;12C				36C	//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
	nop				;4C				40C
	ret				;8C				48C
;======================================================================
;-----------------------------------------------------------------------
;延时1/3个etu
;主频:22.1184MHz 57600bps
;	一个时钟(T) = 12/22.1184 = 0.5425us = 12个振荡器周期(cycle)
;卡:5.5296MHz(22.1184MHz 4分频)
;	372/5.5296 = 67.274us = 14865bps = 124    T (对应3.579MHz下的  9600bps)
;-----------------------------------------------------------------------
	;call D35T  	;2       	2
;D35T:
;
;	mov	R4,#14	;1		3
;D35Tloop:
;	djnz	R4,D35Tloop;2*14=28 31
;
;	mov	WDTC, #0a7h;2		33	//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
;
;	ret			;2		35

D42T:
	mov	WDTC, #0a7h	;12C
D41T:
	mov	WDTC, #0a7h	;12C
D40T:
	mov	WDTC, #0a7h	;12C
D39T:
	mov	WDTC, #0a7h	;12C
D38T:
	mov	WDTC, #0a7h	;12C
D37T:
	mov	WDTC, #0a7h	;12C
D36T:
	mov	WDTC, #0a7h	;12C
D35T:
	mov	WDTC, #0a7h	;12C
D34T:
	mov	WDTC, #0a7h	;12C
D33T:
	mov	WDTC, #0a7h	;12C
D32T:
	mov	WDTC, #0a7h	;12C
D31T:
	mov	WDTC, #0a7h	;12C
D30T:
	mov	WDTC, #0a7h	;12C
D29T:
	mov	WDTC, #0a7h	;12C
D28T:
	mov	WDTC, #0a7h	;12C
D27T:
	mov	WDTC, #0a7h	;12C
D26T:
	mov	WDTC, #0a7h	;12C
D25T:
	mov	WDTC, #0a7h	;12C
D24T:
	mov	WDTC, #0a7h	;12C
D23T:
	mov	WDTC, #0a7h	;12C
D22T:
	mov	WDTC, #0a7h	;12C
D21T:
	mov	WDTC, #0a7h	;12C
D20T:
	mov	WDTC, #0a7h	;12C
D19T:
	mov	WDTC, #0a7h	;12C
D18T:
	mov	WDTC, #0a7h	;12C
D17T:
	mov	WDTC, #0a7h	;12C
D16T:
	mov	WDTC, #0a7h	;12C
D15T:
	mov	WDTC, #0a7h	;12C
D14T:
	mov	WDTC, #0a7h	;12C
D13T:
	mov	WDTC, #0a7h	;12C
D12T:
	mov	WDTC, #0a7h	;12C
D11T:
	mov	WDTC, #0a7h	;12C
D10T:
	mov	WDTC, #0a7h	;12C
D9T:
	mov	WDTC, #0a7h	;12C
D8T:
	mov	WDTC, #0a7h	;12C
D7T:
	mov	WDTC, #0a7h	;12C
D6T:
	mov	WDTC, #0a7h	;12C
D5T:
	mov	WDTC, #0a7h	;12C
D4T:
	mov	WDTC, #0a7h	;12C
D3T:
	mov	WDTC, #0a7h	;12C
D2T:
	; lcall	; 16C
	ret		; 8C		24C  2T
;======================================================================
;======================================================================
;-----------------------------------------------------------------------
;延时一个etu
;入口参数:	波特率(bps) 9600:124T/19200:62T/38400:31T/57600:20.67T/115200:10.33T/111600/55930
;						1488C /744C     /372      /248C        /124C         /128C  /255C
;出口参数:	无
;-----------------------------------------------------------------------
	;(外部指令)	 		 3 3
;	;call Detu  			;2 5
;Detu:
;	mov     R3,A			;1 6
;
;	mov	WDTC, #0a7h		;2 8		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
;	nop					;1 9
;
;	mov	A,bps			;1 10
;	jb	ACC.2,Detu57600	;2 12
;	jb	ACC.1,Detu38400	;2 14
;	jb	ACC.0,Detu19200	;2 16
;Detu9600:
;	mov	R4,#51			;1 17
;	jmp	Detuloop			;2 19	19+3+51*2 = 124
;Detu19200:
;	mov	R4,#20			;1 17
;	jmp	Detuloop			;2 19	19+3+20*2 = 62
;Detu38400:
;	mov	R4,#5			;1 15
;	nop					;1 16
;	jmp	Detuloop			;2 18	18+3+5*2 = 31
;Detu57600:
;	mov	R4, #2			;2 14 	14+3+2*2 = 21
;Detuloop:
;	djnz	R4,Detuloop;		;2*R0
;
;DetuEND:
;
;	mov     A,R3			;1
;
;	ret					;2 3
;--------------------------------------------------
;入口参数:	波特率(bps) 9600:124T/19200:62T/38400:31T/57600:20.67T/115200:10.33T/111600/55930
;						1488C /744C     /372      /248C        /124C         /128C  /255C

	;lcall Detu  			;16C
	;(外部指令)	 		;12C	28
Detu:
	nop		 			;4C	32
	nop		 			;4C	36
Detu_8:
	mov     R3,A			;4C	40

	mov	WDTC, #0a7h		;12C	52

	mov	A,bps			;8C	60
	jb	ACC.3,Detu115200	;16C	76
	jb	ACC.4,Detu111600	;16C	92
	jb	ACC.2,Detu57600	;16C	108
	jb	ACC.5,Detu55930	;16C	124
	jb	ACC.1,Detu38400	;16C	140
	jb	ACC.0,Detu19200	;16C	156
Detu9600:
	mov	R4,#108			;8C	164
	ljmp	Detuloop			;16C	180	180+108*12+12=1488
Detu19200:
	mov	R4,#46			;8C	164
	ljmp	Detuloop			;16C	180	180+46*12+12=744
Detu38400:
	mov	R4,#16			;8C	148
	nop					;4C	152
	ljmp	Detuloop			;16C	168	168+16*12+12=372
Detu55930:
	mov	R4, #8			;8C	132
	ljmp	Detuloop			;16C	148	148+8*12+12=256
Detu57600:
	mov	R4, #8			;8C	116
	nop					;4C	120
	nop					;4C	124
	ljmp	Detuloop			;16C	140	140+8*12+12=248
Detu111600:
	mov	R4, #2			;8C	100
	ljmp	DetuEND			;16C	116	116+12=128
Detu115200:
	mov	R4, #2			;8C	84
	nop					;4C	88	88+2*12+12=124

Detuloop:
	djnz	R4,Detuloop;		;12C

DetuEND:

	mov     A,R3			;4C

	ret					;8C	12

;======================================================================
;-----------------------------------------------------------------------
;接收PC一个字符
;rPCbyte
;入口参数:	无
;出口参数:	(R7)输出字符
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
;----------------------------------------------------
rPCbyte:
	setb P3.1
	setb P3.0
	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jnb  P3.0,rPCbyte;等待停止位
rPC57600:
	jnb  P3.0,rPC57600_next;等待一个起始位

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jnb  P3.0,rPC57600_next;等待一个起始位

rPC:
	mov	R3,#255
	jnb  P3.0,rPC57600_next;等待一个起始位
	mov	R4,#0
rPC57600_begin:
	jnb   P3.0,rPC57600_next;等待一个起始位  	2
	djnz	 R4,rPC57600_begin;			2 4*256=1024
	jnb   P3.0,rPC57600_next;等待一个起始位	2

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jnb   P3.0,rPC57600_next;16C	等待一个起始位	2
	djnz  R3,rPC57600_begin;			2 1028*197=202516
	jmp    rPC57600_err1
rPC57600_next:
	clr 	ET0				;8C	24
	jb   P3.0,rPC57600_begin	;16C	40	延时0.25etu 再检起始位 2 4
	mov	WDTC, #0a7h		;12C 52
	mov	WDTC, #0a7h		;12C 64
	jb   P3.0,rPC57600_begin	;16C	80	延时0.25etu 再检起始位 2 7

	lcall	D16T			;192	272

	clr  a				;4C 276
								; 57600bps 1etu=276C
;;      接收第0位
	lcall     recvPC1bit
	rrc      a			;4C
;;      接收第1位
	lcall     recvPC1bit
	rrc      a
;;      接收第2位
	lcall     recvPC1bit
	rrc      a
;;      接收第3位
	lcall     recvPC1bit
	rrc      a
;;      接收第4位
	lcall     recvPC1bit
	rrc      a
;;      接收第5位
	lcall     recvPC1bit
	rrc      a
;;      接收第6位
	lcall     recvPC1bit
	rrc      a
;;      接收第7位
	lcall     recvPC1bit
	rrc      a
;       接收奇偶位(未比较)
	lcall     recvPC1bit
;	clr  STATE_FLAG
;;           call etu05;   接收停止位
;;           jb   I_O,rb_end
;            call recvbit
;            jc   rb_end
rb57600_end:
	mov  r7,a;   保存数据
	ret
rPC57600_err:
rPC57600_err0:
rPC57600_err1:
	clr  ET0
	setb STATE_FLAG;停止位错
	jmp  rb57600_end
;-----------------------------------------------------------------------
;接收1位(57600bps -- 23T)	23*12=276C
;    外部(rrc      a)     4C

	;lcall	 		 16C	20
recvPC1bit:
	push    ACC     	;8C	28
	clr     A 		;4C	32

	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C	48

	mov     C,P3.0		;8C
	addc    A,#0		;8C	16

	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C	36

	mov     C,P3.0		;8C
	addc    A,#0		;8C	16

	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C	36

	mov     C,P3.0		;8C
	addc    A,#0		;8C	16

	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C
	mov	WDTC, #0a7h	;12C	48

	mov     C,ACC.1 	;8C
	nop				;4C
	pop     ACC     	;8C
	ret       		;8C	28
					;	32+48+16+36+16+36+16+48+28=276
;======================================================================
;-----------------------------------------------------------------------
;接收PC一个字符
;rPCfirstbyte
;入口参数:	无
;出口参数:	(R7)输出字符
;-----------------------------------------------------------------------
IC_SW1_OFF:
	jnb  P3.0,rPCfirst_next;等待一个起始位
	clr  IC_RST1;
	jnb  P3.0,rPCfirst_next;等待一个起始位
	clr  IC_IO1;
        jnb  P3.0,rPCfirst_next;等待一个起始位
        setb Clk_Ctr;
        jnb  P3.0,rPCfirst_next;等待一个起始位
	setb IC_PWR1;;
	jnb  P3.0,rPCfirst_next;等待一个起始位
	clr  CPU1_REST_FLAG;
	jmp rPCf

IC_SW2_OFF:
;	jnb  P3.0,rPCfirst_next;等待一个起始位
	clr  IC_RST2;
;	jnb  P3.0,rPCfirst_next;等待一个起始位
	clr  IC_IO2
;	jnb  P3.0,rPCfirst_next;等待一个起始位
	clr  CPU2_REST_FLAG;
;	jnb  P3.0,rPCfirst_next;等待一个起始位
	setb IC_PWR2;
	jmp rPCf
;        ret
;----------------------------------------------------
rPCfirstbyte:
	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
	setb P3.1
	setb P3.0
	jnb  P3.0,rPCfirstbyte;等待停止位
rPCfirst:

	mov	WDTC, #0a7h	;2		//ebable WDT and set time periods with PS[2:0]=111 (262.144ms)

	jnb  P3.0,rPCfirst_next;等待一个起始位
	jb   IC_SW1,IC_SW1_OFF
	jnb  P3.0,rPCfirst_next;等待一个起始位
	jb   IC_SW2,IC_SW2_OFF

rPCf:
	jnb  P3.0,rPCfirst_next;等待一个起始位
	jb   P3.0,rPCfirst;等待一个起始位

rPCfirst_next:
	clr 	ET0				;8C	24
	jb   P3.0,rPCfirst	;16C	40	延时0.25etu 再检起始位 2 4
	mov	WDTC, #0a7h		;12C 52
	mov	WDTC, #0a7h		;12C 64
	jb   P3.0,rPCfirst	;16C	80	延时0.25etu 再检起始位 2 7

	lcall	D16T			;192	272

	clr  a				;4C 276

;;      接收第0位
	lcall     recvPC1bit
	rrc      a
;;      接收第1位
	lcall     recvPC1bit
	rrc      a
;;      接收第2位
	lcall     recvPC1bit
	rrc      a
;;      接收第3位
	lcall     recvPC1bit
	rrc      a
;;      接收第4位
	lcall     recvPC1bit
	rrc      a
;;      接收第5位
	lcall     recvPC1bit
	rrc      a
;;      接收第6位
	lcall     recvPC1bit
	rrc      a
;;      接收第7位
	lcall     recvPC1bit
	rrc      a
;       接收奇偶位(未比较)
	lcall     recvPC1bit
;        clr  STATE_FLAG
;;           call etu05;   接收停止位
;;           jb   I_O,rb_end
;            call recvbit
;            jc   rb_end
rPCfirst_end:
	mov  r7,a;   保存数据
	ret
;======================================================================
;----------------------------------------------------------------------
;发送PC一个字符
;sPCbyte
;入口参数:	(R7)输入字符
;出口参数:	无
;----------------------------------------------------------------------
_sPCbyte:		;// 20T 57600bps 1 etu = 1000000/57600 = 17.36us = 17.36*16/12T = 23.15T
	setb        P3.0
	setb        P3.1
	jnb         P3.0,_sPCbyte

	clr         STATE_FLAG
	lcall D23T;(11个call)字节之间(间隙)延时为12etu(含停止位)
	lcall D23T

	mov   a,r7;data byte

	clr   ET0

	clr   P3.1			;8C 发送起始位
	lcall  D22T

	rrc  a     ;发送第0位	;4C
	mov  P3.1,C			;8C
	lcall D22T			;22*12

	rrc  a     ;发送第1位
	mov  P3.1,C
	lcall D22T			;20 23

	rrc  a     ;发送第2位
	mov  P3.1,C
	lcall D22T			;20 23

	rrc  a     ;发送第3位
	mov  P3.1,C
	lcall D22T			;20 23

	rrc  a     ;发送第4位
	mov  P3.1,C
	lcall D22T			;20 23

	rrc  a     ;发送第5位
	mov  P3.1,C
	lcall D22T			;20 23

	rrc  a     ;发送第6位
	mov  P3.1,C
	lcall D22T			;20 23

	rrc  a     ;发送第7位
	mov  P3.1,C
	lcall D21T

	nop					;4C
	mov  a,r7    			;4C	发送奇偶位位
	mov  C,P				;8C
	mov  P3.1,C			;8C
	lcall D22T			;20 23

	nop					;4C
	setb P3.1     			;8C	发送停止位
	lcall D30T;D23T			;20 23
	lcall D30T;D23T

	ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 20030613 改 发60为发一个起始位
sPC60:
	setb        P3.0
	setb        P3.1
	jnb         P3.0,sPC60


	clr   P3.1; 发送起始位
	lcall  D22T

	nop			;4C
	setb P3.1     	;8C	发送停止位

	ret

;------------------------------------------
;				call		16C
D43000C:			; 14*256*12=43008
	push	01h		; 8C
	push	00h		; 8C
	mov	r0, #0	; 8C
	mov	r1, #0	; 8C
D43L:
	djnz	r0, D43L	; 12C 12C*256 = 3072C
	djnz	r1, D43L	; 12C 12C*256 = 3072C
	mov	WDTC, #0a7h;12C	 //ebable WDT and set time periods with PS[2:0]=111 (262.144ms)
	pop	01h		; 8C
	pop	00h		; 8C
	ret			; 8C

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	end

⌨️ 快捷键说明

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