一般処理ライブラリー関係サンプル

(Mini-c 関数の作成)

 このファイルは、タイマーと2進数の変換を行う関数が有ります。


"void wait_100( )"
"void wait_1m( )"
"void wait_05s( )"

この3個の関数は、上から "100μs,1ms,0.5s" のタイマーとなっています。 ただし、CPUクロックに依存しているために”8Mhz”クロックの時に、ほぼこの値と なります。精度が有りませんから、高精度が必要な場合は”CTC”を使用したプログラムを つくるようにして下さい。


"char *bin_to_hex(int bin)"

 この関数は、引数の2進数のデータをを16進表記のアスキーコードのデータに変換し、 そのデータのアドレスを戻り値で返します。この、データをLCDに送る事により、2進数の データをを16進で表示することができます。


"char *bin_to_dec(int bin)"

 この関数は、引数の2進数のデータをを10進表記のアスキーコードのデータに変換し、 そのデータのアドレスを戻り値で返します。この、データをLCDに送る事により、2進数の データをを10進で表示することができます。

 "*bin_to_hex(int bin)" "*bin_to_dec(int bin)" の関数は、データがスタックエリアに有るため、関数実行後にすぐに、 あらかじめ用意しておいた、配列変数に実データ格納する必要が有ります、 これを守らないで、戻り値のアドレスを変数に格納して次の関数を実行すると、 実データが破壊されることになりますから注意して下さい。
 もう一つ、 バグ があります。割込み処理を使用した、プログラム中で、この 関数を使用しますと正常な値を返しません。どうしても使用したい場合は、 この関数の前で”DI”命令を実行し、割込み禁止状態にして、実データを 配列変数に格納後”EI”命令で割込み可能状態に戻すようにしてください。


"int hex_to_bin(char *str)"

 この関数は、引数の4桁の16進数を2進数に変換した値を返します。


"int dec_to_bin(char *str)"

 この関数は、引数の10進数(65,535まで)を2進数に変換した値を返します。

目次に戻る



/*======================================================================*/
/*									*/
/*		一般処理ライブラリー	Vr1.01			*/
/*									*/
/*		stdlib.h	Y.Fushimi	97/02/10		*/
/*									*/
/*	void	wait_100( )						*/
/*	void	wait_1m( )						*/
/*	void	wait_05s( )						*/
/*	char	*bin_to_hex(int bin)  割込みプログラムには使用不可	*/
/*	char	*bin_to_dec(int bin)	割込みプログラムには使用不可	*/
/*	int	hex_to_bin(char *str)					*/
/*	int	dec_to_bin(char *str)					*/
/*									*/
/*======================================================================*/

#asm

WAIT_ORIG:
	PUSH	BC		;4MHzの場合200μs
				;6MHzの場合150μs
	LD	B,55		;8MHzの場合100μs
WAIT_ORIG_1:
	DJNZ	WAIT_ORIG_1

	POP	BC
	RET


HEX_UPPER:
	AND	0F0H
	PUSH	AF
	ADD	A,60H
	JR	C,HEX_UPPER_1
	POP	AF
	SRL	A
	SRL	A
	SRL	A
	SRL	A
	OR	30H
	RET
HEX_UPPER_1:
	POP	AF
	SRL	A
	SRL	A
	SRL	A
	SRL	A
	ADD	A,37H
	RET

HEX_LOWER:
	AND	0FH
	PUSH	AF
	ADD	A,0F6H
	JR	C,HEX_LOWER_1
	POP	AF
	OR	30H
	RET
HEX_LOWER_1:
	POP	AF
	ADD	A,37H
	RET

BIN_TO_BCD:
	PUSH	AF
	PUSH	BC
	PUSH	IX	;ここまではレジスター保護
	PUSH	BC	;変数"bcd[ 3 ]"
	DEC	SP

	LD	A,0
	LD	HL,0
	ADD	HL,SP
	INC	HL
	LD	(HL),A
	INC	HL
	LD	(HL),A

	LD	HL,11
	ADD	HL,SP
	LD	A,(HL)
	AND	0FH
	ADD	A,0F6H
	JR	NC,BIN_TO_BCD_01
	OR	10H
	JR	BIN_TO_BCD_02
BIN_TO_BCD_01:
	LD	A,(HL)
	AND	0FH
BIN_TO_BCD_02:
	LD	HL,0
	ADD	HL,SP
	LD	(HL),A
	LD	IX,ADD_DATA
	LD	B,10H
	LD	C,4
