--------------------------------------------------------------------- // 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++ ; } } ---------------------------------------------------------------------
[サンプル(メイン部分のみです)] #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) { } }
/******************************************************************************* * 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個め辺りでデータが化けるかもです、
__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:ハートマーク
--------------------------------------------------------------------- // 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_setCursor(5,0) ; // 1行目の6カラム目から表示する lcd_puts("START") ; Wait(100) ; // 1秒後にアクション開始 lcd_DropOut(5,"START",50) ; // 50ms毎に文字を落とす
[サンプル] lcd_OnePerOut(5,0,"START",50) ; // 1行目の6カラム目から50ms毎に表示する
[サンプル] lcd_FlyInOne(8,0,"START",10) ; // 1行目の9カラム目まで10msの速度で1文字ずつ表示させます
[サンプル] lcd_setCursor(3,0) ; // 1行目の4カラム目から表示する lcd_puts("START") ; Wait(300) ; // 3秒後にアクション開始 lcd_FlyOutOne(3,0,"START",10) ; // 1行目の4カラム目から10msの速度で1文字ずつ表示させます
[サンプル] lcd_FlyInAll(6,0,"START",10) ; // 1行目の7カラム目まで10msの速度で移動表示させます
[サンプル] lcd_setCursor(3,0) ; // 1行目の4カラム目から表示する lcd_puts("START") ; Wait(300) ; // 3秒後にアクション開始 lcd_FlyOutAll(3,0,"START",10) ; // 1行目の4カラム目から10msの速度で移動表示させます
[サンプル] 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) ; }
"Flash Player"から"gif"に変更(*1) 2020/05/24
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.