キャラクタLCDモジュールに表示を行う為の色々な関数

〔前のページに戻る〕


前のページのプログラムは基本部分のみでした、それ以外のLCD機能を使用した関数はこのページに纏めました。
ここに記述した関数を使用したい場合は、使いたい関数のみを基本部分にコピー&ペーストして使って下さい。
その関数を使った場合どれだけメモリを消費するかは関数毎に記述しています。
ただし、HI-TECH C Compiler V9.80(Lite Mode)でコンパイルした場合のメモリ消費量です。
---------------------------------------------------------------------
// 63バイト消費
/*******************************************************************************
*    lcd_puth - 1バイト数値を16進数文字でLCDに表示する処理                     *
*      c : 変換する1バイトの数値を指定する                                    *
********************************************************************************/
void lcd_puth(unsigned char c)
{
     char HEX_Data[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'} ;

     lcd_putc(HEX_Data[ (c >> 4) ]) ;
     lcd_putc(HEX_Data[ c & 0x0F ]) ;
}
// 46バイト消費
/*******************************************************************************
*    lcd_putb - 1バイト数値を2進数文字でLCDに表示する処理                      *
*      c : 変換する1バイトの数値を指定する                                    *
********************************************************************************/
void lcd_putb(unsigned char c)
{
     int i ;

     for (i=7 ; i>=0 ; i--) {
          if ( ((c >> i) & 0x1) == 1) lcd_putc('1') ;
          else                        lcd_putc('0') ;
     }
}
// 232バイト消費
/*******************************************************************************
*    lcd_putd - 整数値を10進数文字でLCDに表示する処理                          *
*      val : 変換する整数値を指定する(0-65535)                                 *
********************************************************************************/
void lcd_putd(unsigned int val)
{
     int  i = 7 ;
     char buff[8] ;
     
     buff[7] = 0 ;
     do {
          i-- ;
          buff[i] = (char)((val%10) + 0x30) ;
          val = val / 10 ;
     } while(val != 0) ;
     lcd_puts(&buff[i]) ;
}
// 7バイト消費
/*******************************************************************************
*    lcd_ShiftLeft - 画面全体の文字を左に1桁移動するコマンドをLCDに発行する   *
********************************************************************************/
void lcd_ShiftLeft()
{
     LCD_RS = 0 ;
     lcd_write(0x18) ; // Cursor or Display Shift : Display left
}
// 27バイト消費
/*******************************************************************************
*    lcd_Blink - 画面全体を点滅させます                                        *
*                画面が消えて、表示しての1回の動作しかしません                *
*      t : 点滅する周期の時間を指定します(10ms単位で指定する)                  *
********************************************************************************/
void lcd_Blink(int t)
{
     LCD_RS = 0 ;
     lcd_write(0x08) ; // 画面が消えるコマンド(画面データはLCDが保存する)
     Wait(t) ;
     lcd_write(0x0C) ; // 消えた画面を元に戻して表示させるコマンド
     Wait(t) ;
}
// 75バイト消費
/*******************************************************************************
*    lcd_CreateChar - オリジナルのキャラクタを登録します                       *
*      p  : 登録する場所の指定(0〜7の8ヶ所のみ)                             *
*      dt : 登録したいキャラクタのデータを格納したバッファを指定               *
********************************************************************************/
void lcd_CreateChar(int p,char *dt) 
{
	int i ;

     LCD_RS = 0 ;
     lcd_write(0x40 | (p << 3)) ; // LCDにキャラ保存先のアドレスを指示する
     for (int i=0; i < 7; i++) {
          lcd_putc(*dt) ;               // LCDにキャラデータを送信する
          dt++ ;
     }
}
---------------------------------------------------------------------

《関数の使い方》

lcd_puth(nsigned char c)
 1バイト数値を16進数(HEX)文字でLCDに表示する処理
 c:変換する1バイトの数値を指定する
 例)lcd_puth(123) ならLCDには"7B"が表示されます。

