|
本PICマイコンには、あらかじめプログラムが書き込まれているので、PICマイコンをいじる必要はありませんが、PICマイコンのプログラムを拡張される方は、次の事項を参考にして下さい。
マイコン開発ソフトは、「マイクロチップ社のMPLAB IDE v8.10(無料)」を利用しています。
尚、プロジェクトファイル名は、ファイル名だけでなくそのファイルを置くパスも、すべて半角英数字にしないと、動きません。
日本語のフォルダーに入れ、ファイル名を半角英数字では動きませんので、注意して下さいね。
(例 C:\モータ\motor\motor.mcp は、「モータ」が日本語のフォルダーなので動きません。)
delay関数を利用していますので、次の作業をしています。(パソコンのシステムは、Cフォルダーにあることとします。)
C:\Program Files\HI-TECH Software\PICC\LITE\9.60\samples\delayのdelay.cとdelay.hを、プロジェクトファイルと同じフォルダーにコピーする。
そしてコピーしたdelay.hの #define XTAL_FREQ 4MHZ の4を10に変更。
ちなみに、使用したファイルをダウンロード(右クリックして、対象をファイルに保存)できるようにしておきました。
ダウンロード出来るファイルは、4を10に変更してあります。
delay.cファイルのダウンロードはこちらです。(delay.c)
delay.hファイルのダウンロードはこちらです。(delay.h)
PIC16F84マイコンには、次のC言語プログラムが書き込まれていますので、そのままコピーして利用することが出来ますが、マイコンへ書き込む機材によって、コンフィグの書き方が違うので、そのままソースをコピーして書き込んでも、上手く動作しないかもしれません。
その際は、HEXファイルをダウンロード(右クリックして、対象をファイルに保存)して、書き込んでみて下さい。
HEXファイルのダウンロードはこちらです。(LCD03.hex)
C言語ソースは、この下からコピーしてご利用下さい。
#include <pic.h>
#include "delay.h"
__CONFIG(HS & WDTDIS & PWRTEN & UNPROTECT);
#define RS RA1
#define E RA0
#define DB4 RB4
#define DB5 RB5
#define DB6 RB6
#define DB7 RB7
void main(void){
PORTA = 0; /* ポートAは全てロー */
TRISA = 0b00000000; /* 0は出力 1は入力 */
PORTB = 0; /* ポートBは全てロー */
TRISB = 0b00000000; /* 0は出力 1は入力 */
/* 15ms以上待つ */
DelayMs(100);
/* ファンクションセット */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1 ;
E = 1;
DelayMs(1);
E = 0;
/* 4.1ms以上待つ */
DelayMs(10);
/* ファンクションセット */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
/* 100μs以上待つ */
DelayMs(1);
/* インターフェースデータ長8ビット */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* インターフェースデータ長4ビット */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* インターフェースデータ長4ビット、2行、文字形式を5×7ドットマトリクスに設定。ここから4ビット動作。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 表示オフ */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 表示オン */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* エントリーモード カーソル右に移動。表示全体はシフトしない。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 初期設定後 */
/* 表示をONし、カーソルをOFFさせます。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* -------------------------------------------------------------- */
while(1){
int a;
for(a=0;a<16;a++){
/* DDRAM書き込み文字例「A」を書き込みます。 */
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(30);
/* カーソルを左(「A」の文字があった場所)へもどす。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* DDRAM書き込み 「A」の文字列があった場所に、文字例「空白」を書き込みます。 */
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 音を出す。 */
RB3 = 1;
DelayMs(1);
RB3 = 0;
}
/* CGRAN(1)を利用する。---------------------------------------------- */
/* CGRAN(1)のアドレスの1行目をセットする。------------ */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7がCGRAN(1)を意味し、DB6とDB5とDB4が1行目を表す。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの1行目に、絵を描く。 */
/* 下のDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7とDB6とDB5とDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの2行目をセットする。------------ */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7がCGRAN(1)を意味し、DB6とDB5とDB4が2行目を表す。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの2行目に、絵を描く。 */
/* 下のDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7とDB6とDB5とDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの3行目をセットする。------------ */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7がCGRAN(1)を意味し、DB6とDB5とDB4が3行目を表す。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの3行目に、絵を描く。 */
/* 下のDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7とDB6とDB5とDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの4行目をセットする。------------ */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7がCGRAN(1)を意味し、DB6とDB5とDB4が4行目を表す。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの4行目に、絵を描く。 */
/* 下のDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7とDB6とDB5とDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの5行目をセットする。------------ */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7がCGRAN(1)を意味し、DB6とDB5とDB4が5行目を表す。 */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの5行目に、絵を描く。 */
/* 下のDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7とDB6とDB5とDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの6行目をセットする。------------ */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7がCGRAN(1)を意味し、DB6とDB5とDB4が6行目を表す。 */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの6行目に、絵を描く。 */
/* 下のDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7とDB6とDB5とDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 1 , DB6 = 1 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの7行目をセットする。------------ */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7がCGRAN(1)を意味し、DB6とDB5とDB4が7行目を表す。 */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの7行目に、絵を描く。 */
/* 下のDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7とDB6とDB5とDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 1 , DB6 = 0 , DB5 = 1 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの8行目をセットする。------------ */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7がCGRAN(1)を意味し、DB6とDB5とDB4が8行目を表す。 */
RS = 0 , DB7 = 0 , DB6 = 1 , DB5 = 1 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* CGRAN(1)のアドレスの8行目に、絵を描く。 */
/* 下のDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 下のDB7とDB6とDB5とDB4が0だと空白、1だとドットが描ける。 */
RS = 1 , DB7 = 0 , DB6 = 1 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 書き込んだCGRAN(1)を呼び出す前に、DDRMのアドレスを、CGRAMを触ったので、2行目の先頭にカーソルをセットしなおす。 */
/* 2行目の先頭(DDRAMのアドレスは16進法で40,2進法で1000000)にアドレスを設定。 */
RS = 0 , DB7 = 1 , DB6 = 1 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
/* CGRAN(1)を呼び出す。 */
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 1 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(65);
/* 音を出す。 */
RB3 = 1;
DelayMs(30);
RB3 = 0;
DelayMs(30);
RB3 = 1;
DelayMs(30);
RB3 = 0;
DelayMs(30);
RB3 = 1;
DelayMs(30);
RB3 = 0;
/* 表示クリア。 */
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 1;
E = 1;
DelayMs(1);
E = 0;
DelayMs(1);
/* 1行目の先頭(DDRAMのアドレスは0)にアドレスを設定。 */
RS = 0 , DB7 = 1 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
RS = 0 , DB7 = 0 , DB6 = 0 , DB5 = 0 , DB4 = 0;
E = 1;
DelayUs(255);
E = 0;
DelayUs(255);
}
}
|