日曜技術者のメモ

趣味でやった事のメモ書きです。

はじめてのPICマイコン - LCD表示 1 -

マイコンで電子工作といえばPICマイコンが有名。
昔勉強しようと買ったPICマイコンがあるのを思い出したから
気晴らしに遊んでみた。

LCDに文字を表示するだけに2日もかかってしまった。
回路図は以下
f:id:ginnyu-tei:20120908163817g:plain

プログラムは今更アセンブリは・・・
と思いC言語にしてみた。(アセンブリの方が良かったかも・・・)

コードは以下
0を3つ表示するだけ

// ファイル名 LCD_test1.c
// 作成日   2012/09/08
// 機種    PIC16F84A
// CLOCK    4MHz
// コンパイラ MPLAB XC8
//
//PortA bit0 ----- LCD RS pin
//PortA bit1 ----- LCD E pin
//
//PortB bit4 ----- LCD 11pin
//PortB bit5 ----- LCD 12pin
//PortB bit6 ----- LCD 13pin
//PortB bit7 ----- LCD 14pin

#include "pic.h"

__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF );

//LCD制御ポート
#define RS_P(x) PORTA = (PORTA & (0xFE)) | (x)
#define E_P(x) PORTA =  (PORTA & (0xFD)) | (x << 1)

// ---------------- 1ms Wait ----------------
static void Delay_1ms() {
	unsigned int cnt;
	unsigned int i;
	cnt = 51;//51@4MHz

	for (i=0 ; i<cnt ; i++) {
		NOP();
	}
}

// ---------------- 100us Wait ----------------
static void Delay_100us() {
	unsigned int cnt;
	unsigned int i;
	cnt = 4;

        //NOP 1us + for 2us @ 4MHz
	for	(i=0 ; i<cnt ; i++) {
		NOP();
	}
}

// ---------------- n ms Wait ----------------
static void Delay_ms(unsigned char ms) {
	unsigned char c;
	for (c=ms ; c>0 ; c--) {
		Delay_1ms();
	}
}
static void write4(unsigned char dat) {

    PORTB =  ( dat << 4 );
    E_P(0x1);
    E_P(0x0); //10MHz以上で間にNOPを入れる。
}

// ---------------- main処理 ----------------
main()	{
    unsigned char loop;

	TRISA = 0x0;
	TRISB = 0x0;
	PORTA = 0x00;
	PORTB = 0x00;

	//本処理
 	Delay_ms(15); //電源ON後15ms Wait
	write4(0x3);
	Delay_ms(10);
	write4(0x3);
	Delay_ms(5);
	write4(0x3);
        Delay_100us();
	write4(0x2); //4bit mode
        Delay_100us();

        //Function Set (2行表示)
	write4(0x2);
	write4(0x8);
        Delay_100us();
        //LCD表示ON
	write4(0x0);
	write4(0xC);
        Delay_100us();
        //ディスプレイクリア
	write4(0x0);
	write4(0x1);
	Delay_ms(2);
        //Entry Mode Set(カーソル右移動、文字シフトなし)
	write4(0x0);
	write4(0x6);
        Delay_100us();
        //ディスプレイクリア
	write4(0x0);
	write4(0x1);
        Delay_ms(2);

        for (loop=3 ; loop > 0 ; loop--) {
            Delay_100us();
            RS_P(0x1);
            write4(0x3); //'0'表示
            write4(0x0);
            RS_P(0x0);
        }
        
        while(1){
            NOP();
        }
}

C言語で書くとポーリング時間や処理時間の推測が難しい。
ポーリング時間はロジアナ見ながら大体合うように調整。
f:id:ginnyu-tei:20120908152554j:plain
やったね!