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

📄 pl80.asm

📁 上载的源程序是一款加油机源程序,它已在产品上使用并已经通过了测试.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	clr Buffer1
	NOP
	NOP
	NOP
	NOP
	mov a,p0
	RR a
	RR a
	anl a,#00111000B
	orl 00H,a
	Setb Buffer1
	;Bus Closed.
	;2nd keyboard Stored-Side 1

	;2nd keyboard Stored in R0 (00,K3,K2,K1(Side1),K3,K2,K1(Side2))
	;1st keyboard Stored in Keyboard register (00,K3,K2,K1(Side1),K3,K2,K1(Side2))

	mov a,R0
	mov r1,#keyboard
	xrl a,@r1
	cpl a
	clr acc.6
	clr acc.7
	;Now , ACC is Reliability of Keyboard Register (1:Reliable,0:Invalid)
	;1st keyboard Stored in Keyboard register (00,K3,K2,K1(Side1),K3,K2,K1(Side2))

	mov r1,#ReliableKey
	mov @r1,a
	mov r1,#Keyboard
	mov a,@r1
	cpl a
	clr acc.6
	clr acc.7
	mov r1,#Keyboard
	mov @r1,a
	;Now , ACC is Reliability of Keyboard Register (1:Reliable,0:Invalid)
	;keyboard-Result Stored in Keyboard register (00,K3,K2,K1(Side1),K3,K2,K1(Side2))
	;Pressed Keys:1 - UnPressed Keys:0 .

	Ret

;========== Rutin ===========
READ_EEPROM:
	;READ_EEPROM_SUB.
	;Input:EEPROM_ADDRESS_H,EEPROM_ADDRESS_L.
	;Output:EEPROM_DATA.
	;Uses:Acc,R0,Carry.

	LCALL	START_CONDITION_EEPROM

	mov   A,#0A0H     ;(1010,0,0,0,R/W=0)
	LCALL EEPROM_SEND_BYTE

	MOV   R0,#EEPROM_ADDRESS_H
	MOV	A,@R0
	LCALL EEPROM_SEND_BYTE

	MOV   R0,#EEPROM_ADDRESS_L
	MOV	A,@R0
	LCALL EEPROM_SEND_BYTE

	LCALL	START_CONDITION_EEPROM

	mov   A,#0A1H     ;(1010,0,0,0,R/W=1)
	LCALL EEPROM_SEND_BYTE

	MOV   R0,#008H
GET_DATA_BIT_EEPROM:
	SETB  PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK

	MOV   C,PIN_SERIAL_DATA

	CLR   PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK
	RLC	A
	DJNZ  R0,GET_DATA_BIT_EEPROM
	MOV   R0,#EEPROM_DATA
	MOV	@R0,A

	LCALL	STOP_CONDITION_EEPROM
	RET

;========== Rutin ===========
WRITE_EEPROM:
	;WRITE_EEPROM_SUB
	;Input:EEPROM_ADDRESS_H,EEPROM_ADDRESS_L,EEPROM_DATA.
	;Output:-
	;Uses:Acc,R0.

	LCALL	START_CONDITION_EEPROM

	mov   A,#0A0H     ;(1010,0,0,0,R/W=0)
	LCALL EEPROM_SEND_BYTE

	MOV   R0,#EEPROM_ADDRESS_H
	MOV	A,@R0
	LCALL EEPROM_SEND_BYTE

	MOV   R0,#EEPROM_ADDRESS_L
	MOV	A,@R0
	LCALL EEPROM_SEND_BYTE

	MOV   R0,#EEPROM_DATA
	MOV	A,@R0
	LCALL EEPROM_SEND_BYTE

	LCALL	STOP_CONDITION_EEPROM
	LCALL DELAY_W
	RET

;////////////////////
DELAY_W:
	;Delay 15 msec for Writing Data in Flash.
	;For Read & Write Flash Rutin.

	PUSH	7
	PUSH  6
	PUSH	PSW

	MOV	R7,#15
DELAY_REPEAT_R7:
	MOV   R6,#000
DELAY_REPEAT_R6:
	NOP
      NOP
      DJNZ  R6,DELAY_REPEAT_R6
      DJNZ  R7,DELAY_REPEAT_R7

	POP	PSW
	POP   6
	POP	7
	RET

;////////////////////
START_CONDITION_EEPROM:
	;START_CONDITION_EEPROM_SUB
	;For Read & Write Flash Rutin.

	CLR   PIN_SERIAL_CLOCK
	SETB  PIN_SERIAL_DATA
	SETB  PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK

	CLR   PIN_SERIAL_DATA
	LCALL EEPROM_DELAY_CLOCK
	RET

