;******************************************************************************************
;  ＡＶＲサンプル
;   Project      :
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H18.07.25
;   History      :
;******************************************************************************************
;  (1)Description 
;
;******************************************************************************************
.include "2313def.inc"
.cseg
	LDI	R16,RAMEND
	OUT	SPL,R16		;
	LDI	R16,0xFF	; PORTB(0-7)を全て出力にする
	OUT	DDRB,R16	; PORTB(0-7)を全て出力にする
	LDI	R16,0x02	; 
	OUT	DDRD,R16	; 
;
	LDI	R16,0x00	; PORTBを初期化
	OUT	PORTB,R16	; PORTBを初期化
;
; 0.初期設定
	LDI	R20,10		; 初期値を設定
	LDI	R21,0x01	; PORTB変数を1に初期化
	OUT	PORTB,R21	; PORTBを1に初期化
	RCALL	UARTINI		; UARTを初期化
;	RCALL	DEMO01
MAIN:
; 1.PCより回転数を得る
;  (1)データを受信する
	RCALL	UARTREC		; データを受信
;  (2)キャラクタ数字を数値に変換する
	LDI	R23,0x0F	; キャラクタ数字を数値に変換
	AND	R23,R16		; キャラクタ数字を数値に変換
	MOV	R20,R23		; 数値を代入
;  (3)エコーバックする 
	RCALL	UARTTRN		; データを送信
;
; 2.ルーレットの初期回転
;MAIN1:
;	LDI	R22,20		; 初期回転数を設定
;MAIN1A:
;	RCALL	MVLD		; ルーレットを動かす　
;	RCALL	WAT1S		; 少し待つ
;	DEC	R22		;
;	BRNE	MAIN1A		;
;
; 3.ルーレットの指定数回転
MAIN2:
	RCALL	MVLD		; ルーレットを動かす
	RCALL	WAT1S		; 少し待つ
	RCALL	WAT1S		; 少し待つ
	RCALL	WAT1S		; 少し待つ
	DEC	R20		;
	BRNE	MAIN2		;	
;
	RJMP	MAIN

;******************************************************************************************
;   Function Name : DEMO01
;   Title         : 
;   Input         : 
;   Output        : 
;   Description   : 
;******************************************************************************************
DEMO01:
	LDI	R16,'A'	
	RCALL	UARTTRN
	LDI	R16,'T'	
	RCALL	UARTTRN
	LDI	R16,'9'	
	RCALL	UARTTRN
	LDI	R16,'0'	
	RCALL	UARTTRN
	LDI	R16,'S'	
	RCALL	UARTTRN
	LDI	R16,'2'	
	RCALL	UARTTRN
	LDI	R16,'3'	
	RCALL	UARTTRN
	LDI	R16,'1'	
	RCALL	UARTTRN
	LDI	R16,'3'	
	RCALL	UARTTRN
	LDI	R16,' '	
	RCALL	UARTTRN
	LDI	R16,'c'	
	RCALL	UARTTRN
	LDI	R16,'o'	
	RCALL	UARTTRN
	LDI	R16,'n'	
	RCALL	UARTTRN
	LDI	R16,'n'	
	RCALL	UARTTRN
	LDI	R16,'e'	
	RCALL	UARTTRN
	LDI	R16,'c'	
	RCALL	UARTTRN
	LDI	R16,'t'	
	RCALL	UARTTRN
	LDI	R16,'e'	
	RCALL	UARTTRN
	LDI	R16,'d'	
	RCALL	UARTTRN
	LDI	R16,' '	
	RCALL	UARTTRN
	LDI	R16,'O'	
	RCALL	UARTTRN
	LDI	R16,'K'	
	RCALL	UARTTRN
	LDI	R16,' '	
	RCALL	UARTTRN
	LDI	R16,'>'	
	RCALL	UARTTRN
	LDI	R16,' '	
	RCALL	UARTTRN

	RET

;******************************************************************************************
;   Function Name : UARTINI
;   Title         : UARTを初期化する(UCR/UBRR)
;   Input         : 
;   Output        : 
;   Description   : OSC10MHz / 9600BPS用
;******************************************************************************************
UARTINI:
;  1.UCRレジスタの設定
	LDI	R16,0b11111011	; 
	OUT	UCR,R16		; 
;  2.UBRRレジスタの設定
;    ※BAUD=Fck/16(UBRR+1) => UBRR=Fck/(16*BAUD) - 1
;       10MHz,9600BAUDの時, UBRR=10M/(16*9600)-1=>64.10(Dec)=>40(Hex)  
	LDI	R16,0x40	; 
	OUT	UBRR,R16	; 

	RET
;
;******************************************************************************************
;   Function Name : UARTREC
;   Title         : シリアルデータを受信する(USR/UDR)
;   Input         : 
;   Output        : 
;******************************************************************************************
UARTREC:
	SBIS	USR,RXC		;
	RJMP	UARTREC		;
	IN	R16,UDR		;

	RET
;******************************************************************************************
;   Function Name : UARTTRN
;   Title         : シリアルデータを送信する(USR/UDR)
;   Input         : 
;   Output        : 
;******************************************************************************************
UARTTRN:
; (1)送信ﾊﾞｯﾌｧ空き待機
	SBIS	USR,UDRE	;
	RJMP	UARTTRN		;

; (2)シリアルデータを設定
	OUT	UDR,R16		;

	RET
;******************************************************************************************
;   Function Name : MVLD
;   Title         : ルーレットを動かす
;   Input         : 
;   Output        : 
;******************************************************************************************
MVLD:
; 2.ルーレットを動かす
	OUT	PORTB,R21	; PORTBに代入
	SBRC	R21,7		;
	RJMP	MVLD1		;
	LSL	R21		; 表示をシフト
	RET			;　	
MVLD1:				;
	LDI	R21,0x01	; PORTB変数を1に初期化
	RET			;

;******************************************************************************************
;   Function Name : WAT1S
;   Title         : タイマー関数
;   Input         : 
;   Output        : 
;******************************************************************************************
WAT1S:
	LDI	R18,10		; 100->
WAT1S_A:			;
	LDI	R17,100		;
WAT1S_B:			;
	LDI	R16,110		;
WAT1S_C:			;
	RJMP	PC+1		;
	RJMP	PC+1		;
	RJMP	PC+1		;
	DEC	R16		;
	BRNE	WAT1S_C		;
	DEC	R17		;
	BRNE	WAT1S_B		;
	DEC	R18		;
	BRNE	WAT1S_A		;
	RET			;
