PIC16F84Aを用いたドットマトリクスLEDの駆動

PICマイコンの代名詞ともいえる16F84Aを用いて4*5のドットマトリクスLEDに数字を流してみました。

街中で電光掲示板はよく見ますが、どのようにして駆動されているのかは良く知られていないものです。
ここでは、マイコンを用いた4×5ドットのマトリクスLEDの駆動回路を作成し、PIC用のプログラムを組みながら動作原理を理解します。
今回は数字の”1”を1文字だけ右から左へとスクロールさせることにしました。
但し、回路、プログラム共に基本的なものですので、詳しい解説はばっさり省かせて頂きます。

※ここではPIC用のプログラムを作成するのにCCS−Cコンパイラ(有料)を使用しています。コンパイラは各自用意してください。
又、PICライターは秋月電子さんのAKI−PICプログラマー Ver.4 キットを使用しています。

駆動するための回路は以下の通りです。(↓画像はクリックして拡大)
4×5ドットのマトリクスLEDなんて早々売ってないので自作する必要があります。
回路図通りに作れば動作しますが、あくまでも理解を目的とした回路ですので、あるあ・・ねーよ!なところがあるかもしれません。




※プログラム自体も非常に初歩的なもの(少し触れたことのある人なら容易に理解できるレベル)ですが、C言語がそもそも全く分らない人は事前に基本的なC言語の勉強をしてください。
又、ここに載せたプログラムは動作原理を理解するためのものなので、効率的でないかもしれません。変な所は各自で裏を取ってより良いプログラムを作成してください。

作成したプログラムは以下の通りです

//////////////////////////////////
//CCS-C用
//PIC16F84A用ドットマトリクスLED文字スクロールプログラム(評価用)
//programed by:TaKE_IN
//////////////////////////////////
#include <16F84A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading

#use delay(clock=20000000)


//関数定義
void hyouji(void);
void sift(void);
void souten(void);
//

//////////////////文字宣言用。↓の変数の書き換えで表示する内容を変更できます。デフォルトで”1”が入ってます
int1 m[4]={0,0,1,0};
int1 n[4]={0,1,1,0};
int1 o[4]={0,0,1,0};
int1 p[4]={0,0,1,0};
int1 q[4]={0,0,1,0};
///////////////////V-RAM(?)
int1 z[4]={0,0,0,0};
int1 z1[4]={0,0,0,0};
int1 z2[4]={0,0,0,0};
int1 z3[4]={0,0,0,0};
int1 z4[4]={0,0,0,0};
//////////////////汎用変数他
int h;
int i;
int j;
int sinkou=0;//プログラム進行管理用フラグ
//////////////////
int1 deta1;
int1 deta2;
int1 deta3;
int1 deta4;
int1 deta5;
//////////////////この↓メイン関数
void main()
{
//init
output_low(pin_A0);//LED1行目
output_low(pin_A1);//LED2行目
output_low(pin_A2);//LED3行目
output_low(pin_A3);//LED4行目
output_low(pin_B4);//LED5行目
output_low(pin_B0);//LED1列目
output_low(pin_B1);//LED2列目
output_low(pin_B2);//LED3列目
output_low(pin_B3);//LED4列目
output_low(pin_B5);//sw1(ボタン用未使用)
output_low(pin_B6);//sw2(ボタン用未使用)
output_low(pin_B7);//sw3(ボタン用未使用)
//init kokomade
// setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

// TODO: USER CODE!!
output_high(pin_A0);
output_high(pin_B0);
delay_ms(500);
output_low(pin_B0);//↑初期動作確認用(左上のLEDを500ms点灯)
h=0;
sinkou=0;
while(1){//メインループ
if(sinkou==0){
souten();//////////deta(変数)に文字データ1列分の情報を代入します。
}
if(sinkou==1){
sift();////////////V-RAM(?)の内容を1行分ずらします。(文字の流れる方向は右→左です。)
}
if(sinkou==2){
hyouji();/////////V-RAM(?)の内容をドットマトリクスLEDに反映させます。
}
}//メインループここまで

}//メイン関数ここまで