;////////////////////
STOP_CONDITION_EEPROM:
	;STOP_CONDITION_EEPROM_SUB
	;For Read & Write Flash Rutin.

	CLR   PIN_SERIAL_CLOCK
	CLR   PIN_SERIAL_DATA
	SETB  PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK

	SETB  PIN_SERIAL_DATA
	LCALL EEPROM_DELAY_CLOCK
	RET

;////////////////////
EEPROM_SEND_BYTE:
	;EEPROM_SEND_BYTE_SUB
	;For Read & Write Flash Rutin.

	CLR   PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK
	MOV   R0,#008H
AGAIN_EEPROM:
	RLC	A
	MOV   PIN_SERIAL_DATA,C

	SETB  PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK
	CLR   PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK
	DJNZ  R0,AGAIN_EEPROM

	SETB  PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK

	MOV   C,PIN_SERIAL_DATA
	MOV   FLAG_ACK_EEPROM_ERROR,C

	CLR   PIN_SERIAL_CLOCK
	LCALL EEPROM_DELAY_CLOCK

	RET

;////////////////////
EEPROM_DELAY_CLOCK:
	;EEPROM_DELAY_CLOCK_SUB
	;For Read & Write Flash Rutin.

	NOP
	NOP
	RET

;========== Rutin ===========
disp_result:
	;Display Result of Calculate-Rutin on LCD.
	;This rutin Should Be Run after calculate-Rutin Immediately.
	;Map:
	;Total Price---> (BCD_Buffer=BB , is a Byte , Indirect) BB_6.BB_5.BB_4.BB_3.BB_2.BB_1
	;Liter--------------> (Tempr=Tr , is a Byte ,  Direct ) Tr6&Tr5.Tr4&Tr3.Tr2&Tr1
	;Unit Price--------------------> (is a byte , Indirect) UPH.UPL
	;Uses:Acc,R1,Display(Rutin).

	;Displaying Side1
	mov r1,#UPL
	mov a,@r1
	swap a
	mov r1,#datas1_7
	mov @r1,a

	mov r1,#UPH
	mov a,@r1
	swap a
	mov r1,#datas1_6
	mov @r1,a

	mov a,tempr2
	swap a
	orl a,tempr1
	swap a
	mov r1,#datas1_5
	mov @r1,a

	mov a,tempr4
	swap a
	orl a,tempr3
	swap a
	mov r1,#datas1_4
	mov @r1,a

	mov a,tempr6
	swap a
	orl a,tempr5
	swap a
	mov r1,#datas1_3
	mov @r1,a

	mov r1,#BCD_BUFFER_2
	mov a,@r1
	swap a
	mov r1,#datas1_2
	mov @r1,a

	mov r1,#BCD_BUFFER_3
	mov a,@r1
	swap a
	mov r1,#datas1_1
	mov @r1,a

	mov r1,#BCD_BUFFER_4
	mov a,@r1
	swap a
	mov r1,#datas1_0
	mov @r1,a

	lcall clr_zero
	lcall display

	Ret

;========== Rutin ===========
Calculate:

	;1)makes a Copy of Right Pulses.Change it To Hex.
	;2)Makes a Copy of Unit Price. Change it To Hex.
	;3)Multiplys Liter and UPrice in HEX Mode.
	;4)Changes Result to BCD Mode.
	;Inputs:UnitPrice(Decimal),RightPulse(Decimal).
	;OutPut:Total Price (Decimal).
	;Uses:Acc,R1,Copyright1(Rutins),Multiply(Rutin),BCD_2_HEX(Rutin),HEX_2_BCD(Rutin).

	;Preparing Mazroob(Liter) for Multiplying...
	;Capturing...
	JNB flag_Trust_S1,No_Pre_S1
	mov R1,#Liter_H
	mov a,@R1
	mov Tempr5,a
	anl Tempr5,#0FH
	swap a
	mov Tempr6,a
	anl Tempr6,#0FH

	mov R1,#Liter_M
	mov a,@R1
	mov Tempr3,a
	anl Tempr3,#0FH
	swap a
	mov Tempr4,a
	anl Tempr4,#0FH

	mov R1,#Liter_L
	mov a,@R1
	mov Tempr1,a
	anl Tempr1,#0FH
	swap a
	mov Tempr2,a
	anl Tempr2,#0FH
	jmp hhh11

No_Pre_S1:
	Lcall Copyright1


