	list      p=16f628           
	#include <p16f628.inc>        
	
	__CONFIG _CP_OFF & _WDT_ON & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _MCLRE_ON & _LVP_OFF

#define	IDAT	PORTB,0 	; 箫疣怆屙桢 耔沩嚯铎 DI
#define	ICLC	PORTB,1 	; 箫疣怆屙桢 耔沩嚯铎 SK

#DEFINE	VHOD	PORTB,2		;抡文 我 欣严信呐巳遗诉
#DEFINE	BANK0	BCF	STATUS,RP0	;率宿着腿� 晾褪� 0
#DEFINE	BANK1	BSF	STATUS,RP0	;率宿着腿� 晾褪� 1
CARRY  	equ 	0X00     	
	CBLOCK	0X20
	CNT1			;趟滥乩� 咦派世 炎乓兹世 乃韧� 忍嫌塑牙
	CNT2			;岩佬乩� 咦派世 炎乓兹世 乃韧� 忍嫌塑牙
	CNTZ1			;趟滥乩� � 岩佬乩� 咦派嗜 炎乓兹世 滦盘磐�
	CNTZ2			;抢呐衅嗜 吓信� 抢膛形� 乃韧� 忍嫌塑牙
	ACCaLO 			;吓信膛屯叟 妊衔塑怯盘叟 衔南形眯捞涛� 阉纹磐冗
	ACCaHI 	 
	ACCaHH 	 
	ACCbLO 	 
	ACCbHI 	 
	ACCbHH 	 
	ACCcLO			;吓信膛屯叟 妊衔塑怯盘叟 衔南形眯捞涛� 呐伺腿�
	ACCcHI  	
	ACCdLO  	
	ACCdHI  
	ACCdHH
	temp    
	sign    	
	count  	
	H_byte  	
	L_byte  
	R0      	        ; 吓信膛屯叟 妊衔塑怯盘叟 衔南形眯捞涛� 
	R1      		;闲盼列狼温劳冗 � 穆稳淄文叛咭茸哇� 氯�
	R2      	
	RBYTE		
	HSD			;吓信膛屯叟 妊衔塑怯盘叟 衔南形眯捞涛� 抢呐衅嗜
	SD			
	LSD			
	Flags	
	ENDC
	ORG	0X00		;屡室涡 蚜形牙
	GOTO	START
	ORG	0X04		;屡室涡 闲判勐劳冗
	GOTO	INTER
INTER	RETURN			;衔南形眯捞汤 瘟欣廖沂� 闲判勐劳冗
				; (闲判勐劳冗 团 妊衔塑怯抟堰)
;吓新瓮雷浪芡肋 屠岩形墒�
START	CLRF	PORTB		;瘟陀巳臆 衔幸 B
	BANK1
	MOVLW	B'00000100'	;RB2 - 抡文 , 窝依塑哇� 论瘴�
	MOVWF	TRISB
	BANK0
	CLRF	TMR0		;巫妊沂� 闲拍呐巳遗诉 � TMR0
	BANK1
	CLRWDT			;巫妊沂� 闲拍呐巳遗诉 � WDT
	MOVLW	B'11111110'	;饰菰. 呐伺腿� 1:64
	MOVWF	OPTION_REG	;闲拍呐巳遗塑 衔氖宿着� � WDT
	BANK0
	CALL	OCHIST		;瘟欣倥腿� � 衔南形眯捞膛 巫妊沂� 娜严伺�
NACH	CLRWDT			;巫妊沂� 闲拍呐巳遗诉 � WDT
	CALL	FRSCR		;论挛� 屠 娜严伺�
	CALL	CMETER		;抢膛� 吓腥文� 认铀苎�
;遗宋 闲蚊欣烫� 闲盼列狼温劳冗 � 论挛睦 屠 韧娜世椅�
	MOVF	CNT2,W
	movwf   ACCaHI
	MOVF	CNT1,W		; 抢眯忧世: ACCa = CNT
	movwf   ACCaLO
;DIV=4476276/CNT
	movlw   0X44
	movwf   ACCbHH
	movlw   0X4D
	movwf   ACCbHI
	movlw   0X74           	; 抢眯忧世: ACCb=4476276
	movwf   ACCbLO
	CALL 	DIVIS