void souten(void){//各行のh列目(h=0〜3)の内容をdetaに代入

deta1=m[h];
deta2=n[h];
deta3=o[h];
deta4=p[h];
deta5=q[h];
h++;
if(h==4){
h=0;
}
sinkou=1;
return;
}//souten


void sift(void){//V-RAM(?)の内容を1列左にずらす。一番右(z[3])にdetaを代入。
for(i=0;i<3;){
z[i]=z[i+1];
z1[i]=z1[i+1];
z2[i]=z2[i+1];
z3[i]=z3[i+1];
z4[i]=z4[i+1];
if(i!=3){
i=i+1;
}
if(i==3){
z[3]=deta1;
z1[3]=deta2;
z2[3]=deta3;
z3[3]=deta4;
z4[3]=deta5;
sinkou=2;
return;
}
}
}//sifto



void hyouji(void){//V-RAM(?)の内容に対応してLEDをON/OFF
for(j=0;j<100;j++){
output_low(pin_B4);
output_high(pin_A0);//1行目

if(z[0]==0){
output_low(pin_B0);
}else{
output_high(pin_B0);
}

if(z[1]==0){
output_low(pin_B1);
}else{
output_high(pin_B1);
}

if(z[2]==0){
output_low(pin_B2);
}else{
output_high(pin_B2);
}

if(z[3]==0){
output_low(pin_B3);
}else{
output_high(pin_B3);

}//////////////////////1行目ここまで
delay_ms(1);

output_low(pin_A0);
output_high(pin_A1);//1行目

if(z1[0]==0){
output_low(pin_B0);
}else{
output_high(pin_B0);
}

if(z1[1]==0){
output_low(pin_B1);
}else{
output_high(pin_B1);
}

if(z1[2]==0){
output_low(pin_B2);
}else{
output_high(pin_B2);
}

if(z1[3]==0){
output_low(pin_B3);
}else{
output_high(pin_B3);
}//////////////////////2行目ここまで
delay_ms(1);

output_low(pin_A1);
output_high(pin_A2);//3行目

if(z2[0]==0){
output_low(pin_B0);
}else{
output_high(pin_B0);
}

if(z2[1]==0){
output_low(pin_B1);
}else{
output_high(pin_B1);
}

if(z2[2]==0){
output_low(pin_B2);
}else{
output_high(pin_B2);
}

if(z2[3]==0){
output_low(pin_B3);
}else{
output_high(pin_B3);
}//////////////////////3行目ここまで
delay_ms(1);

output_low(pin_A2);
output_high(pin_A3);//4行目

if(z3[0]==0){
output_low(pin_B0);
}else{
output_high(pin_B0);
}

if(z3[1]==0){
output_low(pin_B1);
}else{
output_high(pin_B1);
}

if(z3[2]==0){
output_low(pin_B2);
}else{
output_high(pin_B2);
}

if(z3[3]==0){
output_low(pin_B3);
}else{
output_high(pin_B3);
}//////////////////////4行目ここまで
delay_ms(1);

output_low(pin_A3);
output_high(pin_B4);//5行目

if(z4[0]==0){
output_low(pin_B0);
}else{
output_high(pin_B0);
}

if(z4[1]==0){
output_low(pin_B1);
}else{
output_high(pin_B1);
}

if(z4[2]==0){
output_low(pin_B2);
}else{
output_high(pin_B2);
}

if(z4[3]==0){
output_low(pin_B3);
}else{
output_high(pin_B3);
}//////////////////////5行目ここまで
delay_ms(1);
}//for
sinkou=0;
return;
}//hyouji/

↑プログラムはココまでです。



とりあえず作成した回路の写真を載せておきます。

戻る