;**********************************************************************
; 七段式 LED 測試，包含數字和英文字母
; Daniel Lu  2002'11'27
;**********************************************************************

OFT	EQU	30H		;配置位址空間 30H 給OFT(offset) 儲存數值用

	ORG	0000H		;設定起使位址

START	MOV	R1,#00H		;先作一小段延遲，讓系統Ready
$	DJNZ	R1,$		
	MOV	SP,#50H		;指定堆疊起始位址

	MOV	DPTR,#TABLE	;將Table 所在的位址存到 DPTR	
	
INIOFT	CALL	INILED		;呼叫 INILED 副函式，將每個 LED (a,b,c,d,e,f,g) 各跑一次	
	
	MOV	OFT,#00H	;初始化 Offset 為 0 	
LOOP1	MOV	A,OFT		;將 Offset 值存到 ACC
	MOVC	A,@A+DPTR	;將 DPTR內的位址加上 ACC 內的 Offset 值所得的新位址，取新位址(Table 內)所在的值放到 ACC
	CALL	OUTPUT		;顯示
	INC	OFT		;Offset 累加
	MOV	A,OFT		;將 Offset 值存到 ACC，利用ACC 來作判斷
	;JNB	P3.7,INIOFT	;如果 P3.7 為 0，則跳到 INIOFT
	CJNE	A,#36,LOOP1	;如果 Offset <> 36 (顯示到最後一個字 z 了)，則跳到 LOOP繼續顯示下一個字	
	SJMP	INIOFT		;從頭顯示

	
;顯示字型的 Table-----------------------------------------
TABLE	DB	3FH	;0
	DB	06H	;1
	DB	5BH	;2
	DB	4FH	;3
	DB	66H	;4
	DB	6DH	;5
	DB	7DH	;6
	DB	27H	;7
	DB	7FH	;8
	DB	6FH	;9
	
	DB	77H	;A
	DB	7CH	;B
	DB	58H	;C
	DB	5EH	;D
	DB	79H	;E
	DB	71H	;F
	DB	6FH	;G
	DB	74H	;H
	DB	04H	;I
	DB	0EH	;J
	DB	40H	;K  //未定義
	DB	38H	;L
	DB	40H	;M  //未定義
	DB	54H	;N
	DB	5CH	;O
	DB	73H	;P
	DB	67H	;Q
	DB	70H	;R
	DB	6DH	;S
	DB	78H	;T
	DB	1CH	;U
	DB	3EH	;V
	DB	40H	;W  //未定義
	DB	40H	;X  //未定義
	DB	6EH	;Y
	DB	5BH	;Z
	

;Output ----將 ACC 內的值反相輸出到 P1 ----------------------------------
OUTPUT	CPL	A		;因為 Active Low，所以必須先將 A 反相
	MOV	P1,A		;將 ACC 的值輸出到 P1
	CALL	DELAY		;延遲一下
	RET			;返回	

	
;INILED 副函式---從 a 段到 g 段 跑一遍 -----------------------------------
INILED	MOV	A,#80H		;初值為 1000 0000B
$	RL	A		; 0000 0001 -> 0000 0010 -> 0000 0100 .... 逐一顯示
	CALL	OUTPUT		;呼叫顯示函式
	CPL	A		;因為在 OUTPUT 內會將 A 反相，所以這裡要再反相回來
	CJNE	A,#80H,$	;如果不等於 1000 000B 則繼續 RL A，然後 OUTPUT

	;上面和下面的 Code 功能相同，但是使用上面的 Code，總程式只佔 98 Bytes，下面則佔 123 bytes

	;MOV	A,#01H	;七段顯示器的 a 段 LED
	;CALL	OUTPUT	;
	
	;MOV	A,#02H	;七段顯示器的 b 段 LED
	;CALL	OUTPUT	;
	
	;MOV	A,#04H	;七段顯示器的 c 段 LED
	;CALL	OUTPUT	;
	
	;MOV	A,#08H	;七段顯示器的 d 段 LED
	;CALL	OUTPUT	;
	
	;MOV	A,#10H	;七段顯示器的 e 段 LED
	;CALL	OUTPUT	;
	
	;MOV	A,#20H	;七段顯示器的 f 段 LED
	;CALL	OUTPUT	;
	
	;MOV	A,#40H	;七段顯示器的 g 段 LED
	;CALL	OUTPUT	;
	RET


;Delay 副函式-----------------------------------------
DELAY	MOV	R0,#05H		;Delay 參數,改變此次數可控制Delay 時間
$0	MOV	R1,#00H		;外層回圈 -----
$1	MOV	R2,#00H		;內層回圈 --  |	
$2	DJNZ	R2,$2		;內  _____|  |
	JNB	P3.7,INIOFT	;如果 P3.7 為 0，則跳到 INIOFT	
	DJNZ	R1,$1		;外__________|
	DJNZ	R0,$0		;
$RET	RET			;返回

