7セグメントLEDシリアルドライバモジュールを表示させる
〔PICの動かせ方入門に戻る〕
7セグメントLEDシリアルドライバモジュールの基本編の話は、Arduinoでの記事ですがこちらを一読下さい。
このページではPIC16F1829を使い、7セグメントLEDを複数個配線した場合の話を書きます。
又、7セグLEDに小数点も表示させる様にプログラムを作成していますから浮動小数値を扱いますので、
プログラム容量は8Kword以上のPICをチョイスしましょう。
尚、浮動小数値を使わないならPIC12F1822/16F18313でも表示させるのは可能です。
《7セグメントLEDが複数個編》
複数個と書きましたがここでの例は3個で記述しますが、何個でも同じ様な感じです。
プログラムも複数個に対応しています。

電源は5Vを使用、3.3Vでも動作するでしょう。
RC6ピンをLATCHで配線します。
16F1829はMSSP1/MSSP2と2個有りますが、今回はMSSP1を
SPIで使います。
又、RB4ピンのSDI1は今回は使わないので配線無しですが、
他の機能ピンとして利用出来ません。
ダウンロードプログラムについて
↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
SevenSEG.zip
プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルとPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。
ダウンロードファイルを解凍すると下記の様なファイル構成です。
SevenSEG.c・・・・・・・・ 本体のサンプルプログラム
skSPIlib.c・・・・・・・・・・ SPI通信を行う関数ソースファイル
skSPIlib.h・・・・・・・・・・ SPI通信を行う関数のヘッダファイル
尚、CPUのクロックは32MHzを想定しています。
SevenSEG.c
実行させると約3秒後に整数値"0〜100"までを表示させ、
約2秒後に浮動小数値"7.46"を表示させます。
関数の使い方を説明します。
以下の関数はライブラリ化をしていないので使う場合はコピッペして下さい。
void SevenSEG_Erase(unsigned char kosu)
7セグLEDの表示を消す処理
kosu : 7セグLEDの実装した個数(今回なら3となります)
void SevenSEG_NumOut(unsigned char digit,unsigned char prec,unsigned char zero,
double val)
7セグLEDに指定の数値を表示させる処理
digit : 表示させる数値の桁を指定(小数点有りなら桁に含む)
"123"を表示させるなら3指定、"12.3"を表示させるなら4を指定です。
指定した桁は実装した7セグLEDと同じか少ない数値となります。
例えば、実装が"3"で桁指定2なら右詰めとなり先頭表示はzero引数にて指示します。
prec : 0で整数指定、それ以外は小数点の位置を指定
例えば、 "2.34"なら2を指定しますが、"234"なら0となります。
zero : ゼロパディング指定、0=空白 1=ゼロで埋める
val : 表示を行う数値を指定
整数値又は、浮動小数値を指定出来ますが、数値から文字列への変換はdtostrf( )関数に
従います、尚、左詰めには未対応です。
char *dtostrf(double val, signed char width, unsigned char prec, char *sout)
浮動小数値を文字列に変換する処理
この関数はArduinoのdtostrf( )関数と同じものです。
val : 変換を行う数値を指定します
width : 変換した文字列の個数を指定します(負数を指定すると左詰め)
prec : 小数点の位置を指定します
sout : 変換された文字列の格納先
RETURN: 指定した文字列の格納先アドレスをそのまま返します
skSPIlib.h
SPI通信を行う関数のヘッダファイルです。
"skSPIlib.c"を利用する場合に
#include "skSPIlib.h" をプログラムの先頭で記述して下さい。
デフォルトではMSSP1を使う様になりますが、PICによってはMSSP2が有ります。
MSSP2側を使う場合は、"#define SPI_MSSP2_USE"を記述して下さい。(コメントになっているので外す)
skSPIlib.c
このライブラリはSPI通信を行う為の関数集です。
この関数集は、PIC12F1822/PIC16F18xx/193x/PIC18F2xK22で使用出来ます。
SPI通信を行う関数の使い方を説明します。
SPI_Init(mode,divider,sdo)
SPIモードの設定と初期化を行う処理
mode :SPIの転送モードを設定します(クロック極性とクロック位相の組み合わせ)
SPI_MODE1 = クロック極性(0:LOW) クロック位相(0:アイドル0Vで、0V->5Vに変化で転送)
SPI_MODE0 = クロック極性(0:LOW) クロック位相(1:アイドル0Vで、5V->0Vに変化で転送)
SPI_MODE3 = クロック極性(1:HIGH) クロック位相(0:アイドル5Vで、5V->0Vに変化で転送)
SPI_MODE2 = クロック極性(1:HIGH) クロック位相(1:アイドル5Vで、0V->5Vに変化で転送)
divider :SPIの通信速度を設定します
SPI_CLOCK_DIV4 = Fosc/4 (PIC動作周波数の4分の1で動作)
SPI_CLOCK_DIV16 = Fosc/16 (PIC動作周波数の16分の1で動作)
SPI_CLOCK_DIV64 = Fosc/64 (PIC動作周波数の64分の1で動作)
SPI_CLOCK_DIVT2 = TMR2の出力の1/2 (タイマー2の速度で動作)
SPI_CLOCK_DIVADD = FOSC / ((SSPxADD + 1) * 4)
sdo :使用するSDO送信のピン番号を指定する
※ 16F1829の場合でMSSP2を使う場合は、SDO2出力が"RA5(2番ピン)"か"RC1(15番ピン)"の
いずれかを選択します、この場合は"sdo"に必ず”2”か”15”を設定します。
SPI_setDataMode(mode)
SPIの転送モード設定を行う処理
mode :SPIの転送モードを設定します(上記参照)
SPI_setClockDivider(divider,rate)
SPIの通信速度設定を行う処理
divider :SPIの通信速度を設定します(上記参照)
rate :SSPxADDに設定するクロック分周値(SPI_CLOCK_DIVADDを指定する場合に設定する値)
SPI_CLOCK_DIVADD = FOSC / ((SSPxADD + 1) * 4)
rate=0は指定不可です、”SPI_CLOCK_DIV4”を使いましょう。
ans = SPI_transfer(dt)
SPI通信でのデータ送信とデータ受信を行う処理
dt : 8ビットの送信するデータを指定します
ans: 8ビットの受信したデータを返します
《その他》

左写真は実験時の風景です。
電源はPICkit3から供給しています。
(PS. 5Vでも3.3V供給でも動作しています。)
7セグLEDをたくさんぶら下げる場合は別電源にしましょう。
やっぱり離れた所から数値を見るにはこれに限りますね〜ぇ。
4ピンで表示出来るので他のセンサー等の接続や制御も可能ですね。

最初は16F18313で実験を行っていましたが、
floatを使うとメモリが足りないのに気付き
16F1829に切り替えて実験を行いましたが、
せっかく配線図を作成したので載せて置きます
あ、そうそう左図のPICは右上が1番ピンです。
因みに16F1829のメモリは8Kwordで
コンパイル結果は85.9%でした。
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.