; Copyright 2006 Yamane Akira ; Program3 ; 基本的要素を含むプログラム例 ; STK500のLEDを右から左へ順に点灯、これを繰り返すプログラム ; I/O ポート(出力ポート)の初期化 ; サブルーチンを使用するためにスタックポインターの初期化 ; サブルーチンコール ; などを含む .include "m8def.inc" ; 定義ファイルをインクルード .def Temp = R16 ; レジスターにシンボル名をつける擬似命令 .def CNT1 = R17 .def CNT2 = R18 ; 空白行を入れることも可能 .org 0x0000 ; プログラムコードの始まるロケーションを宣言 rjmp RESET ; リセット時にプログラムはここからスタートする ; 通常ここに割り込みベクターを定義する(割り込みを使用していないので未定義) Delay1: ser CNT1 ; ディレイサブルーチンエントリー、CNT1←0xFF Loop1: ser CNT2 ; CNT2←0xFF Loop2: dec CNT2 ; カウンター値をマイナス1、結果が0になるとSREG:Z=1 brbc 1, Loop2 ; SREGのビット1(Z)がクリヤされていればLoop2へブランチ dec CNT1 brbc 1, Loop1 ; ret ; サブルーチンリターン RESET: ; ラベル ldi Temp, low(RAMEND) ; RAMの最終番地をバイト単位で out SPL, Temp ; スタックポインターへセット ldi Temp, high(RAMEND) ; RAMENDは各.defファイルの中で定義されている out SPH, Temp ser Temp ; Temp←0xFF out DDRB, Temp ; PORTBのデータディレクションレジスターを出力にセット Loop: sbis PORTB,7 ; PORTBのMSBがセット(1)ならスキップ ser Temp ; Temp←0xFF out PORTB, Temp ; TempレジスターのデータをPORTBにセット rcall Delay1 ; ディレイサブルーチンを相対コール lsl Temp ; Tempレジスターのビットをそれぞれ左へ1ビットシフト rjmp Loop ;