<PIC16F688 LEDにデータ表示1>


通常、変数に入れた文字データはLCDなどのディスプレイで直観的に見ることが出来ます。

ここでは、この変数に入れた文字データをLEDに表示させてみる実験です。

例えば、文字の'A'は、16進で0x41、2進で0b01000001です。(ASCコード)

8bitで構成
MSB                                        LSB
7bit  6bit  5bit  4bit  3bit  2bit  1bit  0bit 
〇    ●    〇     〇    〇    〇    〇    ●


このことを利用すれば、LEDの点灯を見て解読出来そうです。

イメージとしては、ポートがRC7,RC6,RC5,RC4,RC3,RC2,RC1,RC0と、連続的にあればそれぞれにLEDを接続する。

char =moji;
moji='A'
PORTC=moji;

PORTC=〇●〇〇 〇〇〇●としてLEDが点灯するはずです。

しかし、PIC16F688はPORTAもPORTCも6個しかありませんので上記のようにはいきません。

しかし、下位4ビットだけなら出来そうです。AからOは上位4ビットは0100固定
下位4ビットは、0001から1111まで変化しますが解読出来ます。

ちなみにPからZは上位4ビットは0101固定で下位4ビットは、0000から1010まで変化します。

下のプログラムを実行すれば、次のようにLEDは点灯するはずです。
A 〇〇〇●
B 〇〇●〇
C 〇〇●●
N ●●●〇
O ●●●●



プログラム
-----------------------------------------------------------------------------------------
#include <htc.h>

__CONFIG(FCMDIS & IESODIS & BOREN & UNPROTECT & MCLREN & PWRTEN & WDTDIS & INTIO);
__IDLOC(0001);

#define _XTAL_FREQ 31000  //31k
#define JIKAN 2000


main()
{

OSCCON=0x00;  //31k

ANSEL=0x00;
CMCON0=0x07;

TRISC=0b00000000;  //RORTCを出力に設定
PORTC=0x00;        //RORTCをL(0)にする

char moji;


	while(1){
	moji='A';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji='B';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji='C';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji='N';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji='O';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	PORTC=0x00;
	__delay_ms(JIKAN);

	}
}
-----------------------------------------------------------------------------------------

回路図



文字PからZは上位ビットが0101下位ビットが0000(P)から1010(Z)です

下のプログラムを実行すれば、次のようにLEDは点灯するはずです。
O ●●●●
P 〇〇〇〇
Q 〇〇〇●
R 〇〇●〇
Z ●〇●〇



プログラム
-----------------------------------------------------------------------------------------

#include <htc.h>

__CONFIG(FCMDIS & IESODIS & BOREN & UNPROTECT & MCLREN & PWRTEN & WDTDIS & INTIO);
__IDLOC(0001);

#define _XTAL_FREQ 31000  //31k
#define JIKAN 2000


main()
{

OSCCON=0x00;  //31k

ANSEL=0x00;
CMCON0=0x07;

TRISC=0b00000000;  //RORTCを出力に設定
PORTC=0x00;        //RORTCをL(0)にする

char moji;


	while(1){
	moji='O';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji='P';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji='Q';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji='R';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji='Z';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	PORTC=0x00;
	__delay_ms(JIKAN);

	}
}
-----------------------------------------------------------------------------------------

次は、上位ビットの表示に挑戦です。
方法としては、RC0からRC3に上位ビットを持ってくるイメージです。

'A'の文字は、0x41(0b01000001)

下位ビットの表示
RC3 RC2 RC1 RC0
0   0   0   1

上位ビットの表示
RC3 RC2 RC1 RC0
0   1   0   0

このようにすれば次のように表示します。
まず下位ビットが表示 〇〇〇● 次に上位ビットが表示 〇●〇〇



実現させるにはビット操作をします。

ビット操作のイメージ

                RC3 RC2 RC1 RC0
0   1   0   0   0   0   0   1
MSB                         LSB

moji=moji>>4;とすれば、右に4bitシフトします。
                RC3 RC2 RC1 RC0
                0   1   0   0   0   0   0   1
                MSB                         LSB

下がそのプログラムです。

プログラム
-------------------------------------------------------------------------------
#include <htc.h>

__CONFIG(FCMDIS & IESODIS & BOREN & UNPROTECT & MCLREN & PWRTEN & WDTDIS & INTIO);
__IDLOC(0001);

#define _XTAL_FREQ 31000  //31k
#define JIKAN 2000


main()
{

OSCCON=0x00;  //31k

ANSEL=0x00;
CMCON0=0x07;

TRISC=0b00000000;  //RORTCを出力に設定
PORTC=0x00;        //RORTCをL(0)にする

char moji;


	while(1){
	moji='A';		 
	PORTC=moji;
	__delay_ms(JIKAN);

	moji=moji>>4;		 
	PORTC=moji;
	__delay_ms(JIKAN);

	PORTC=0x00;
	__delay_ms(JIKAN);

	}
}
-----------------------------------------------------------------------------------------


ビット操作を次のようにプログラムするとLEDが左右に流れるように点灯させることが出来ます。



プログラム
-----------------------------------------------------------------------------------------
#include <htc.h>

__CONFIG(FCMDIS & IESODIS & BOREN & UNPROTECT & MCLREN & PWRTEN & WDTDIS & INTIO);
__IDLOC(0001);

#define _XTAL_FREQ 31000  //31k
#define JIKAN 200


main()
{

OSCCON=0x00;  //31k

ANSEL=0x00;
CMCON0=0x07;

TRISC=0b00000000;  //RORTCを出力に設定
PORTC=0b00001000;  //RORTCをL(0)にする

char moji;
moji=0b0001000;
    PORTC=moji;
	__delay_ms(JIKAN);
	while(1){

    moji=moji>>1;
	PORTC=moji;
    __delay_ms(JIKAN);
    moji=moji>>1;
	PORTC=moji;
    __delay_ms(JIKAN);
    moji=moji>>1;
	PORTC=moji;
    __delay_ms(JIKAN);

    moji=moji<<1;
	PORTC=moji;
    __delay_ms(JIKAN);
    moji=moji<<1;
	PORTC=moji;
    __delay_ms(JIKAN);
    moji=moji<<1;
	PORTC=moji;
    __delay_ms(JIKAN);

	}
}
-----------------------------------------------------------------------------------------