AVRでスイッチを使う

AVR(ATtiny2313)を使ってスイッチ入力をした。

一度PA0のスイッチを押すとPB0~PB3のLEDが点灯し、もう一度スイッチを押すと消灯する。

プログラム

.include "tn2313def.inc"

.cseg
.org 0
    rjmp  setup

setup:
    ldi   r16,RAMEND
    out   SPL,r16
    ldi   r16,0b0000_0011
    out   PORTA,r16
    ldi   r16,0b0000_1111
    out   DDRB,r16
    ldi   r17,1
loop:
    in    r16,PINA
    andi  r16,1
    sub   r17,r16
    brpl  skip
    in    r17,PORTB
    com   r17
    andi  r17,0b0000_1111
    out   PORTB,r17
skip:
    mov   r17,r16
    rcall delay10m
    rjmp  loop

delay10m:
    ldi   r18,10

delay1m:
    ldi   r19,250
delay1m2:
    nop
    dec   r19
    brne  delay1m2

    dec   r18
    brne  delay1m

    ret

レジスタ

ニモニック

メモ

入力が0から1に変化した時にLEDの状態を反転させている。

チャタリング対策として10msの遅延を入れた。