;BCD
 	MOVF	ACCbHI,W
	movwf   H_byte
	MOVF	ACCbLO,W
	movwf   L_byte         
	call    B2_BCD         
	MOVF	CNTZ1,W		;CNTZ--->ACCa
	MOVWF	ACCaLO
	MOVF	CNTZ2,W
	MOVWF	ACCaHI
	MOVF	CNT1,W		;CNT--->ACCb
	MOVWF	ACCbLO
	MOVF	CNT2,W
	MOVWF	ACCbHI
	CALL	ADDIT		;阉纹磐扰 - 信怯塑依� � ACCa
	CLRF	ACCbHI		;0006H ---> ACCb
	MOVLW	0X06
	MOVWF	ACCbLO
	CALL	DBL_MPYS	;犹臀婆腿� - 信怯塑依� � ACCb,ACCc (32徼蜞)
	MOVF	ACCcLO,W	;信怯塑依� 犹臀婆腿� --->ACCa
	MOVWF	ACCaLO
	MOVF	ACCcHI,W
	MOVWF	ACCaHI
	MOVF	ACCbLO,W
	MOVWF	ACCaHH
	MOVLW	0X0C		;闲� 0C4B03 � ACCB - 瘟臀滤磐扰 韧娜世椅欣 世颇叟 0,9 雅�
	MOVWF	ACCbHH
	MOVLW	0X4B
	MOVWF	ACCbHI
	MOVLW	0X03
	MOVWF	ACCbLO
	CALL	D_SUB		;信怯塑依� � ACCb
	MOVLW	D'016'
	MOVWF	ACCaLO
	CLRF	ACCaHI
				;呐伺腿� 闲拍勰淤琶� 信怯塑依依
	CALL	DIVIS		;屠 16 , 信怯塑依� � ACCb
	MOVF	ACCbLO,W	;闲拍勰淤壬 信怯塑依� --->HSD ,LSD
	MOVWF	LSD
	MOVF	ACCbHI,W
	MOVWF	HSD
	CALL	DELAY
	GOTO 	NACH
CMETER	CLRF	CNT1 		;瘟陀伺腿� 炎乓兹饰�
	CLRF	CNT2 	
	CLRF	CNTZ1 	
	CLRF	CNTZ2 	
	BTFSS 	VHOD
	GOTO	SIG0		;抡=0
	NOP
SIG1	INCFSZ	CNTZ1,F		;勇潘茸磐扰 趟滥嘏梦 欣切吣� 炎乓兹世 屠 1 �
	GOTO	LOOP7		;闲温判世 琶� 屠 吓信衔送磐扰
	INCF	CNTZ2,F		;勇潘茸磐扰 岩佬嘏梦 欣切吣�
LOOP7	BTFSC	VHOD		;衔妊� 我�. 孕瓮依
	GOTO	SIG1		;团�
	NOP
LOOP3	INCFSZ	CNT1,F		;勇潘茸磐扰 趟滥嘏梦 欣切吣� 炎乓兹世 屠 1 �
	GOTO	LOOP8		;闲温判世 琶� 屠 吓信衔送磐扰
	INCF	CNT2,F		;勇潘茸磐扰 岩佬嘏梦 欣切吣�
LOOP8	BTFSS	VHOD		;炎纫酪� 衔世 我�. 讶猛浪
	GOTO	LOOP3
	NOP	
LOOP4	INCFSZ	CNT1,F		;勇潘茸磐扰 趟滥嘏梦 欣切吣� 炎乓兹世 屠 1 �
	GOTO	LOOP9		;闲温判世 琶� 屠 吓信衔送磐扰
	INCF	CNT2,F		;勇潘茸磐扰 岩佬嘏梦 欣切吣�
LOOP9	BTFSC	VHOD		;炎纫酪� 衔世 衔宋�. 讶猛浪
	GOTO	LOOP4	
	RETURN
SIG0	INCFSZ	CNTZ1,F		;勇潘茸磐扰 趟滥嘏梦 欣切吣� 炎乓兹世 屠 1 �
	GOTO	LOOP1		;闲温判世 琶� 屠 吓信衔送磐扰
	INCF	CNTZ2,F		;勇潘茸磐扰 岩佬嘏梦 欣切吣�
LOOP1	BTFSS	VHOD		;衔妊� 衔宋�. 孕瓮依
	GOTO	SIG0		;团�
	NOP
