写真は使用した基板です。ICD-3を使用するためのアダプターを使用していますので、PICを着脱させることなくプログラムのロードとランをすることができます。
プログラムの開発環境はxc-8を使用しました。
ソフトの説明
PIC16F84AのBポートに8個のLEDを接続し順次フロー点灯をさせます。
方法は多岐にわたりますが、ここでは次の2種類について行いました。
1つはPORTBに直接16進の数値を書き込む方法で、単純ですがプログラムが長くなってしまいます。
PORTB=0x01;
__delay_ms(500);
PORTB=0x02;
__delay_ms(500);
PORTB=0x04;
__delay_ms(500);
PORTB=0x08;
__delay_ms(500);
PORTB=0x10;
__delay_ms(500);
PORTB=0x20;
__delay_ms(500);
PORTB=0x40;
__delay_ms(500);
PORTB=0x80;
__delay_ms(500);
動作は次のようになります。oが点灯で*が不灯です。
o*******
*o******
**o*****
***o****
****o***
*****o**
******o*
*******o
PORTBは8ビットですので16進数を代入することになります。これでRB1からRB8まで0.5秒で順次点灯していきます。0xFFを代入すれば全点灯します。
oooooooo
PORTBに1から8を代入すると、下位4ビットで16進表示し上位4ビットは動作しません。
o***----
*o**----
oo**----
**o*----
o*o*----
*oo*----
ooo*----
***o----
速度を変えるには__delay_ms(X)のXをかえることにより変わりますが、値が小さいと全点灯しているように見えます。
今回の順次点灯プログラムは一次配列を使用しました。
この配列をポインタで読みだしていきます。
ポインタはfor文でインクリメントします。
まず、16進数の点灯パターンを順番にaとして配列に入れます。要素数は8です。
ポインタをbとしてb = aとすることにより、aの先頭アドレスをbに書き込みます。
c=*bで先頭アドレスの中身をcに代入し更にこれをPORTBに入れます。
次にポインタをfor文によりインクリメントすることによりフロー点灯することになります。
ソースリスト
#include <xc.h>
#pragma config WDTE = OFF
#pragma config FOSC = HS
#pragma config PWRTE = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 10000000
char i, X=500, a ;
char *b ,c ;
int main(void)
{ TRISA = 0x02;
TRISB = 0x00;
while(1)
{
char a[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
b = a ; //aの先頭アドレスをb(ポインタ)に書く
c = *b; //先頭アドレスの値をcに入れる
PORTB = c;
for(i= 1;i<9;i++)
{ b++;
c= *b;
PORTB = c;
__delay_ms(X);
}
}
}