---------------------------------------------------------------------
// 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.