LOOP2	INCFSZ	CNT1,F		;勇潘茸磐扰 趟滥嘏梦 欣切吣� 炎乓兹世 屠 1 �
	GOTO	LOOP5		;闲温判世 琶� 屠 吓信衔送磐扰
	INCF	CNT2,F		;勇潘茸磐扰 岩佬嘏梦 欣切吣�
LOOP5	BTFSC	VHOD		;炎纫酪� 衔世 衔宋�. 讶猛浪
	GOTO	LOOP2
	NOP	
LOOP6	INCFSZ	CNT1,F		;勇潘茸磐扰 趟滥嘏梦 欣切吣� 炎乓兹世 屠 1 �
	GOTO	LOOP10		;闲温判世 琶� 屠 吓信衔送磐扰
	INCF	CNT2,F		;勇潘茸磐扰 岩佬嘏梦 欣切吣�
LOOP10	BTFSS	VHOD		;炎纫酪� 衔世 我�. 讶猛浪
	GOTO	LOOP6	
	RETURN
FRSCR	MOVLW	0XAA
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	MOVF	R1,W
	CALL	INDC	
	SWAPF	R1,W
	CALL	INDC
	MOVF	R2,W
	CALL	INDC	
	SWAPF	R2,W
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	MOVLW	0XAA
	CALL	INDC
	RETURN
INDC	bsf 	ICLC		; CLK � 礤嚓蜩忭铄 耦耱��龛�
	andlw	0xF0
	movwf 	temp		; 耦躔囗桁 镱赅...
	SWAPF	temp,F
	movlw 	0Ah
	xorwf 	temp,w		; temp=10 (�.�. "嫌岩�")
	btfsc 	STATUS,Z	; W 礤 疣忭� 10
	goto 	mwyw		; � W 蝈镥瘘 0, �.�. BLANK (矬耱�)
	movf 	temp,w		; 忸耨蜞眍忤腓 W
	andlw 	0fh		; define Z (=0 ?)
	btfsc 	STATUS,Z
	movlw 	.10		; (1010) - � 铗钺疣驵弪�� 赅� 0
mwyw	movwf 	temp		; 羼腓 玎戾龛腓 0 磬 10 蝾 耢屙桁 � temp 
	rlf 	temp,f		; 蝠遽箦禧� 徼� (耱囵� 镥疴) � 疣琊�� 4 (---�:----)
	call 	bitlcd		; 恹忸� 徼蜞 桤 疣琊�溧 4 temp 磬 DI (bit3)
	rlf 	temp,f		; 皲忤� 潆� 耠邃簋泐 徼蜞 (2)
	call 	bitlcd	
	rlf 	temp,f		; next - bit1 
	call 	bitlcd
	rlf 	temp,f		; last - bit0
	call 	bitlcd
	call 	mks4		; 镟箸� 戾驿� 耔焘铍囔� 礤 戾礤� 5 礻�
	goto 	mks4		; ...� 恹躅�
bitlcd	bsf	ICLC		; 礤嚓蜩忭铄 耦耱��龛� ICLC
	btfss 	temp,4		; 论文 惹 4 寥依 TEMP
	goto 	lowbit
	bsf	IDAT
	goto 	outclk
lowbit	bcf	IDAT
outclk	call 	mks4		; 镟箸� 礤 戾礤� 2 礻� 潆� 篑蜞眍怆屙�� 溧眄
	bcf 	ICLC		; 耱痤徼痤忄龛� 溧眄
	call 	mks4		; 潆桧� 耱痤徉 礤 戾礤� 2 礻� (殊囵�=4MHz)
; clk 躅螯 � 0 躅螯 � 1 铖蜞怆��, 眍 徨� 镱怛铕�邈铖�
; 恹忸溧 磬 滂耧脲� - 铐, 麇疱� 礤耜铍� 皴牦礓 镥疱躅滂� � 疱骅�
; 忭篁疱眄邈� 蜞殪屦� (???)
	goto mks4
; CLK 铖蜞弪�� � 0 (怦蝠铄眄 � LCD 蜞殪屦 赅� 猁 礤 怅膻麇�)
;
; 		青溴疰赅 礤祉钽� 犷朦 眍痨� 
;		侮噻嚯铖� 忄骓�!
;		橡� 1 "nop" - 猁腓 襻铊 桧滂赅蝾疣
mks4	nop
	nop
	return