lcd_putb(nsigned char c)
 1バイト数値を2進数(BIN)文字でLCDに表示する処理
 c:変換する1バイトの数値を指定する
 例)lcd_putb(123) ならLCDには"01111011"が表示されます。

lcd_putd(unsigned int val)
 整数値を10進数文字でLCDに表示する処理
 val:変換する整数値を指定する(0-65535)
 例)lcd_putd(123) ならLCDには"123"が表示されます。
 負の数値(マイナス)を表示したい場合はitoa()関数を使用して下さい。

lcd_ShiftLeft()
 画面全体の文字を左に1文字移動するコマンドをLCDに発行する処理

 LCDsub1
 この画面の表示の時に、lcd_ShiftLeft()を実行すると下図の様になります。
 LCDsub2
 lcd_ShiftLeft()を40回実行すると1週回ってきて元の表示位置に戻ります。
 だだし、これはSD1602のLCDの場合です、他のLCDは少し異なると思われます?。
 40回実行で1週回ると言う事は40文字までOKですね。

 1行目の16桁目にlcd_puts("START")を行った場合、この画面の様に表示されています。
  LCDsub3
 そこで、lcd_ShiftLeft()を4回実行するとこの様になります。
 
lcd_Blink(int t)
 画面全体を点滅させます
 t:点滅する周期の時間を指定します(10ms単位で指定する)
 この関数は、画面全体が消えてt 時間したら画面が表示されます。
 何度も画面を点滅させたい場合は、この関数を何回か実行して下さい。
 lcd_write(0x08)のコマンドはその時点の画面を保存し(1画面のみ)、画面を消します、
 その後色々表示していて、lcd_write(0x0C)を行うと保存した画面が復元表示される機能です。

lcd_CreateChar(int p,char *dt)
 オリジナルのキャラクタをLCDに8個まで登録できます
 p:登録する場所の指定(0〜7)
 dt:登録したいキャラクタのデータを格納したバッファを指定
 注意) 登録しても電源を切ればデータは消えます、保存機能は有りません。
     PICのEEPROMなどに保存してそれを起動時に登録すればいいかもね。
[サンプル(メイン部分のみです)]
#include <pic.h>
#include <htc.h>
#define _XTAL_FREQ  8000000

// 5x7ドットのキャラクタです、1で表示 0で消去
char heart[7] = {
  0b01010,
  0b11011,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000,
} ;

main()
{
     OSCCON = 0b01110100 ;
     ADCON1 = 0b00000110 ;
     TRISA  = 0b00000000 ;
     TRISB  = 0b00000000 ;

     lcd_init() ;              // LCDの初期化処理を行う
     lcd_CreateChar(2,heart) ; // 2番に登録する
     lcd_setCursor(0,1) ;
     lcd_putc(0x02) ;          // 2番に登録したキャラを表示する

     while(1) {
     }
}
 LCDsub5  こ〜んな感じになります。

《キャラクタデータをEEPROMに書込んで利用する方法》

lcd_CreateChar()関数は下を使用します。
/*******************************************************************************
*    lcd_CreateChar - オリジナルのキャラクタを登録します                       *
*      p    : 登録する場所の指定(0〜7の8ヶ所のみ)                           *
*      adrs : キャラクタデータの格納先EEPROMアドレスを指定                     *
********************************************************************************/
void lcd_CreateChar(int p,int adrs) 
{
	int i ;

     LCD_RS = 0 ;
     lcd_write(0x40 | (p << 3)) ;   // LCDにキャラ保存先のアドレスを指示する
     for (int i=0; i < 7; i++) {
          lcd_putc(eeprom_read(adrs+i)) ; // キャラをEEPROMから読込んでLCDに送信する
     }
}
下にメイン部分のサンプルを記述します。
[サンプル(メイン部分のみです)]
#include <pic.h>
#include <htc.h>
#define _XTAL_FREQ  8000000

// EEPROMに書込むデータを作成する。
// EEPROMは8バイト単位に記述します、キャラデータは7バイトなので8バイト目は0x00とします。
__EEPROM_DATA(0x0a,0x1b,0x1f,0x1f,0x0e,0x04,0x00,0x00); // 0x00:ハートマーク 
__EEPROM_DATA(0x04,0x04,0x1f,0x04,0x04,0x00,0x1f,0x00); // 0x08:± 