BIN_TO_BCD_03:
	LD	HL,11
	ADD	HL,SP
	LD	A,(HL)
	AND	B
	JR	Z,BIN_TO_BCD_05
	LD	HL,0
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+0)
	DAA
	LD	(HL),A
	JR	NC,BIN_TO_BCD_04
	INC	HL
	LD	A,(HL)
	ADD	A,01H
	DAA
	LD	(HL),A
BIN_TO_BCD_04:
	INC	IX
	LD	HL,1
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+0)
	DAA
	LD	(HL),A
	JR	BIN_TO_BCD_06
BIN_TO_BCD_05:
	INC	IX
BIN_TO_BCD_06:
	INC	IX
	RLC	B
	DEC	C
	JR	NZ,BIN_TO_BCD_03

	LD	C,6
BIN_TO_BCD_07:
	LD	HL,12
	ADD	HL,SP
	LD	A,(HL)
	AND	B
	JR	Z,BIN_TO_BCD_09
	LD	HL,0
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+0)
	DAA
	LD	(HL),A
	JR	NC,BIN_TO_BCD_08
	INC	HL
	LD	A,(HL)
	ADD	A,01H
	DAA
	LD	(HL),A
	JR	NC,BIN_TO_BCD_08
	INC	HL
	LD	A,(HL)
	ADD	A,01H
	DAA
	LD	(HL),A
BIN_TO_BCD_08:
	INC	IX
	LD	HL,1
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+0)
	DAA
	LD	(HL),A
	JR	NC,BIN_TO_BCD_10
	INC	HL
	LD	A,(HL)
	ADD	A,01H
	DAA
	LD	(HL),A
	JR	BIN_TO_BCD_10
BIN_TO_BCD_09:
	INC	IX
BIN_TO_BCD_10:
	INC	IX
	RLC	B
	DEC	C
	JR	NZ,BIN_TO_BCD_07

	LD	C,2
BIN_TO_BCD_11:
	LD	HL,12
	ADD	HL,SP
	LD	A,(HL)
	AND	B
	JR	Z,BIN_TO_BCD_14
	LD	HL,0
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+0)
	DAA
	LD	(HL),A
	JR	NC,BIN_TO_BCD_12
	INC	HL
	LD	A,(HL)
	ADD	A,01H
	DAA
	LD	(HL),A
	JR	NC,BIN_TO_BCD_12
	INC	HL
	LD	A,(HL)
	ADD	A,01H
	DAA
	LD	(HL),A
BIN_TO_BCD_12:
	INC	IX
	LD	HL,1
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+0)
	DAA
	LD	(HL),A
	JR	NC,BIN_TO_BCD_13
	INC	HL
	LD	A,(HL)
	ADD	A,01H
	DAA
	LD	(HL),A
BIN_TO_BCD_13:
	INC	IX
	LD	HL,2
	ADD	HL,SP
	LD	A,(HL)
	ADD	A,(IX+0)
	DAA
	LD	(HL),A
	JR	BIN_TO_BCD_15
BIN_TO_BCD_14:
	INC	IX
	INC	IX
BIN_TO_BCD_15:
	INC	IX
	RLC	B
	DEC	C
	JR	NZ,BIN_TO_BCD_11

	LD	HL,0		;"bcd[ 3 ]"のアドレスを"HL"に
	ADD	HL,SP

	INC	SP
	POP	BC
	POP	IX
	POP	BC
	POP	AF
	RET
ADD_DATA:
	DB	16H,0,32H,0,64H,0,28H,01H,56H,02H,12H,05H,24H,10H
ADD_DATA_1:
	DB	48H,20H,96H,40H,92H,81H,84H,63H,01H,68H,27H,03H

#endasm

void	wait_100( )
{
#asm

	call wait_orig
#endasm
}

void	wait_1m( )
{
#asm
	ld	b,10
wait_1m_1:
	call	wait_orig
	djnz	wait_1m_1
#endasm
}

void	wait_05s( )
{
#asm
	ld	l,0fah
wait_05s_1:
	push	hl
	call	__wait_1m
	pop	hl
	dec	l
	jr	nz,wait_05s_1
	ld	l,0fah
wait_05s_2:
	push	hl
	call	__wait_1m
	pop	hl
	dec	l
	jr	nz,wait_05s_2
#endasm
}