OCHIST	MOVLW	0X00	;衔南形眯捞汤 巫妊沂� 娜严伺� 
	MOVWF	R1	;论挛娜� :
	MOVWF	R2	;                         _ _ _ 0 0 0 0 _ _ _ 
	RETURN
;衔南形眯捞汤 阉纹磐冗 穆诱 晾梢温壅 兹雅� :
;   阉纹磐扰 :  ACCb(16 bits) + ACCa(16 bits) -> ACCa(16 bits)
;   妊衔送磐扰 :
;               Program Memory  :       07
;               Clock Cycles    :       08
ADDIT	movf    ACCbLO,w
	addwf   ACCaLO,F         ;add lsb
	btfsc   STATUS,CARRY 	 ;add in carry
	incf    ACCaHI,F
	movf    ACCbHI,w
	addwf   ACCaHI,F         ;add msb
	retlw   0
;衔南形眯捞汤 呐伺腿�
;*******************************************************************;
;   呐伺腿� : ACCb(24 bits) / ACCa(16 bits) -> ACCb(24 bits) with
;                                               窝依椅� � ACCc (16 bits)
;      (a) 抢团岩� 呐巳遗塑 � ACCaHI & ACCaLO ( 24 bits )
;      (b) 抢团岩� 呐巳涛� � ACCbHH& ACCbHI & ACCbLO ( 16 bits )
;      (c) CALL D_div
;      (d) 24 寥彝凵 信怯塑依� � ACCbHH&ACCbHI & ACCbLO
;      (e) 16 寥彝凵 窝依椅�  ACCcHI & ACCcLO
;   妊衔送磐扰 :      
;               Clock Cycles    :  540     
;*******************************************************************;
DIVIS	call    setup
	clrf    ACCcHI
	clrf    ACCcLO
dloop   bcf     STATUS,C
	rlf    	ACCdLO, F
	rlf     ACCdHI, F
	rlf    	ACCdHH, F
	rlf    	ACCcLO, F
	rlf     ACCcHI, F
	movf    ACCaHI,W
	subwf   ACCcHI,W        ;闲温判世 a>c
	btfss   STATUS,Z
	goto    nochk
	movf    ACCaLO,W
	subwf   ACCcLO,W        ;if msb equal then check lsb
nochk   btfss   STATUS,C    	;carry set if c>a
	goto    nogo
	movf    ACCaLO,W        ;c-a into c
	subwf   ACCcLO, F
	btfss   STATUS,C
	decf    ACCcHI, F
	movf    ACCaHI,W
	subwf   ACCcHI, F
	bsf     STATUS,C    	;shift a 1 into b (result)
nogo    rlf     ACCbLO, F
	rlf     ACCbHI, F
	rlf     ACCbHH, F
	decfsz  temp, F         ;loop untill all bits checked
	goto    dloop
	retlw   0
setup   movlw   .24             ;for 24 shifts
	movwf   temp
	movf    ACCbHI,W        ;ACCb --> ACCd
	movwf   ACCdHI
	movf    ACCbLO,W
	movwf   ACCdLO
	movf    ACCbHH,W          	
	movwf   ACCdHH
	clrf    ACCbHH
	clrf    ACCbHI
	clrf    ACCbLO
	retlw   0
;衔南形眯捞汤 闲盼列狼温劳冗 � 穆稳淄文叛咭茸哇� 氯�
;闲盼列狼温劳扰 16 寥彝蚊� 兹阉� � 呐堰胰淄闻 酉朗温劳臀� 兹阉� � 5 欣切吣温
;   妊衔送磐扰 :
;               Program Memory  :       35
;               Clock Cycles    :       885
B2_BCD  bcf     STATUS,0                
	movlw   .16
	movwf   count
	clrf    R0
	clrf    R1
	clrf    R2
loop16  rlf     L_byte,F
	rlf     H_byte,F
	rlf     R2,F
	rlf     R1,F
	rlf     R0,F
	decfsz  count,F
	goto    adjDEC
	RETLW   0
adjDEC  movlw   R2
	movwf   FSR
	call    adjBCD
	movlw   R1
	movwf   FSR
	call    adjBCD
	movlw   R0
	movwf   FSR
	call    adjBCD
	goto    loop16
