課題2ではLEDごとにON/OFFを記述しましたが、点灯させるLEDが増えると面倒です。シフト命令を使って同じ動作を実現しましょう。
○○○○ ○○○●
○○○○ ○○●○
○○○○ ○●○○
○○○○ ●○○○
// ex7-3.c // PIC16F84A用
#include<16f84a.h>#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#define ON 1
#define OFF 0#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.3void main()
{
int i,led_data;
RB=0x00;
set_tris_a(0x0c);
set_tris_b(0x00);
while(1){
led_data=0x01;
for(i=0;i<4;i++){
RB=led_data;
★★★★;
RB=0x00;
★★★★;
led_data=led_data<<1;
}
}
}
■ 変数と宣言
int i,led_data;
iやled_dataを変数といいます。変数は数や文字を記憶させておく引き出しです。わかりやすいように名前を付けておくことができます。
その前についているintですが、変数の型を示しています。intは整数型です。普通のC言語ではintは整数型なので、正負の数を扱えるのですが、CCS-Cでは普通に宣言するとintは正の数を扱う型となります。
Basic言語には型の考え方はありません。C言語は使う変数がどんな型なのかを宣言することでメモリを節約しています。
■for文
for(i=0;i<4;i++){
実行させる内容
}
iが0,1,2,3の4回変化する間{}の中を実行します。
回数が決まっている内容を実行するのに使います。
■ シフト命令
led_dataという名前の変数に0x01を代入します。これがLED1を点灯するデータになります。
RB=led_data;
実際にはこの記述により、LEDが点灯します。
最初のled_dataの内容は0001です。これを0010にするとLED2が点灯します。どうすればよいかというと、シフト命令を使い、次のように記述します。
シフト命令は変数値を右または左へ1ビットずらす命令です。
led_data=led_data<<1;
これを順番に実行すると、
0001、0010、0100、1000
まで進み、0001に戻ります。これを繰り返すことにより、LEDの順次点灯を実現します。
説明になかった部分で、プログラムの条件を満たすには★に何を入れればよいでしょうか? 考えてみましょう。
正解は次回に掲載します。

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