char	*bin_to_hex(int bin)
{
#asm
	push	bc
	push	bc
	dec	sp
	ld	hl,4
	add	hl,sp
	ld	(hl),0

	ld	hl,8
	add	hl,sp
	ld	a,(hl)
	call	hex_upper
	ld	hl,3
	add	hl,sp
	ld	(hl),a

	ld	hl,8
	add	hl,sp
	ld	a,(hl)
	call	hex_lower
	ld	hl,2
	add	hl,sp
	ld	(hl),a

	ld	hl,7
	add	hl,sp
	ld	a,(hl)
	call	hex_upper
	ld	hl,1
	add	hl,sp
	ld	(hl),a

	ld	hl,7
	add	hl,sp
	ld	a,(hl)
	call	hex_lower
	ld	hl,0
	add	hl,sp
	ld	(hl),a

	inc	sp
	pop	bc
	pop	bc

#endasm
}

char	*bin_to_dec(int bin)
{
#asm
	ld	hl,2
	add	hl,sp
	ld	a,(hl)
	inc	hl
	ld	h,(hl)
	ld	l,a
	push	hl
	call	bin_to_bcd
	pop	bc
	push	hl		;bcd[ 3 ]のアドレス
	push	bc
	push	bc
	push	bc		;dec[ 6 ]
	ld	hl,6
	add	hl,sp
	ld	e,(hl)
	inc	hl
	ld	d,(hl)
	inc	de
	inc	de
	ld	hl,5
	add	hl,sp
	ld	(hl),0
	ld	c,0
	ld	b,2
	jr	bin_to_dec_3

bin_to_dec_1:
	dec	b
	ld	a,(de)
	and	0f0h
	jr	nz,bin_to_dec_2
	ld	a,c
	or	a
	jr	nz,bin_to_dec_2
	ld	a,20h
	ld	(hl),a
	jr	bin_to_dec_3
bin_to_dec_2:
	ld	a,(de)
	and	0f0h
	rrca
	rrca
	rrca
	rrca
	or	30h
	ld	(hl),a
	ld	c,1
bin_to_dec_3:
	dec	hl
	ld	a,(de)
	and	0fh
	jr	nz,bin_to_dec_4
	ld	a,c
	or	a
	jr	nz,bin_to_dec_4
	ld	a,b
	or	a
	jr	z,bin_to_dec_4
	ld	a,20h
	ld	(hl),a
	jr	bin_to_dec_5
bin_to_dec_4:
	ld	a,(de)
	and	0fh
	or	30h
	ld	(hl),a
	ld	c,1
bin_to_dec_5:
	dec	de
	dec	hl
	ld	a,b
	or	a
	jr	nz,bin_to_dec_1

	ld	hl,0
	add	hl,sp

	pop	bc
	pop	bc
	pop	bc
	pop	bc

#endasm
}

int  dec_to_bin(char *str)
{
#asm

		LD	HL,2
		ADD	HL,SP
		LD	E,(HL)			;下位アドレスを取得
		INC	HL
		LD	D,(HL)			;上位アドレスを取得
		LD	B,0
DEC_TO_BIN_01:	INC	DE			;NULLまでアドレスUP
		INC	B
		LD	A,5			;最大5桁まで
		SUB	B
		JR	Z,DEC_TO_BIN_02
		LD	A,(DE)
		OR	A
		JR	NZ,DEC_TO_BIN_01
DEC_TO_BIN_02:	DEC	DE			;一の桁を変換
		DEC	B
		LD	H,0
		LD	A,(DE)
		AND	0FH
		LD	L,A
		LD	A,B
		OR	A
		JR	Z,DEC_TO_BIN_10		;終了
;
		DEC	DE			;十の桁を変換
		DEC	B
		PUSH	DE
		LD	A,(DE)
		AND	0FH
		JR	Z,DEC_TO_BIN_04
		LD	DE,10
DEC_TO_BIN_03:	ADD	HL,DE
		DEC	A
		JR	NZ,DEC_TO_BIN_03
DEC_TO_BIN_04:	POP	DE
		LD	A,B
		OR	A
		JR	Z,DEC_TO_BIN_10		;終了
;
		DEC	DE			;百の桁を変換
		DEC	B
		PUSH	DE
		LD	A,(DE)
		AND	0FH
		JR	Z,DEC_TO_BIN_06
		LD	DE,100
DEC_TO_BIN_05:	ADD	HL,DE
		DEC	A
		JR	NZ,DEC_TO_BIN_05
DEC_TO_BIN_06:	POP	DE
		LD	A,B
		OR	A
		JR	Z,DEC_TO_BIN_10		;終了
;
		DEC	DE			;千の桁を変換
		DEC	B
		PUSH	DE
		LD	A,(DE)
		AND	0FH
		JR	Z,DEC_TO_BIN_08
		LD	DE,1000
DEC_TO_BIN_07:	ADD	HL,DE
		DEC	A
		JR	NZ,DEC_TO_BIN_07
DEC_TO_BIN_08:	POP	DE
		LD	A,B
		OR	A
		JR	Z,DEC_TO_BIN_10		;終了
;
		DEC	DE			;万の桁を変換
		DEC	B
		LD	A,(DE)
		AND	0FH
		JR	Z,DEC_TO_BIN_10		;終了
		LD	DE,10000
DEC_TO_BIN_09:	ADD	HL,DE
		DEC	A
		JR	NZ,DEC_TO_BIN_09
DEC_TO_BIN_10:	RET


#endasm
}