main()
{
     OSCCON = 0b01110100 ;
     ADCON1 = 0b00000110 ;
     TRISA  = 0b00000000 ;
     TRISB  = 0b00000000 ;

     lcd_init() ;              // LCDの初期化処理を行う
     lcd_CreateChar(0,0x00) ;  // 0番に登録する(ハートマーク)
     lcd_CreateChar(1,0x08) ;  // 1番に登録する(±)

     lcd_setCursor(0,1) ;
     lcd_putc(0x00) ;          // 0番に登録した(ハートマーク)を表示する
     lcd_putc(0x01) ;          // 1番に登録した(±)を表示する

     while(1) {
     }
}
※ 尚、lcd_CreateChar()関数を連続で4個以上登録を行うと4個め辺りでデータが化けるかもです、
  その場合は、適当なdelayを4個めの前辺りに入れるとOKとなったりします、念の為。

キャラデータ集

必要であれば適当にコピー&ペーストで貼り付けて利用して下さい。
PIC 16F819であれば、EEPROMへ32個までは登録可能です。
__EEPROM_DATA(0x1c,0x14,0x1c,0x0f,0x08,0x08,0x0f,0x00); // 0x00:℃ 
__EEPROM_DATA(0x04,0x04,0x1f,0x04,0x04,0x00,0x1f,0x00); // 0x08:± 
__EEPROM_DATA(0x1c,0x02,0x0c,0x02,0x1c,0x00,0x00,0x00); // 0x10:m3 
__EEPROM_DATA(0x1c,0x02,0x04,0x08,0x1e,0x00,0x00,0x00); // 0x18:u 
__EEPROM_DATA(0x00,0x08,0x14,0x14,0x08,0x0d,0x12,0x00); // 0x20:リットル 
__EEPROM_DATA(0x04,0x0e,0x15,0x04,0x04,0x04,0x04,0x00); // 0x28:↑ 
__EEPROM_DATA(0x04,0x04,0x04,0x04,0x15,0x0e,0x04,0x00); // 0x30:↓ 
__EEPROM_DATA(0x00,0x10,0x08,0x04,0x02,0x01,0x00,0x00); // 0x38:逆スラッシュ 
__EEPROM_DATA(0x04,0x0f,0x15,0x14,0x0f,0x04,0x00,0x00); // 0x40:セント記号 
__EEPROM_DATA(0x00,0x1f,0x00,0x1f,0x04,0x04,0x04,0x00); // 0x48:〒 
__EEPROM_DATA(0x0e,0x1b,0x04,0x0a,0x11,0x1b,0x1f,0x00); // 0x50:電話マーク 
__EEPROM_DATA(0x1f,0x08,0x1f,0x11,0x1f,0x11,0x1f,0x00); // 0x58:百 
__EEPROM_DATA(0x08,0x1f,0x02,0x0f,0x0a,0x1f,0x02,0x00); // 0x60:年 
__EEPROM_DATA(0x1f,0x11,0x1f,0x11,0x1f,0x11,0x11,0x00); // 0x68:月 
__EEPROM_DATA(0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00); // 0x70:日 
__EEPROM_DATA(0x04,0x15,0x15,0x04,0x0a,0x0a,0x11,0x00); // 0x78:火 
__EEPROM_DATA(0x04,0x05,0x1e,0x0e,0x15,0x15,0x0c,0x00); // 0x80:水 
__EEPROM_DATA(0x04,0x1f,0x04,0x0e,0x15,0x15,0x15,0x00); // 0x88:木 
__EEPROM_DATA(0x04,0x0a,0x1f,0x04,0x1f,0x0e,0x1f,0x00); // 0x90:金 
__EEPROM_DATA(0x04,0x04,0x1f,0x04,0x04,0x04,0x1f,0x00); // 0x98:土 
__EEPROM_DATA(0x0a,0x1b,0x1f,0x1f,0x0e,0x04,0x00,0x00); // 0xa0:ハートマーク 
 LCDsub6  LCDsub7"金"がぁちょっと変
 LCDsub8

