大分工業高等専門学校紀要

第 50 号(平成 25 年 11 月)

MPLAB XC8によるダイナミック点灯プログラムの作成例

山﨑勝翁

技術部

PICプログラムをC言語で作成する場合，有料と無料のコンパイラの選択肢がある．有料の場合は導入コストが必要である．本研究では，無料のPIC用MPLAB XC8コンパイラを利用して，アセンブラより効率よくプログラム作成可能なC言語に注目し，プログラムの作成を行った．C言語は高水準言語と呼ばれ，人にやさしい言語として期待される．文字データは，2次元配列の利用が適切で，繰返しの多重ループで取り出すと効率的である．確実性を増すため配列の初期化と繰返しをprintf関数により出力し検証し，printf関数をPICのPORTA，PORTBへの出力に変更すると文字表示が可能なことを確認したので報告する．

キーワード : MPLAB XC8コンパイラ，2次元配列，繰返し，多重ループ

１．はじめに

２．方法

この報告はPIC16F648Aによる文字表示回路の製作 1) の(1) ソフトウェア

続編である．ここでは従来からの変更点とMPLAB XC8コ

Windows7Enterprise

64ビット

ンパイラによるCプログラムの1つの記述例について行う．

Windows7professional

32ビット

現環境は，回路ではドットマトリクスLEDがカソ－ドコモ

WindowsXP professional

32ビット

ンに変更され，Microchip technology社の統合環境MPLABPICC Lite

XC8 IDEのXC8コンパイラの設定である．このPIC用C言語

MPLAB IDE

v9.80

v9.81 XC8 v1.01

v8.63

MPLAB XIDE v1.30

はANSI規格準拠であるが，プログラムを動作させるにはPIC用の特殊な記述を理解する必要がある．アセンブラは(2) ハードウェア

記述が長いので，繰返しが多いダイナミック点灯プログラ

PIC16F648A,PIC18F628A

ムをC言語でとの要望があり，それに応えるため検証した．

ドットマトリクスLED

最初にBorland C++CompilerやVisualStudio2012コン

抵抗ネットワーク 220Ω

OSL641501-ARA
BI N3-221

ソールアプリケーション(以下VC++)を利用して基礎的なCプログラム2)～4)を作成し配列の確認を行った．4文字表示

回路の配線では，ポートAのRA4ピンがオープン・ドレイのデータ化の際，ポートBのデータを表にまとめ7行4列でンのために抵抗を介して電源と接続した．バイパスコンデ作成したが，正しくは4行7列の2次元配列が適切であるこンサ0.1μFを取り付け，不要なノイズのカット，電源電圧とがわかった．検証はポートAの1次元配列とポートBの2の安定を図った．図-1は作成例，図-2は回路図である．

次元配列の初期化が確実にされているか，繰返しに間違いがないか，よく使われるprintfの出力で確認した．XC8コン
パイラによるCプログラムではprintf関数を各ポートへの出力に変更することでPICの各ピンからの出力が制御可能となる．遅延時間(ウェイト)のdelay関数5)は簡単に使用できるのでその記述にも触れる．最後に低水準言語のアセン
ブラと高水準言語のC言語プログラムでのソースファイルや生成された実行型のhexファイルについて比較を行った．
アセンブラとC言語でそれぞれの特徴や利点があることが図-1 作成例（回路）分かったので最後に考察する．

―72―

大分工業高等専門学校紀要

第 50 号(平成 25 年 11 月)

リスト-2

printfの出力例（b[1][0]～b[3][6]省略）

int main(void){
printf("¥n¥n配列要素とデータ格納の確認¥n");printf("配列a¥n");printf("%2d %2d %2d %2d %2d %2d %2d¥n¥n",a[0],a[1],a[2],a[3],a[4],a[5],a[6]);printf("配列b¥n");printf("%2d %2d %2d %2d %2d %2d %2d¥n",b[0][0],b[0][1],b[0][2],b[0][3],b[0][4],b[0][5],b[0][6]);}図-2 回路図

３．配列と繰返し表-1 配列a124000102101120213031

この章ではBorland C++CompilerやVC++を使用した

10408003040506121314151622232425263233343536

基本プログラムで，配列の初期化と繰返しが確実に実行さ8
表-2 配列bれているか確認するプログラムについて記述する．
リスト-1は１次元配列と２次元配列の初期化例である.
リスト-2はprintfの出力例，リスト-3はfor文による繰返し
例で図-3，図-4が実行結果である．a[0]～a[6]はa[列番号]，b[0][0]～b[3][6]はb[行番号][列番号]を表している．
実行結果から配列要素のとおりにデータが初期化されていることがわかる．配列aはポートAを，配列bはポートBを想定したものである．変数は行がi，列がj，繰り返し回数をnとした．列を示すjを配列aと配列bに使うのがポイントである．リスト-3はfor文による3重ループで多重ループと呼ばれ，以下のような処理が行われる．
①iが0のとき，②nの残り繰返し5回表示のとき， jを0から6まで増やし③配列a[0]からa[6]をprintfで出力