adjBCD  movlw   3
	addwf   0,W
	movwf   temp
	btfsc   temp,3          ; test if result > 7
	movwf   0
	movlw   30
	addwf   0,W
	movwf   temp
	btfsc   temp,7         	; test if result > 7
	movwf   0               ; save as MSD
	RETLW   0
DELAY	NOP
DELAY1	NOP
	NOP
	NOP
	NOP
	MOVLW	0X00
	SUBWF	LSD,W
	BTFSC	STATUS,Z
	GOTO	DELAY2
	NOP
	NOP
	NOP
	NOP
	NOP
	DECF	LSD,F
	GOTO	DELAY1
DELAY2	MOVLW	D'255'
	MOVWF	SD
DELAY4	NOP
       	DECFSZ	SD,F
	GOTO 	DELAY4
	MOVLW	D'255'
	MOVWF	SD
DELAY5	NOP
        DECFSZ	SD,F
	GOTO 	DELAY5
	MOVLW	D'255'
	MOVWF	SD
DELAY6	NOP
        DECFSZ	SD,F
	GOTO 	DELAY6
	NOP
	NOP
	NOP
	NOP
	NOP
	MOVLW	D'255'
	MOVWF	SD
DELAY7	NOP
        DECFSZ	SD,F
	GOTO 	DELAY7
	MOVLW	0X00
	SUBWF	HSD,W
	BTFSC	STATUS,Z
	GOTO	DELAY3                                                                              
	DECF	HSD,F
	GOTO	DELAY2
DELAY3	RETURN
;*******************************************************************
;         论兹依腿� 穆诱晾梢温壅 兹雅� ( ACCb - ACCa -> ACCb )
D_SUB   call    neg_A           ; 淹雷浪� 0-ACCa;抢遗� 阉纹磐扰 
;*******************************************************************
;       阉纹磐扰 穆诱晾梢温壅 兹雅� ( ACCb + ACCa -> ACCb )
D_add1  movf    ACCaLO,W
	addwf   ACCbLO, F       ;add lsb
	btfsc   STATUS,C        ;add in carry
	incf    ACCbHI, F
	movf    ACCaHI,W
	addwf   ACCbHI, F       ;add msb
	btfsc   STATUS,C      
	incf    ACCbHH, F
	movf    ACCaHH,W
	addwf   ACCbHH, F 
	retlw   0
neg_A   comf    ACCaLO, F       ;( -ACCa -> ACCa )
	incf   	ACCaLO, F
	btfsc   STATUS,Z
	decf    ACCaHI, F
	comf    ACCaHI, F
	btfsc   STATUS,Z
	decf    ACCaHH, F
	comf    ACCaHH, F
	retlw   0
;   犹臀婆腿� : ACCb(16 bits) * ACCa(16 bits) -> ACCb,ACCc ( 32 bits )
;               Program Memory  :       033
;               Clock Cycles    :       333
;         阉纹磐扰 穆诱 晾梢温壅 兹雅� ( ACCb + ACCa -> ACCb )
D_add   MOVF	ACCaLO,W
	ADDWF	ACCbLO,F
	BTFSC	STATUS,C
	INCF	ACCbHI,F
	MOVF	ACCaHI,W
	ADDWF	ACCbHI,F
	retlw   0
;*******************************************************************
;               穆诱晾梢温闻 犹臀婆腿� ( 16x16 -> 32 )
;  ( ACCb*ACCa -> ACCb,ACCc ) :信怯塑依� 32 寥依 - 岩佬嘏� 阉温� 
;  � ACCb ( ACCbHI,ACCbLO ) � 趟滥嘏� 阉温� � ACCc ( ACCcHI,ACCcLO ).
DBL_MPYS                        
	call    setup1
mloop   rrf     ACCdHI, F      
	rrf     ACCdLO, F
	btfsc   STATUS,C    	
	call    D_add
	rrf     ACCbHI, F
	rrf     ACCbLO, F
	rrf     ACCcHI, F
	rrf     ACCcLO, F
	decfsz  temp, F         
	goto    mloop
	retlw   0
setup1  movlw   .16      
	movwf   temp
	movf    ACCbHI,W      
	movwf   ACCdHI
	movf    ACCbLO,W
	movwf   ACCdLO
	clrf    ACCbHI
	clrf    ACCbLO
	retlw   0
	END
