;■■■■■■■■■■■■■■■■■■■■■■■ ; ; AT90S2313 4MHz ; バーサライタ ; Tabは半角8文字にすると見やすいです。 ; ;■■■■■■■■■■■■■■■■■■■■■■■ .INCLUDE "2313DEF.INC" .def subCNT=r1 .def A=r16 .def B=r17 .def C=r18 .def D=r19 .def currentL=r20 ;表示領域先頭 .def currentH=r21 ; .def scan=r22 ;スキャン位置 .def flag=r23; ;B0=速度,1はやすぎ、2おそすぎ ;B1=インタラプタ状態。0L,1H ;26以降使用注意 rjmp RESET ;RESET reti ;INT0 reti ;INT1 reti ;CAPT1 rjmp COMP1 ;COMP1 reti ;OVF1 rjmp OVF0 ;OVF0 reti ;UART RX reti ;UART UDRE reti ;UART TX reti ;ACON RESET: ;▼スタックポインタ ldi A,low(RAMEND) out SPL,A ;▼入出力設定 ldi A,0b00011100 out DDRB,A ;PBを設定 ;ldi A,0b00000000 ;out PORTB,A ;初期値 ldi A,0b1111011 out DDRD,A ;PDを設定 out PORTD,A ;初期値 ;▼タイマカウンタ0 ldi A,0b00000011 out TCCR0,A ;CK/1024 ;▼タイマカウンタ1 ;ldi A,0b00000000 ;out TCCR1A,A ldi A,0b00001001 out TCCR1B,A ldi A,0x80 ;■初期スキャン速度 out OCR1AH,A ldi A,0xfe ;■初期スキャン速度 out OCR1AL,A ldi A,0b01000010 out TIMSK,A ;割り込み許可 sei ;割り込み許可 ;▼初期値 ldi A,255 mov subCNT,A ;ldi currentL,0 ; ;ldi currentH,0 ; ;ldi scan,0 ; MAIN: sbic PIND,2;クリアでスキップ rjmp M1 ; cli sbrs flag,1;セットでスキップ rjmp M2 andi flag,0b11111101 in B,OCR1AH inc B sbrs flag,0 ;セットでスキップ subi B,2 out OCR1AH,B out OCR1AL,B ldi scan,0 andi flag,0b11111110 rjmp M2 M1: ori flag,0b00000010 M2: end: rjmp MAIN ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ ;▼タイマカウンタ零オーバー風呂 OVF0: push A in A,SREG push A push B dec subCNT brne OVEND ldi A,16 ;■スクロールスピード mov subCNT,A ldi A,0 ;スクロール ldi B,2 add currentL,B adc currentH,A OVEND: pop B pop A out SREG,A pop A reti ;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ ;▼タイマカウンタ壱コンペアマッチ COMP1: push A in A,SREG push A push B push C ;▼▼▼とりあえずLEDデータ出力 ;▼LED上位データ ldi A,129 ;B塔上位 rcall read; ldi A,1 ;A塔上位 rcall read; ;▼LED下位データ ldi A,128 ;B塔下位 rcall read; ldi A,0 ;A塔下位 rcall read; ;▼吐き出し pop A pop B rcall SetByteAB ;ココまでシフト pop A pop B rcall SetByteAB ;ココまでシフト ;▼scanを加算 ldi A,2 add scan,A brcc C1 ;▼一周しました(OVF) ori flag,0b00000001 C1: ; rjmp NotDataEnd ;■test ;▼▼▼データの最後ですか ldi A,low(EndOfData*2) ldi B,high(EndOfData*2) sub A,ZL sbc B,ZH brcc NotDataEnd ;▼最後です ldi currentL,0 ; ldi currentH,0 ; ldi scan,0 ; NotDataEnd: pop C pop B pop A out SREG,A pop A reti ;▼外部シフトレジスタに8bit転送 ;破壊レジスタA,B,C SetByteAB: ldi C,7 SH1: cbi PORTB,2 ;CK=L ;▼A塔用データ用意 cbi PORTB,3 ;A塔DATA=L sbrc A,0 ;クリアでスキップ sbi PORTB,3 ;A塔DATA=H ;▼B塔用データ用意 cbi PORTB,4 ;B塔DATA=L sbrc B,0 ;クリアでスキップ sbi PORTB,4 ;B塔DATA=H ;▼両塔データシフト sbi PORTB,2 ;CK=H lsr A ;次 lsr B ;次 subi C,1 brcc SH1 ;繰り返す ret ;▼ROM読み ;A=塔指定 帰り値r0,stack read: ldi ZL,low(data*2) ;データ座標 ldi ZH,high(data*2) add ZL,A ;塔データ座標 ldi A,0 adc ZH,A add ZL,currentL ;表示領域先頭座標 adc ZH,currentH add ZL,scan ;相対座標加算(スキャン) adc ZH,A lpm push r0 ret .INCLUDE "data.asm" EndOfData: .dW 0b1010101010101010