《文字に効果を付けて表示する関数集》

お〜きなLCD表示器でなら利用価値は有ると思えますが、小さなLCDでこんな事やってもねえ..... って感じですがぁ、まあよかたい、作ってみました。結構遊べるかもね?。
---------------------------------------------------------------------
// 87バイト消費
/*******************************************************************************
*  lcd_DropOut - 文字列を先頭から1文字ずつ下に落ちる様に表示させる            *
*    col:文字列を表示させるカラム(桁)の位置(0-15)、1行目から2行目に落ちます*
*    *s :表示させる文字列を格納したバッファを指定する                          *
*    tm :下に文字を落とす間隔の時間を指定(10ms単位)                            *
********************************************************************************/
void lcd_DropOut(int col,const char *s,int tm)
{
	int i ;
	
     i=col ;
     while(*s) {
          lcd_setCursor(i,0) ;
          lcd_putc(0x20) ;
          lcd_setCursor(i,1) ;
          lcd_putc(*s++) ;
          i++ ;
          Wait(tm) ;
     }
}
// 75バイト消費
/*******************************************************************************
*  lcd_OnePerOut - 文字列を指定位置から1文字ずつタイプライターの様に表示させる*
*    col:文字列を表示させるカラム(桁)の位置(0-15)                            *
*    row:文字列を表示させる行の位置(0-1)                                     *
*    *s :表示させる文字列を格納したバッファを指定する                          *
*    tm :1文字ずつ表示させる間隔の時間を指定(10ms単位)                        *
********************************************************************************/
void lcd_OnePerOut(int col, int row,const char *s,int tm)
{
     lcd_setCursor(col,row) ; // 表示開始位置にカーソルをセット
     LCD_RS = 0 ;
     lcd_write(0x0e) ;        // 画面表示はON・カーソル表示はON・カーソル点滅はOFF
     // 1文字ずつ指定時間で表示
     LCD_RS = 1 ;
     while(*s) {
          lcd_write(*s++) ;
          Wait(tm) ;
     }
     LCD_RS = 0 ;
     lcd_write(0x0c) ;        // 画面表示はON・カーソル表示はOFF・カーソル点滅はOFF
}
/*******************************************************************************
*  lcd_FlyInOneとlcd_FlyOutOne用のサブ関数                                     *
********************************************************************************/
void FlyOneSub(int i,int row,const char *s,int tm)
{
     lcd_setCursor(i,row) ;
     lcd_putc(*s) ;
     lcd_setCursor(i+1,row) ;
     lcd_putc(0x20) ;
     Wait(tm) ;
}
// 156バイト消費
/*******************************************************************************
*  lcd_FlyInOne - 文字列が右側から1文字ずつ指定位置まで飛んで来る感じに表示する*
*    col:文字列を表示させるカラム(桁)の位置(0-15)                            *
*    row:文字列を表示させる行の位置(0-1)                                     *
*    *s :表示させる文字列を格納したバッファを指定する                          *
*    tm :1文字ずつ表示させる間隔の時間を指定(10ms単位)                        *
********************************************************************************/
void lcd_FlyInOne(int col, int row,const char *s,int tm)
{
     int i , p ;

     p = col ;
     while(*s) {
          for (i=15 ; i>=p ; i--) {
               FlyOneSub(i,row,s,tm) ;
          }
          s++ ;
          p++ ;
     }
}
// 165バイト消費
/*******************************************************************************
*  lcd_FlyOutOne - 文字列が指定位置から左側へ1文字ずつ飛んで行く見たいに表示する*
*    col:文字列を表示させるカラム(桁)の位置(0-15)                            *
*    row:文字列を表示させる行の位置(0-1)                                     *
*    *s :表示させる文字列を格納したバッファを指定する                          *
*    tm :1文字ずつ表示させる間隔の時間を指定(10ms単位)                        *
********************************************************************************/
void lcd_FlyOutOne(int col, int row,const char *s,int tm)
{
     int i , p ;

     p = col-1 ;
     while(*s) {
          for (i=p ; i>=0 ; i--) {
               FlyOneSub(i,row,s,tm) ;
          }
          lcd_setCursor(0,row) ;
          lcd_putc(0x20) ;
          s++ ;
          p++ ;
     }
}
/*******************************************************************************
*  lcd_FlyInAllとlcd_FlyOutAll用のサブ関数                                     *
********************************************************************************/
int FlyAllSub(int i,int row,const char *s,int tm)
{
	int j ;
	
     lcd_setCursor(i,row) ;
     j=0 ;
     LCD_RS = 1 ;
     while(*(s+j)) {
          lcd_write(*(s+j)) ;
          j++ ;
     }
     lcd_setCursor(i+j,row) ;
     lcd_putc(0x20) ;
     Wait(tm) ;

     return j ;
}
// 170バイト消費
/*******************************************************************************
*  lcd_FlyInAll - 文字列が右側から指定の位置まで飛んで来る感じに表示する       *
*    col:文字列を表示させるカラム(桁)の位置(0-15)                            *
*    row:文字列を表示させる行の位置(0-1)                                     *
*    *s :表示させる文字列を格納したバッファを指定する                          *
*    tm :文字列を1桁移動させる間隔の時間を指定(10ms単位)                      *
********************************************************************************/
void lcd_FlyInAll(int col, int row,const char *s,int tm)
{
     int i , l ;

     for (i=15 ; i>=col ; i--) {
          l = FlyAllSub(i,row,s,tm) ;
     }
}
// 220バイト消費
/*******************************************************************************
*  lcd_FlyOutAll - 文字列が指定位置から左側へ飛んで行く見たいに表示する        *
*    col:文字列を表示させるカラム(桁)の位置(0-15)                            *
*    row:文字列を表示させる行の位置(0-1)                                     *
*    *s :表示させる文字列を格納したバッファを指定する                          *
*    tm :文字列を1桁移動させる間隔の時間を指定(10ms単位)                      *
********************************************************************************/
void lcd_FlyOutAll(int col, int row,const char *s,int tm)
{
     int i , l ;

     for (i=col ; i>=0 ; i--) {
          l = FlyAllSub(i,row,s,tm) ;
     }
     for (i=l ; i>=0 ; i--) {
          l = FlyAllSub(0,row,s++,tm) ;
     }
}
// 233バイト消費
/*******************************************************************************
*  lcd_CharChgMovL - 左に移動しながら2種類のキャラデータを交互に表示します    *
*    col1:文字列の表示開始を行うカラム(桁)の位置(0-15)                       *
*    col1:文字列の表示終了を行うカラム(桁)の位置(0-15)                       *
*    row :文字列を表示させる行の位置(0-1)                                    *
*    *s  :表示させる文字列を格納したバッファを指定する(2キャラ分必要)         *
*    sz  :1キャラ分の文字列長さを指定(*sはsz*2の長さとする)                   *
*    tm  :文字列を1桁移動させる間隔の時間を指定(10ms単位)                     *
********************************************************************************/
// サブ関数
void ChgMovSub(int i, int row,const char *s,int sz)
{
     int j ;

	lcd_setCursor(i,row) ;
     LCD_RS = 1 ;
     for (j=0 ; j<sz ; j++ ) {
          lcd_write( *(s+j) ) ;
     }
     lcd_write(0x20) ;
}
// メインの本体関数
void lcd_CharChgMovL(int col1,int col2,int row,const char *s,int sz,int tm)
{
	int i ;
	
	for (i=col1 ; i>col2 ; i--) {// col1からcol2まで表示させる
		ChgMovSub(i,row,s,sz) ;    // 最初のキャラ表示
	     Wait(tm) ;
	     i-- ;
		ChgMovSub(i,row,s+sz,sz) ; // 次のキャラ表示
	     Wait(tm) ;
	}
	ChgMovSub(col2,row,s,sz) ;      // 最初のキャラを表示して終了
}
---------------------------------------------------------------------