hhh11:
	;Tempr1-6 is Ready...
	;Now , Checking for 8 Pulses in 1st...
	;If We are in 8 1st Pulses, Tempr1-6 will Overwrite with "0".
	mov a,Tempr3
	JNZ Ready_4_Calculate
	mov a,Tempr4
	JNZ Ready_4_Calculate
	mov a,Tempr5
	JNZ Ready_4_Calculate
	mov a,Tempr6
	JNZ Ready_4_Calculate

	mov a,tempr2
	mov b,#10
	MUL AB
	add a,tempr1

	Clr C
	subb a,#8
	jnb acc.7,Ready_4_Calculate
	;we are in 8 pulses...
	mov Tempr1,#00H
	mov Tempr2,#00H
	mov Tempr3,#00H
	mov Tempr4,#00H
	mov Tempr5,#00H
	mov Tempr6,#00H

	;Now , Go Ahead for Calculate & Multiply...
Ready_4_Calculate:
	mov a,Tempr2
	swap a
	orl a,Tempr1
	mov r1,#BCD_BUFFER_1
	mov @r1,a

	mov a,Tempr4
	swap a
	orl a,Tempr3
	mov r1,#BCD_BUFFER_2
	mov @r1,a

	mov a,Tempr6
	swap a
	orl a,Tempr5
	mov r1,#BCD_BUFFER_3
	mov @r1,a

	Lcall BCD_2_Hex

	mov r1,#HEX_BUFFER_1
	mov a,@r1
	mov r1,#HEX_MAZROOB_1
	mov @r1,a

	mov r1,#HEX_BUFFER_2
	mov a,@r1
	mov r1,#HEX_MAZROOB_2
	mov @r1,a

	mov r1,#HEX_BUFFER_3
	mov a,@r1
	mov r1,#HEX_MAZROOB_3
	mov @r1,a


	;Preparing Mazroobonfih(Unit Price) for Multiplying...
	mov r1,#UPL
	mov a,@r1
	mov r1,#BCD_BUFFER_1
	mov @r1,a

	mov r1,#UPH
	mov a,@r1
	mov r1,#BCD_BUFFER_2
	mov @r1,a

	mov r1,#BCD_BUFFER_3
	mov @r1,#00H

	Lcall BCD_2_Hex

	mov r1,#HEX_BUFFER_1
	mov a,@r1
	mov r1,#HEX_MAZROOBONFIH_1
	mov @r1,a

	mov r1,#HEX_BUFFER_2
	mov a,@r1
	mov r1,#HEX_MAZROOBONFIH_2
	mov @r1,a

	;Preparing Multiply...
	Lcall Multiply
	Lcall Hex_2_BCD

	;Now , Multiplication-Result is Ready...
	;For Display: Look At This MAP (All Decimal):
	;Total Price---> (BCD_Buffer=BB , is a Byte , Indirect) BB_6.BB_5.BB_4.BB_3.BB_2.BB_1
	;Liter--------------> (Tempr=Tr , is a Byte ,  Direct ) Tr6&Tr5.Tr4&Tr3.Tr2&Tr1
	;Unit Price--------------------> (is a byte , Indirect) UPH.UPL

	Ret

;========== Rutin ===========
BCD_2_HEX:

	;CONVERTS 3 BCD BYTE TO 3 HEX BYTE.
	;INPUTS:
	; BCD_BUFFER_1         ;LOW  BYTE OF BCD VALUE.
	; BCD_BUFFER_2         ;MID  BYTE OF BCD VALUE.
	; BCD_BUFFER_3         ;HIGH BYTE OF BCD VALUE.
	;OUTPUS:
	; HEX_BUFFER_1         ;LOW  BYTE OF HEX VALUE.
	; HEX_BUFFER_2         ;MID  BYTE OF HEX VALUE.
	; HEX_BUFFER_3         ;HIGH BYTE OF HEX VALUE.
	;USES:R0,R1,ACC,B.

DO_ZERO_HEX_BUFFER:
	MOV   R1,#(HEX_BUFFER_3 - 1)
