こんばんわ
としぶぅ~です。
大分日中でも過ごしやすくなりましたね。
今日は昼間でもほとんどエアコンいりませんでした。
では今日は温度を表示させるために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/ です。
上の関数は使っても問題ないですが。。。くれぐれも理解してからということで。。。
今日は簡単ですがこんなところで・・・
それではおやすみなさい!