としぶぅ~の「工作部屋」...毎日少しのお勉強

趣味・関心事を書いていこうと思います。

PIC16F88を動かす。。。その7(LCD表示関数)

2012-09-09 22:36:35 | PIC16F88

こんばんわ

としぶぅ~です。

大分日中でも過ごしやすくなりましたね。

今日は昼間でもほとんどエアコンいりませんでした。

 

では今日は温度を表示させるためにLCDの関数を追加します。

LCDはSC1602Bの互換品だったと思います。(秋月電子で買ったものです。。。確か)

かな~り昔に動くようにしたソフトをPIC16F88の回路用に修正したものです。

ソフトは、マニュアルに書いてある通りのフローチャートにしてあると思います。(多分)

こんな感じです。

”lcd.c”

//*
//* LCD(SC1602) interface file
//*
//* 以下の機能を供給する
//* lcd_cmd(unsigned char) LCDにコマンドデータを出力する
//* lcd_data(unsigned char) LCDに表示データを出力する
//* lcd_clear(void) 画面をクリアする
//* lcd_puts("ABCD・・・HJ") 文字列を表示する
//* lcd_posyx(y,x) カーソル位置を、行 y、横位置 xにする
//* lcd_init(void) LCDの初期化をする
//*
//*
//* LCD_RS PORTA, 7 ;RS信号
//* LCD_E PORTA, 6 ;E信号
//* LCD_DB PORTA ;PORTA 0-3 → DB4-7(上位4ビット)
//*


#include
#include "delay.h"
#include "lcd.h"

#define LCD_RS RA7
#define LCD_EN RA6


// write a byte to the LCD in 4 bit mode
void lcd_cmd(unsigned char c)
{
unsigned char cdata;
// Making MSB Command Data 4bit
cdata = ((c >> 4) & 0x0f) | (PORTA & 0x70 & 0xb0);
PORTA = cdata; // RS = "H"→”L"
PORTA = cdata | 0x40; // E = "H"→”L"
PORTA = cdata;
// Making LSB Command Data 4bit
cdata = (c & 0x0F) | (PORTA & 0x70 & 0xb0);
PORTA = cdata; // RS = "H"→”L"
PORTA = cdata | 0x40; // E = "H"→”L"
PORTA = cdata;
DelayMs(5);
}

// write one character to the LCD
void lcd_data(unsigned char c)
{
unsigned char cdata;
// Making MSB Data 4bit
cdata = ((c >> 4) & 0x0F) | (PORTA & 0xf0) | 0x80;
PORTA = cdata; // RS = "L"→”H"
PORTA = cdata | 0x40; // E = "H"→”L"
PORTA = cdata;
// Making LSB Data 4bit
cdata = (c & 0x0F) | (PORTA & 0xf0) | 0x80;
PORTA = cdata; // RS = "L"→”H"
PORTA = cdata | 0x40; // E = "H"→”L"
PORTA = cdata;
DelayMs(5);
}

// Clear and home the LCD
void lcd_clear(void)
{
lcd_cmd(0x1);
DelayMs(5);
}

// write a string of chars to the LCD
void lcd_puts(const char * s)
{
while(*s)
lcd_data(*s++);
}

// Go to the specified position
void lcd_posyx(unsigned char ypos,unsigned char xpos)
{
unsigned char pcode;

switch(ypos & 0x03){
case 0: pcode=0x80;
break;
case 1: pcode=0xC0;
break;
case 2: pcode=0x94;
break;
case 3: pcode=0xD4;
break;
}
lcd_cmd(pcode += xpos);
}

// initialise the LCD - put into 4 bit mode
void lcd_init(void)
{

// Initalize コマンドを2~3回書き込まないとうまく動かない(2Lineモードにならなかった))
lcd_cmd(0x2c); // 4 bit mode, 2-LineMode, 5x8 font
DelayUs(40);
lcd_cmd(0x2c); // 4 bit mode, 2-LineMode, 5x8 font
DelayUs(40);
lcd_cmd(0x0c); // display on, blink curson on
DelayUs(40);
lcd_clear(); // display off
DelayMs(2);
lcd_cmd(0x06); // entry mode
}

 

次にヘッダファイルです。

”lcd.h”

/*
LCD interface header file
See lcd.c for more info
*/

/* write a byte command to the LCD in 4 bit mode */

extern void lcd_cmd(unsigned char);

/* write a byte data to the LCD in 4 bit mode */

extern void lcd_data(unsigned char);

/* Clear and home the LCD */

extern void lcd_clear(void);

/* write a string of characters to the LCD */

extern void lcd_puts(const char * s);

/* Go to the specified position */

extern void lcd_posyx(unsigned char,unsigned char);

/* intialize the LCD - call before anything else */

extern void lcd_init(void);

 

とりあえず、表示できることを確認しています。

(改造すれば他のマイコンにも使えます。。。。先日はNXPのマイコンにも実装しました。)

 

LCDは、http://akizukidenshi.com/catalog/g/gP-00040/ です。

上の関数は使っても問題ないですが。。。くれぐれも理解してからということで。。。

今日は簡単ですがこんなところで・・・

 

それではおやすみなさい!