int  hex_to_bin(char *str)
{
#asm

		LD	HL,2
		ADD	HL,SP
		LD	E,(HL)			;下位アドレスを取得
		INC	HL
		LD	D,(HL)			;上位アドレスを取得
		LD	B,0
HEX_TO_BIN_01:	INC	DE			;NULLまでアドレスUP
		INC	B
		LD	A,4			;最大4桁まで
		SUB	B
		JR	Z,HEX_TO_BIN_02
		LD	A,(DE)
		OR	A
		JR	NZ,HEX_TO_BIN_01
;
HEX_TO_BIN_02:	DEC	DE			;1桁目処理
		DEC	B
		LD	H,0
		LD	A,(DE)
		LD	C,A
		LD	A,3FH
		SUB	C
		JR	C,HEX_TO_BIN_03
		LD	A,C			;0〜9まで
		AND	0FH
		LD	L,A
		JR	HEX_TO_BIN_04
HEX_TO_BIN_03:	LD	A,C			;A〜Fまで
		AND	0FH
		ADD	A,9
		LD	L,A
;
HEX_TO_BIN_04:	LD	A,B			;2桁目の処理
		OR	A
		JR	Z,HEX_TO_BIN_10		;終了
		DEC	DE
		DEC	B
		LD	A,(DE)
		LD	C,A
		LD	A,3FH
		SUB	C
		JR	C,HEX_TO_BIN_05
		LD	A,C			;1〜9まで
		AND	0FH
		SLA	A
		SLA	A
		SLA	A
		SLA	A
		OR	L
		LD	L,A
		JR	HEX_TO_BIN_06
HEX_TO_BIN_05:	LD	A,C			;A〜Fまで
		AND	0FH
		ADD	A,9
		SLA	A
		SLA	A
		SLA	A
		SLA	A
		OR	L
		LD	L,A
;
HEX_TO_BIN_06:	LD	A,B			;3桁目の処理
		OR	A
		JR	Z,HEX_TO_BIN_10		;終了
		DEC	DE
		DEC	B
		LD	A,(DE)
		LD	C,A
		LD	A,3FH
		SUB	C
		JR	C,HEX_TO_BIN_07
		LD	A,C			;1〜9まで
		AND	0FH
		LD	H,A
		JR	HEX_TO_BIN_08
HEX_TO_BIN_07:	LD	A,C			;A〜Fまで
		AND	0FH
		ADD	A,9
		LD	H,A
;
HEX_TO_BIN_08:	LD	A,B			;4桁目の処理
		OR	A
		JR	Z,HEX_TO_BIN_10		;終了
		DEC	DE
		DEC	B
		LD	A,(DE)
		LD	C,A
		LD	A,3FH
		SUB	C
		JR	C,HEX_TO_BIN_09
		LD	A,C			;1〜9まで
		AND	0FH
		SLA	A
		SLA	A
		SLA	A
		SLA	A
		OR	H
		LD	H,A
		JR	HEX_TO_BIN_10
HEX_TO_BIN_09:	LD	A,C			;A〜Fまで
		AND	0FH
		ADD	A,9
		SLA	A
		SLA	A
		SLA	A
		SLA	A
		OR	H
		LD	H,A
;
HEX_TO_BIN_10:	RET


#endasm
}



目次に戻る