図-3 リスト-1 ＋ リスト-2の実行結果④配列b[0][0]からb[0][6]をprintfで出力繰り返しのため省略してnの残り繰返し4回から1回まで②③④を繰り返す
iが1のときからiが3のときで①②③④を繰り返す

リスト-3

for文による繰返し例

int main(void){
int i,j,n;for (i= 0; i < 4; i++) {リスト-1 配列の初期化例

for (n = 5 ; n > 0 ; n--) {#include <stdio.h>

printf("¥n残り繰返し = %d回¥n", n);for(j = 0 ;j < 7; j++) {int a[7] = {1,2,4,8,10,40,80};

printf("a[%2d] = %2d → ",j,a[j]);int b[4][7] = {printf(" b[%2d][%2d] = %2d¥n", i,j,b[i][j]);{00,01,02,03,04,05,06} ,}{10,11,12,13,14,15,16} ,}{20,21,22,23,24,25,26} ,}{30,31,32,33,34,35,36} ,};return 0;}―73―

大分工業高等専門学校紀要

第 50 号(平成 25 年 11 月)

表-5 配列b0x81

0x00

0x7E

0x7E

0x7E

0x00

0x81

0x00

0x00

0xF9

0xE7

0x9F

0x00

0x00

0x81

0x00

0x7E

0x7E

0x7E

0x3C

0xBD

0xFE0xFE

0xFE

0x00

0x00

0xFE

0xFE

b[0][0]b[0][1]b[0][2]b[0][3]b[0][4]b[0][5]b[0][6]b[1][0]b[1][1]b[1][2]b[1][3]b[1][4]b[1][5]b[1][6]b[2][0]b[2][1]b[2][2]b[2][3]b[2][4]b[2][5]b[2][6]b[3][0]b[3][1]b[3][2]b[3][3]b[3][4]b[3][5]b[3][6]表-6 配列要素

５．XC8 C言語プログラム

図-4 リスト-1 ＋ リスト-3の実行結果（一部省略）

XC8 C 言語プログラムの作成例を示す．XC8 コンパイ

４．文字のデータ化

ラは，ANSI 準拠のため、普通のＣ言語の文法と同じように、演算，繰返し，配列、関数，ポインタ、構造体等を用

0123467 ×

0123467 ×

0123467 ×

0123467 ×

いたプログラミングが可能である．MPLAB IDE で XC8○●●●●●○ × 0 ●●○○○●● × 0 ○●●●●●○ × 0 ●●●●●●● ×1 ●●○○○●● × 1 ●●●○○●● × 1 ●●○○○●● × 1 ○○○●●○○ ×
2 ●●○○○●● × 2 ●●●○○●● × 2 ●●○○○○○ × 2 ○○○●●○○ ×
3 ●●○○○●● × 3 ●●○●○●● × 3 ●●○○○○○ × 3 ○○○●●○○ ×
4 ●●○○○●● × 4 ●●○●○●● × 4 ●●○○○○○ × 4 ○○○●●○○ ×
5 ●●○○○●● × 5 ●●○○●●● × 5 ●●○○○○○ × 5 ○○○●●○○ ×
6 ●●○○○●● × 6 ●●○○●●● × 6 ●●○○○●● × 6 ○○○●●○○ ×
7 ○●●●●●○ × 7 ●●○○○●● × 7 ○●●●●●○ × 7 ○○○●●○○ ×
0

コンパイラを使う場合，C プログラムを拡張子.c で作成し，ProjectWizard で以下のように C コンパイラを使う設定にする．
Active Toolsuite： Microchip XC8 ToolSuite

2 進数

16 進数

ToolsuiteContents:Microchip MPLAB XC8 Compiler

10000001 →

0x81

00000000 →

0x00

01111110 →0x7E

01111110 →0x7E(1) 制御関数のヘッダファイル

01111110 →0x7E

レジスタやビットの名前が定義されている．

00000000 →0x00#include10000001 →0x81

XC8コンパイラ用の記述5)6)についての説明である．

“pic.h”(2) 内部発振回路
4MHzの指定．#define _XTAL_FREQ 4000000

図-5 文字パターンのデータ化
図-5は文字パターンOのポートBのデータ化を示したものである．文字パターンは自作のExcelのテンプレートにより，赤ドットを点灯としてコピー&貼付して作成した．
1文字のデータはポートBの接続からこれを右へ90°回転させ，以前とは論理が逆の消灯を「1」，点灯を「0」として8ビットの2進数で表し，その後16進数へ変換した．2進数では点灯状態がわかり，16進数では桁数が少なくなり間違いを起こしにくい利点もある．表-3配列aはポートAのデータ，表-4はその配列要素,表-5 配列bはポートBのデー
タ、表-6はその配列要素である．
0x02

0x04

0x08