LOOP_DO_ZERO_HEX_BUFFER:
	INC	R1
	MOV   @R1,#000H
	CJNE	R1,#HEX_BUFFER_1,LOOP_DO_ZERO_HEX_BUFFER ;PLACE ZERO IN OUTPUT BUFFERS.

	MOV	R1,#BCD_BUFFER_1
	MOV	A,@R1
	MOV	B,#000
	LCALL	FIND_HEX_BUFFER

	MOV	R1,#BCD_BUFFER_1
	MOV	A,@R1
	SWAP	A
	MOV	B,#003
	LCALL	FIND_HEX_BUFFER

	MOV	R1,#BCD_BUFFER_2
	MOV	A,@R1
	MOV	B,#006
	LCALL	FIND_HEX_BUFFER

	MOV	R1,#BCD_BUFFER_2
	MOV	A,@R1
	SWAP	A
	MOV	B,#009
	LCALL	FIND_HEX_BUFFER

	MOV	R1,#BCD_BUFFER_3
	MOV	A,@R1
	MOV	B,#012
	LCALL	FIND_HEX_BUFFER

	MOV	R1,#BCD_BUFFER_3
	MOV	A,@R1
	SWAP	A
	MOV	B,#015
	LCALL	FIND_HEX_BUFFER

	RET

;////////////////////
	;FIND_HEX_BUFFER_SUB (Belonges to BCD_2_HEX Rutin).
	;INPUTS: ACC,B.
	;OUTPUS:
	; HEX_BUFFER_1         ;LOW  BYTE OF HEX VALUE.
	; HEX_BUFFER_2         ;MID  BYTE OF HEX VALUE.
	; HEX_BUFFER_3         ;HIGH BYTE OF HEX VALUE.
	;USES:R0,R1,ACC,B.

FIND_HEX_BUFFER:
	ANL	A,#00FH
	JZ	EXIT_LOOP_FIND_HEX_BUFFER
	MOV	R0,A

LOOP_FIND_HEX_BUFFER:
	MOV	A,B
	LCALL	LOOK_UP_BCD_2_HEX
	MOV	R1,#HEX_BUFFER_1
	ADD	A,@R1
	MOV   @R1,A

	MOV	A,B
	INC	A
	LCALL	LOOK_UP_BCD_2_HEX
	MOV	R1,#HEX_BUFFER_2
	ADDC	A,@R1
	MOV   @R1,A

	MOV	A,B
	INC	A
	INC	A
	LCALL	LOOK_UP_BCD_2_HEX
	MOV	R1,#HEX_BUFFER_3
	ADDC	A,@R1
	MOV   @R1,A

	DJNZ 	R0,LOOP_FIND_HEX_BUFFER

EXIT_LOOP_FIND_HEX_BUFFER:

	RET

;////////////////////
	;LOOK_UP_BCD_2_HEX_SUB (Belonges to BCD_2_HEX Rutin).
	;INPUTS: ACC.
	;OUTPUS: ACC.

LOOK_UP_BCD_2_HEX:
	INC     A
	MOVC    A,@A+PC         ;If Acc.=0 then it will return 00
	RET

	DB	001H
	DB	000H
	DB	000H

	DB	00AH
	DB	000H
	DB	000H

	DB	064H
	DB	000H
	DB	000H

	DB	0E8H
	DB	003H
	DB	000H

	DB	010H
	DB	027H
	DB	000H

	DB	0A0H
	DB	086H
	DB	001H

;========== Rutin ===========
HEX_2_BCD:

	;CONVERTS 6 HEX BYTE TO 6 BCD BYTE.
	;INPUTS:
	; HEX_BUFFER_1         ;LOW  BYTE OF HEX VALUE.
	; HEX_BUFFER_2         ;MID1 BYTE OF HEX VALUE.
	; HEX_BUFFER_3         ;MID2 BYTE OF HEX VALUE.
	; HEX_BUFFER_4         ;MID3 BYTE OF HEX VALUE.
	; HEX_BUFFER_5         ;MID4 BYTE OF HEX VALUE.
	; HEX_BUFFER_6         ;HIGH BYTE OF HEX VALUE.
	;OUTPUS:
	; BCD_BUFFER_1         ;LOW  BYTE OF BCD VALUE.
	; BCD_BUFFER_2         ;MID1 BYTE OF BCD VALUE.
	; BCD_BUFFER_3         ;MID2 BYTE OF BCD VALUE.
	; BCD_BUFFER_4         ;MID3 BYTE OF BCD VALUE.
	; BCD_BUFFER_5         ;MID4 BYTE OF BCD VALUE.
	; BCD_BUFFER_6         ;HIGH BYTE OF BCD VALUE.
	;USES:R0,R1,R2,ACC,Carry.

DO_ZERO_BCD_BUFFER:
	MOV   R1,#(BCD_BUFFER_6 - 1)
LOOP_DO_ZERO_BCD_BUFFER:
	INC	R1
	MOV   @R1,#000H
	CJNE	R1,#BCD_BUFFER_1,LOOP_DO_ZERO_BCD_BUFFER	;PLACE ZERO IN OUTPUT BUFFERS.

	MOV   R2,#0048		;NUMBER_BINBCD_BITS