関数の使い方

lcd_DropOut(int col,const char *s,int tm)
 colの位置に表示した文字列(s)を、先頭から1文字ずつ下に落ちる様に表示させます。
 [サンプル]
     lcd_setCursor(5,0) ;        // 1行目の6カラム目から表示する
     lcd_puts("START") ;
     Wait(100) ;                 // 1秒後にアクション開始
     lcd_DropOut(5,"START",50) ; // 50ms毎に文字を落とす
 

lcd_OnePerOut(int col, int row,const char *s,int tm)
 colとrowの位置から文字列(s)を1文字ずつタイプライターの様に表示させます。
 [サンプル]
     lcd_OnePerOut(5,0,"START",50) ;  // 1行目の6カラム目から50ms毎に表示する
 

lcd_FlyInOne(int col, int row,const char *s,int tm)
 文字列(s)が右側からcolとrowの位置まで1文字ずつ飛んで来る感じに表示し画面に現れます。
 この関数を使用する場合は、FlyOneSub()関数も一緒にコピー&ペーストして下さい。
 [サンプル]
     lcd_FlyInOne(8,0,"START",10) ;  // 1行目の9カラム目まで10msの速度で1文字ずつ表示させます
 

lcd_FlyOutOne(int col, int row,const char *s,int tm)
 文字列(s)がcolとrowの指定位置から左側へ1文字ずつ飛んで行く感じに表示し画面から消えます。
 この関数を使用する場合は、FlyOneSub()関数も一緒にコピー&ペーストして下さい。
 [サンプル]
     lcd_setCursor(3,0) ;             // 1行目の4カラム目から表示する
     lcd_puts("START") ;
     Wait(300) ;                      // 3秒後にアクション開始
     lcd_FlyOutOne(3,0,"START",10) ;  // 1行目の4カラム目から10msの速度で1文字ずつ表示させます
 

