<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);
}
}
-----------------------------------------------------------------------------------------