ROTATE:
	CLR	C
	MOV   R1,#0006		;NUMBER_BINBCD_BYTES
	MOV   R0,#HEX_BUFFER_1

ROTATE_BIT1:
	MOV   A,@R0
	RLC   A
	MOV   @R0,A
	DEC   R0

	DJNZ  R1,ROTATE_BIT1

	MOV   R1,#0006		;NUMBER_BINBCD_BYTES
	MOV   R0,#BCD_BUFFER_1

ROTATE_BIT2:
	MOV   A,@R0
	ADDC  A,ACC
	DA    A
	MOV   @R0,A
	DEC   R0

	DJNZ  R1,ROTATE_BIT2
	DJNZ  R2,ROTATE

	RET

;========== Rutin ===========
Multiply:

	;Prepare :HEX_MAZROOBONFIH_n(2 Bytes) x HEX_MAZROOB_n(3 Bytes)=HEX_BUFFER_n(6 Bytes).
	;Inputs:
	; HEX_MAZROOBONFIH_1=LOW  BYTE OF HEX MAZROOBON FIH (Here is Unit.Price).
	; HEX_MAZROOBONFIH_2=HIGH BYTE OF HEX MAZROOBON FIH (Here is Unit.Price).
	; HEX_MAZROOB_1=LOW  BYTE OF HEX MAZROOB (Here is LITER).
	; HEX_MAZROOB_2=MID  BYTE OF HEX MAZROOB (Here is LITER).
	; HEX_MAZROOB_3=HIGH BYTE OF HEX MAZROOB (Here is LITER).
	;Outputs:
	; HEX_BUFFER_1=LOW  BYTE OF HEX BUFFER (Here is Total.Price).
	; HEX_BUFFER_2=MID1 BYTE OF HEX BUFFER (Here is Total.Price).
	; HEX_BUFFER_3=MID2 BYTE OF HEX BUFFER (Here is Total.Price).
	; HEX_BUFFER_4=MID3 BYTE OF HEX BUFFER (Here is Total.Price).
	; HEX_BUFFER_5=MID4 BYTE OF HEX BUFFER (Here is Total.Price).
	; HEX_BUFFER_6=HIGH BYTE OF HEX BUFFER (Here is Total.Price).
	;Uses:
	; HEX_MAZROOB_AID_1,HEX_MAZROOB_AID_2,Acc,R0,R1,R2,R3,Carry.

PRICE_CALCULATION:
	MOV   A,#000H
	MOV   R0,#002H
	MOV   R1,#HEX_MAZROOB_AID_2
ZERO_AID:
	MOV   @R1,A
	INC   R1
	DJNZ  R0,ZERO_AID     ;Places 0's in aid memory location

	MOV   R0,#006H
	MOV   R1,#HEX_BUFFER_6
ZERO_ANSWER:
	MOV   @R1,A
	INC   R1
	DJNZ  R0,ZERO_ANSWER  ;Places 0's in answer memory location

	MOV   R3,#NUMBER_MAZROOBONFIH_BITS

COMPUTE_LOOP:
	CLR   C
	MOV   R1,#006H
	MOV   R0,#HEX_BUFFER_1
ROTATE1:MOV A,@R0
	RLC   A
	MOV   @R0,A
	DEC   R0
	DJNZ  R1,ROTATE1      ;Shift answer one bit to left

	CLR   C
	MOV   R1,#002H
	MOV   R0,#HEX_MAZROOBONFIH_1
ROTATE2:MOV A,@R0
	RLC   A

	MOV   @R0,A
	DEC   R0
	DJNZ  R1,ROTATE2      ;Shift multiplier one bit to left

	JNC   NO_NEED_TO_ADD

	CLR   C
	MOV   R2,#006H
	MOV   R1,#HEX_BUFFER_1
	MOV   R0,#HEX_MAZROOB_1
ADD_BYTES:
	MOV   A,@R0
	ADDC  A,@R1
	MOV   @R1,A
	DEC   R0
	DEC   R1

	DJNZ  R2,ADD_BYTES    ;Adding 6 bytes of multiplication and
				    ;aided_multiplicand and place the result
				    ;in multiplication location
NO_NEED_TO_ADD:
	DJNZ  R3,COMPUTE_LOOP

	RET

;========== Rutin ===========
INCTot11:
	;Optional
	ret

;========== Rutin ===========
INCTot12:
	;Optional
	ret

;========== Rutin ===========
ResetPLS1:
	;Reset Pulser1 registers...
	setb RST1

⌨️ 快捷键说明

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