lcd_FlyInAll(int col, int row,const char *s,int tm)
 文字列(s)が右側からcolとrowの位置まで飛んで来る感じに移動表示し画面に現れます。
 この関数を使用する場合は、FlyAllSub()関数も一緒にコピー&ペーストして下さい。
 この関数はlcd_ShiftLeft()とは異なり、指定の文字列のみ移動します。
 [サンプル]
     lcd_FlyInAll(6,0,"START",10) ;  // 1行目の7カラム目まで10msの速度で移動表示させます
 

lcd_FlyOutAll(int col, int row,const char *s,int tm)
 文字列(s)がcolとrowの指定位置から左側へ飛んで行く感じに移動表示し画面から消えます。
 この関数を使用する場合は、FlyAllSub()関数も一緒にコピー&ペーストして下さい。
 この関数はlcd_ShiftLeft()とは異なり、指定の文字列のみ移動します。
 [サンプル]
     lcd_setCursor(3,0) ;             // 1行目の4カラム目から表示する
     lcd_puts("START") ;
     Wait(300) ;                      // 3秒後にアクション開始
     lcd_FlyOutAll(3,0,"START",10) ;  // 1行目の4カラム目から10msの速度で移動表示させます
 

lcd_CharChgMovL(int col1,int col2,int row,const char *s,int sz,int tm)
 左に移動しながら2種類のキャラデータを交互に表示します。
 col1からcol2の指定した位置まで tm の速度で移動します。
 szの長さのキャラデータを2個作成して下さい。
 この関数を使用する場合は、ChgMovSub()関数も一緒にコピー&ペーストして下さい。
 [サンプル]
void main() {
     char valtan[14] = {'Y','(','o',0x5c,'o',')','Y','|','(','o',0x5c,'o',')','|'} ;

     lcd_init() ;
     // 右側から50msの速度で現れて、6カラム目で停止
     lcd_CharChgMovL(15,5,0,(char*)valtan,7, 50) ;
     while(1) ;
}
 




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2011 Shigehiro Kimura All Rights Reserved.