0x10を示す．
PICC Lite v9.80まで__CONFIG(INTIO & WDTDIS & PWRTDIS &BORDIS & LVPDIS & MCLRDIS);PICC Lite

v9.81以降

XC8v1.01で確認済み__CONFIG(FOSC_INTOSCIOWDTE_OFF&PWRTE_ON&&

CP_OFF&BOREN_OFF&

LVP_OFF & MCLRE_OFF);表-3 配列a0x01(3) コンフィグレーション・ビットの設定
PICC Lite v9.80を境に変更されているので2つの記述例

0x40

0x80

(4)トライステート・ポート
このレジスタのビットを「1」にすると入力ピンになり，

表-4 配列要素
a[0]

a[1]

a[2]

a[3]

a[4]

「 0 」 に す る と 出 力 ピ ン に な る ． TRISA=0x00 ，
a[5]

a[6]

TRISB=0x00―74―大分工業高等専門学校紀要

第 50 号(平成 25 年 11 月)(5)遅延時間表-7 アセンブラとC言語の比較

delay関数はpic.hファイルのBuilt-in delay routineに，C言語

アセンブラ

ミリ秒単位とマイクロ秒単位が定義されている．先頭にア

ソースファイル

3531バイト935バイトンダーバーを2個つけて1msの場合は__delay_ms(1);，1μ文字数453

148

sの場合は__delay_us(1);と記述する．数値を変更すると希実行型ファイル

1156バイト2052バイト望の遅延時間が得られる．

６．考察
リスト-4が文字表示プログラム例である．無限ループ
while(1)でONCTと繰り返し連続表示させているため4重(1)表-7が「ONCT」と文字表示をするアセンブラとC言ループである．

語での違いを比較したものである．ソースファイルとリスト-4 文字表示プログラム例

文字数では，C言語の方が約1/3の記述で済み，実行型#include "pic.h"//ヘッダファイルのファイルサイズは2倍ほど大きい．このことから，C#define _XTAL_FREQ 4000000//内部発振回路 4MHz

言語は短時間でプログラム作成が可能といえる．

//コンフィグレーション・ビットの設定(2)ポートの入出力設定TRISA，TRISBは，バンクの切換__CONFIG(FOSC_INTOSCIO & CP_OFF & WDTE_OFF &えが自動で行われるので，値を設定するだけでよい．

PWRTE_ON & BOREN_OFF & LVP_OFF & MCLRE_OFF);(3)遅延時間の記述では、C言語はdelay関数の1行で簡潔にmain(){

済み、アセンブラでは，1サイクル実行時間から繰返し
// PIC の初期化で遅延時間を作成するため，計算が必要となる．

CMCON = 0x07;// コンパレータ OFF

TRISA = 0x00;// PORTA すべてを出力設定(4)C言語は自作の関数や標準ライブラリ関数で利用方法

TRISB = 0x00;// PORTB すべてを出力設定を考え，アセンブラは命令を１つひとつ記述するため，詳細に仕組みを理解でき細かな設定には向いている．

int i,j,n;//ポート A データ(5) printfでの確認は有効な手段である．格納された配列デ

int a[7]={0x01,0x02,0x04,0x08,0x10,0x40,0x80};

ータをfor文で繰り返し取り出す動作を把握でき,表示//ポート B データで確認できたので確実性が増した．

int b[4][7]={{0x81,0x00,0x7E,0x7E,0x7E,0x00,0x81}, //O

７．おわりに{0x00,0x00,0xF9,0xE7,0x9F,0x00,0x00}, //N{0x81,0x00,0x7E,0x7E,0x7E,0x3C,0xBD}, //C

本報告では，C言語のfor文の繰返しによる多重ループや{0xFE,0xFE,0xFE,0x00,0x00,0xFE,0xFE}, //T

PIC専用のdelay関数を使い、効率のよい単純明快なプロ};

グラムが完成した．C言語が人にやさしい高水準言語と呼while(1) {//無限ループ

for(i=0;i<4;i++){for(n=143;n>0;n--){for(j=0;j<7;j++){

ばれる理由が確かめられた．

//行の移動：i//繰り返し回数:ｎ=143//列の移動:j

PORTA=a[j];//ポート A へ出力PORTB=b[i][j];//ポート B へ出力

参考文献
1) 山﨑勝翁，手島規博：PIC16F648Aによる文字表示回路の製作，大分工業高等専門学校紀要
2) C言語ではじめるPICマイコン__delay_ms(1); //1ms のウェイト
3)ラではじめよう－ 中尾真治 オーム社
[新版] 明解C言語 入門編 柴田望洋 ソフトバンク}

4)

クリエイティブ
[新版] 明解C言語 中級編return 0;

5)

クリエイティブ
MICROCHIP HI-TECH C User’s GUIDE}}}}

第45号－フリーのCコンパイ

6)

柴田望洋

ソフトバンクMPLAB XC8 C Compiler User’s Guide(2013.9.30受付)―75―