📄 pl80.asm
字号:
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 + -