■ 課題5のCソース・ファイルとHEXファイルはこちらです【LZH】
■ 課題6
課題6はタクト・スイッチの応用です。プログラム開始時はDOWN_LEDが250ms間隔で点滅します。タクト・スイッチを押すとRIGHT_LEDに点滅が移動します。タクト・スイッチを押すごとにDOWN→RIGHT→UP→LEFTの順番で点滅が移動するプログラムを作成してください。新しい命令はありません。今までの知識で考えることができます。
TACTSW:ON→○○○○ ○○○●
○○○○ ○○●○
○○○○ ○●○○
○○○○ ●○○○
// ex6.c
// PIC16F84A用
#include<16f84a.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#define ON 1
#define OFF 0
#define TON
#define TOFF 1
#byte RA=5
#byte RB=6
#bit IRSIG=RA.2
#bit TACTSW=RA.3
#bit DOWN_LED=RB.0
#bit UP_LED=RB.2
#bit RIGHT_LED=RB.1
#bit LEFT_LED=RB.3
void main()
{
int led_data;
set_tris_a(0x0c);
set_tris_b(0x00);
RB=0;
led_data=0x01;
RB=led_data;
while(1){
if(TACTSW==TON){
led_data=★★;
delay_ms(20);
}
if(led_data > 0x08){
led_data=★★;
}
RB=led_data;
delay_ms(250);
RB=0x00;
delay_ms(250);
}
}
■ヒント1
if(TACTSW==TON){
led_data=★★;
delay_ms(20);
}
タクト・スイッチのON,OFFは人間の感覚と逆になります。TONを0、TOFFを1と定義して、自然な感覚で考えられるようにしました。
タクト・スイッチが押されたとき(TACTSW==TON)、led_dataを1ビットシフトします。課題3を参考にしてください。
■ヒント2
if(led_data > 0x08){
led_data=★★;
}
LEFT_LEDが点灯すると次はled_dataが0x10になります。次はled_dataを0x01に戻して、DOWN_LEDを点灯させる処理がこの部分です。
自分で考えたプログラムがうまく動いたときの喜びは最高ですね。

PICマイコンでつくるインドア・プレーン
みんなで作ろうインドア・プレーン