PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する
記事の最後にソースをつけました。次の記事にあるI2Cライブラリを使うことを前提にしています。
「I2Cのソース - PIC12F1822/16F1705/16F1938/18F26K22 - LCD(ACM1602)を例にして」
タイトルにある四つのPICで動作を確認してあります。
(2014.11.24)
-------
このLCDを使用したサーミスタ温度計の記事を書きました。
「PICで作るお手軽サーミスタ温度計 (2)」
LCDの表示部分も含んだソース一式もダウンロードできるようになっています。
(2014.09.22)
-------
前記事「PICでI2C - 1 (温度計を作る)」ではPIC16F1938は出てきたもののI2Cは何にもなかったので詐欺みたいな気もしてきましたが、今回はほんとにI2Cです。
別に気温でも気圧でも湿度でも電圧でもなんでもいいんですがI2Cでデータを取得してもそれを目に見える形にしなければ意味がありません。これについては
1. RS232CでPCに転送
2. ディスプレイで表示
3. SDカードに書き込み
の三つの方法がありそうです。難易度もこの順番になると思います。今回は2.をやってみました。
これも前回に引き続き
「きむ茶工房ガレージハウス - PICの動かせ方入門はこちら - 16F1938覚書」
「きむ茶工房ガレージハウス - I2C通信の実験」
「きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」
を参考にさせていただいています。
-----
各種温度センサーといっしょにI2CインターフェースのLCDディスプレイを注文しました。
「秋月電子通商 - I2C接続キャラクタLCDモジュール 16x2行 白色バックライト付 」
です。
結果だけ先に書くと無事I2Cを介して表示することができました。
------
まずI2CのライブラリはPIC16F1938用ということだと
「きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」
のものが使えます。
I2Cインターフェースの液晶ディスプレイについては
「きむ茶工房ガレージハウス - 秋月電子I2C接続小型LCDモジュールに表示を行う 」
があるのですがPICもLCDディスプレイも違うものですので自分のに合わせてプログラムを修正する必要があります。
実際やってみたところI2Cのライブラリについては前者のものがそのまま使えました。液晶ディスプレイについてはさすがに型番が違うのでけっこう手直しが必要でしたが後者をベースに作ることができました。
デバイスのアドレスが違うのはとうぜんとして、コーリングシーケンスみたいなのが違うのでディスプレイのデータシートを見ながら実際に動かしながら手直ししていくというような作業が必要でした。せっかくだからソースもダウンロードできるようにしたいと思います。今見直しているところなので明日中にはリンクをはれるようにがんばります。
ソースは探せばいくらでも見つかるので要点だけまとえてみました。
「PICでI2C - LCD(液晶)ディスプレイによる違い」
------
関連
「PICでI2C - ADコンバーター・MCP3425の使い方」
「PICで平方根 - 白金薄膜抵抗で温度を測る」
「PICでI2C - 液晶(LCD)ディスプレイ(ACM1602N1-FLW-FBW)に表示する」
「PICでI2C - LCD(液晶)ディスプレイによる違い」
「PICでI2C - 1 (温度計を作る)」
「I2Cデバイス・アドレス一覧」
「I2C大気圧温度センサーLPS331の驚くべき分解能」
「海面更生気圧を気象庁とくらべてみた - I2C大気圧温度センサーLPS331」
「サーミスタによる温度測定の精度」
「サーミスタ温度計の精度を調べる - 1」
「ミニ恒温槽の作成に向けて - 1」
「炭素皮膜抵抗の温度係数を測定する話」
-----
参考
「きむ茶工房ガレージハウス - PICの動かせ方入門はこちら - 16F1938覚書」
「きむ茶工房ガレージハウス - I2C通信の実験」
「きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」
「きむ茶工房ガレージハウス - 秋月電子I2C接続小型LCDモジュールに表示を行う 」
----------------
ACM1602lib.h
// ACM1602lib.h
// I2C接続LCD関数ライブラリ用インクルードファイル
// ソースは次のサイトもものを参考にさせていただきました。
// きむ茶工房ガレージハウス
// http://www.geocities.jp/zattouka/GarageHouse/Top.htm
// 秋月電子通商 ACM1602N1-FLW-FBW
// 16文字x2行LCDモジュール バックライト付
#ifndef _ACM1602_H_
#define _ACM1602_H_
#define LCD_ADRES 0x50
void LCD_Clear(void) ;
void LCD_SetCursor(int col, int row) ;
void LCD_Putc(char c) ;
void LCD_Puts(const char * s) ;
void LCD_CreateChar(int p,char *dt) ;
void LCD_Init() ;
#endif
--------------------
ACM1602lib.c
// ソースは次のサイトのものを使わせいただきました。
// きむ茶工房ガレージハウス
// http://www.geocities.jp/zattouka/GarageHouse/Top.htm
// 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)
// http://www.geocities.jp/zattouka/GarageHouse/micon/MPLAB/16F1938/Pressure/Pressure2.htm
// PIC16F1938
// 秋月電子通商 ACM1602N1-FLW-FBW
// 16文字x2行LCDモジュール バックライト付
// S1.01 http://seppina.cocolog-nifty.com/blog/
/*******************************************************************************
* skI2CLCDlib - I2C接続LCD関数ライブラリ *
* このライブラリは、秋月電子16文字x2行LCDモジュール バックライト付用です。 *
* *
* LCD_Init - LCDの初期化を行う処理 *
* LCD_Clear - LCDモジュールの画面を消す処理 *
* LCD_SetCursor - LCDモジュール画面内のカーソル位置を移動する処理 *
* LCD_Putc - LCDにデータを1バイト出力する処理 *
* LCD_Puts - LCDに文字列データを出力する処理 *
* LCD_CreateChar - オリジナルのキャラクタを登録します *
* *
* メモ:__delay_us() and __delay_ms() を使用しているので "MyDef.h" に *
* "#define _XTAL_FREQ 8000000"が記述されています、 *
* 8MHz以外のCPUクロックにする人は書き換えましょう。 *
* ============================================================================ *
* VERSION DATE BY CHANGE/COMMENT *
* ---------------------------------------------------------------------------- *
* 1.00 2013-07-25 きむ茶工房(きむしげ) Create *
* 2.00 2013-09-21 for ACM1602 by Seppina *
* ============================================================================ *
* PIC PIC16F1938 (このライブラリ自体は他のPICでもOKと思います) *
* MPLAB IDE(V8.84) *
* MPLAB(R) XC8 C Compiler Version 1.00 *
*******************************************************************************/
#include <xc.h>
#include "MyDef.h"
#include "I2Clib.h"
#include "ACM1602lib.h"
// LCDにコマンドを発行する処理
void command(unsigned char c)
{
int ans ;
ans = I2C_Start(LCD_ADRES,RW_0); // スタートコンディションを発行する
if (ans == 0) {
// command word の送信
I2C_Send(0b00000000) ; // control byte の送信(コマンドを指定)
I2C_Send(c) ; // data byte の送信
}
I2C_Stop() ; // ストップコンディションを発行する
__delay_us(26) ;
}
/*******************************************************************************
* LCD_Clear( ) *
* LCDモジュールの画面を消す処理 *
*******************************************************************************/
void LCD_Clear(void)
{
command(0x01) ; // Clear Display : 画面全体に20Hのスペースで表示、カーソルはcol=0,row=0に移動
__delay_ms(5) ; // LCDが処理(2.16ms)するのを待ちます
}
/*******************************************************************************
* LCD_SetCursor(col,row) *
* LCDモジュール画面内のカーソル位置を移動する処理 *
* *
* col : 横(列)方向のカーソル位置(0-7) *
* row : 縦(行)方向のカーソル位置(0-1) *
*******************************************************************************/
void LCD_SetCursor(int col, int row)
{
int row_offsets[] = { 0x00, 0x40 } ;
command(0x80 | (col + row_offsets[row])) ; // Set DDRAM Adddress : 00H-07H,40H-47H
}
/*******************************************************************************
* LCD_Putc(c) *
* 文字列は、NULL(0x00)まで繰返し出力します。 *
* *
* c : 出力する文字データを指定 *
*******************************************************************************/
void LCD_Putc(char c)
{
int ans ;
ans = I2C_Start(LCD_ADRES,RW_0); // スタートコンディションを発行する
if (ans == 0) {
// command word の送信
I2C_Send(0b10000000) ; // control byte の送信(データを指定)
I2C_Send(c) ; // data byte の送信
}
I2C_Stop() ; // ストップコンディションを発行する
__delay_us(26) ;
}
/*******************************************************************************
* LCD_Puts(*s) *
* LCDに文字列データを出力する処理 *
* 文字列は、NULL(0x00)まで繰返し出力します。 *
* *
* *s : 出力する文字列のデータを格納した場所のアドレスを指定 *
*******************************************************************************/
void LCD_Puts(const char * s)
{
int ans ;
while(*s) {
LCD_Putc(*s++);
}
}
/*******************************************************************************
* LCD_CreateChar(p,*dt) *
* オリジナルのキャラクタを登録します *
* *
* p : 登録する場所の指定(0〜5の6ヶ所のみ) *
* p : 登録する場所の指定(0〜5の6ヶ所のみ) *
* *dt : 登録したいキャラクタのデータを格納したバッファを指定 *
********************************************************************************/
// **** ACM602では未検証です ****
void LCD_CreateChar(int p,char *dt)
{
command(0x40 | p << 3 );
__delay_ms(5) ;
for (int i=0; i < 8; i++) {
LCD_Putc(*dt++);
}
}
/*******************************************************************************
* LCD_Init( ) *
* LCDの初期化を行う処理 *
*******************************************************************************/
void LCD_Init()
{
command(0x01); // Clear Diplay.
__delay_ms(5) ; // 5ms待ちます。
command(0x38); // Function Set.
__delay_ms(5) ; // 5ms待ちます。
// 0b000x0000; DL; Interface Data length. 8bits/4bits
// 0b0000x000; N; Numbers of display line. 2-line/1-line
// 0b00000x00; F; Display font type. 5x10dots/5x8dots
command(0x0c); // Display ON/OFF Control.
__delay_ms(5) ; // 5ms待ちます。
// 0b00000x00; D; Set display on/off.
// 0b000000x0; C; Set curthor on/off.
// 0b0000000x; B; Set blinking of curthor on/off.
command(0x06); // Entry Mode Set.
__delay_ms(5) ; // 5ms待ちます。
// 0b000000x0; I/D;Assign curthor moving direction.
// 0b0000000x; I/D;Enable the shift of entire display.
LCD_Clear() ; // Clear Display : 画面を消去する
}
------------------------------
« PICでI2C - 1 (温度計を作る) | トップページ | PICでI2C - LCD(液晶)ディスプレイによる違い - ACM1602N1-FLW-FBWのソース付き »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
この記事へのコメントは終了しました。
« PICでI2C - 1 (温度計を作る) | トップページ | PICでI2C - LCD(液晶)ディスプレイによる違い - ACM1602N1-FLW-FBWのソース付き »
コメント