; ; KBC−Z05サンプルプログラム (1) ; CTCの割込みを使い、PIOに接続した ; LEDを点滅させる ;******* I/Oアドレス CTC0 EQU 10H ;CTCチャネル0 PIOAD EQU 1CH ;PIO Aポート データ PIOAC EQU 1DH ;PIO Aポート コマンド ;******* ワークエリアと定数 COUNT EQU 8000H ;割込み回数カウント用エリア SPEED EQU 40 ;点滅スピード定数 ;******* プログラム本体 ORG 0 LD SP,0000H ;スタックポインタ設定 LD A,INTTBL/256 ;CTCの割込みテーブル上位を LD I,A ;Iレジスタに入れる IM 2 ;割込みモード2に設定 ;******* CTCの初期化 LD A,INTTBL AND 0FFH ;CTCに割込みベクタを OUT (CTC0),A ;書き込む LD A,10110111B ;CTCをタイマモードに設定 OUT (CTC0),A XOR A ;タイムコンスタント OUT (CTC0),A ;約8.9ミリ秒ごとに割り込む ;******* PIO Aポート初期化(モード3出力) LD A,11001111B ;モード制御語 OUT (PIOAC),A LD A,00000000B ;データ入出力制御語(0=出力) OUT (PIOAC),A LD A,00000111B ;割り込み制御語 OUT (PIOAC),A ;******* PIO Aポートにデータを出力する LD A,00000001B ;LED が点灯(Lレベル) OUT (PIOAD),A LD A,SPEED ;割込み回数カウンタに初期値をセット LD (COUNT),A EI ;割込み許可 LOOP: JR LOOP ;CTCの割込みを待つ ;******* 割込み処理ルーチン INT: PUSH AF LD A,(COUNT) ;割込み回数カウンタ DEC A ;0か JR NZ,SKIP ;No,そのままリターン IN A,(PIOAD) ;PIO Aポートを読む XOR 00000011B ;LEDの点滅状態を反転 OUT (PIOAD),A ;Aポートに書き戻す LD A,SPEED ;割込み回数カウンタ再設定 SKIP: LD (COUNT),A POP AF EI RETI ;*******割込みベクタテーブル ORG 100H INTTBL: DW INT END