---------------------------------------------------------------------
#include <stdlib.h>
#include <pic.h>
#include <htc.h> // delay用
#define _XTAL_FREQ 8000000 // delay用(クロック8MHzで動作時)
// 異なるピンを使う場合はここを変更する
#define LCD_RS RB2
#define LCD_EN RB3
#define LCD_D4 RB4
#define LCD_D5 RB5
#define LCD_D6 RB6
#define LCD_D7 RB7
#define LCD_STROBE() ((LCD_EN=1),(LCD_EN=0))
// アナログ出力CCP1はRB3の9番ピンから行う
// デバッグしない(DEBUGDIS):低電圧プログラミング機能使用しない(LVPDIS)
// メモリを保護しない(UNPROTECT):外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(MCLRDIS)
// 電源電圧降下常時監視機能ON(BOREN):電源ONから72ms後にプログラムを開始する(PWRTEN)
// ウオッチドックタイマ無し(WDTDIS):内部クロックを使用する(INTIO)
__CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & INTIO) ;
// 遅延の処理
void Wait(unsigned int num)
{
int i ;
// numで指定した回数だけ繰り返す
for (i=0 ; i<num ; i++) {
__delay_ms(10) ; // 10msプログラムの一時停止
}
}
// LCDにデータを実際に送信する処理
void lcd_write(unsigned char c)
{
// 送信データのバイト列上位4ビットを処理
LCD_D4 = ( ( c >> 4 ) & 0x01 ) ;
LCD_D5 = ( ( c >> 5 ) & 0x01 ) ;
LCD_D6 = ( ( c >> 6 ) & 0x01 ) ;
LCD_D7 = ( ( c >> 7 ) & 0x01 ) ;
LCD_STROBE() ;
// 送信データのバイト列下位4ビットを処理
LCD_D4 = ( ( c ) & 0x01 ) ;
LCD_D5 = ( ( c >> 1 ) & 0x01 ) ;
LCD_D6 = ( ( c >> 2 ) & 0x01 ) ;
LCD_D7 = ( ( c >> 3 ) & 0x01 ) ;
LCD_STROBE() ;
}
// LCDにコマンドを発行する処理
void command(unsigned char c)
{
LCD_RS = 0 ;
LCD_D4 = ( ( c ) & 0x01 ) ;
LCD_D5 = ( ( c >> 1 ) & 0x01 ) ;
LCD_D6 = ( ( c >> 2 ) & 0x01 ) ;
LCD_D7 = ( ( c >> 3 ) & 0x01 ) ;
LCD_STROBE() ;
}
/*******************************************************************************
* lcd_clear - LCDモジュールの画面を消す処理 *
*******************************************************************************/
void lcd_clear(void)
{
LCD_RS = 0 ;
lcd_write(0x01) ; // Clear Display : 画面全体に20Hのスペースで表示、カーソルはcol=0,row=0に移動
__delay_ms(2) ; // LCDが処理(1.53ms)するのを待ちます
}
/*******************************************************************************
* lcd_setCursor - LCDモジュール画面内のカーソル位置を移動する処理 *
* col : 横(列)方向のカーソル位置(0-15) *
* row : 縦(行)方向のカーソル位置(0-1) *
********************************************************************************/
void lcd_setCursor(int col, int row)
{
int row_offsets[] = { 0x00, 0x40 } ;
LCD_RS = 0 ;
lcd_write(0x80 | (col + row_offsets[row])) ; // Set DDRAM Adddress : 00H-0FH,40H-4FH
}
/*******************************************************************************
* lcd_putc - LCDにデータを1バイト出力する処理 *
* c : 出力する文字データ *
*******************************************************************************/
void lcd_putc(char c)
{
LCD_RS = 1 ; // RSの制御信号線をセットします
lcd_write( c ) ; // LCDにデータの送信
}
/*******************************************************************************
* lcd_puts - LCDに文字列データを出力する処理(文字列をNULL(0x00)まで繰返し出力)*
* s : 出力する文字列のデータ *
*******************************************************************************/
void lcd_puts(const char * s)
{
LCD_RS = 1 ; // RSの制御信号線をセットします
while(*s) lcd_write(*s++) ;
}
/*******************************************************************************
* lcd_init - LCDの初期化処理 *
*******************************************************************************/
void lcd_init()
{
LCD_RS = 0 ;
LCD_EN = 0 ;
__delay_ms(15) ; // 電源ON後15msまで待ってから初期化
// LCDの立上げ時のチェックデータ(イニシャライズ処理用)を設定
command(0x03) ;
__delay_ms(5) ;
command(0x02) ;
// LCDにコマンドを発行します
lcd_write(0x28) ; // function set : データ線は4本・表示は2行・フォントは5x8ドット
lcd_write(0x0c) ; // display control: 画面表示はON・カーソル表示はOFF・カーソル点滅はOFF
lcd_clear() ; // Clear Display : 画面をクリアし、カーソル位置はcol=0,row=0
lcd_write(0x06) ; // entry mode set : 文字を表示した次にカーソルを移動するを指示
}
/*******************************************************************************
* メインの処理 *
*******************************************************************************/
void main()
{
int i ;
char s[17] ;
char mes[6]= {0xbd,0xc0,0xb0,0xc4,0x00} ; // "スタート"文字のカタカナデータ
OSCCON = 0b01110100 ; // 内部クロックは8MHzとする
ADCON1 = 0b00000110 ; // アナログは使用しない、RA0-RA4をデジタルI/Oに割当
TRISA = 0b00000000 ; // 1で入力 0で出力 RA0-RA7全て出力に設定(RA5は入力専用)
TRISB = 0b00000000 ; // RB0-RB7全て出力に設定
/* LCDの初期化処理を行う */
lcd_init() ;
/* 1行目に"スタート"を表示 */
lcd_puts(mes) ;
i = 0 ;
while(1) {
// 2行目を消す
lcd_setCursor(0,1) ;
lcd_puts(" ") ;
// カーソルを2行目の先頭に移動する
lcd_setCursor(0,1) ;
// 整数値を文字列に変換してLCD表示
itoa(s,i,10) ;
lcd_puts(s) ;
i++ ;
// 1秒間遅延する
Wait(100) ;
}
}
---------------------------------------------------------------------
CコンパイルとPIC書き込みを実行して下さい。| 00 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | A0 | B0 | C0 | D0 | E0 | F0 | |
| 00 | 0 | @ | P | ` | p | ー | タ | ミ | α | p | ||||||
| 01 | ! | 1 | A | Q | a | q | 。 | ア | チ | ム | а | q | ||||
| 02 | " | 2 | B | R | b | r | 「 | イ | ツ | メ | β | θ | ||||
| 03 | # | 3 | C | S | c | s | 」 | ウ | テ | モ | ε | ∞ | ||||
| 04 | $ | 4 | D | T | d | t | 、 | エ | ト | ヤ | μ | Ω | ||||
| 05 | % | 5 | E | U | e | u | ・ | オ | ナ | ユ | σ | ц | ||||
| 06 | & | 6 | F | V | f | v | ヲ | カ | ニ | ヨ | ρ | Σ | ||||
| 07 | ’ | 7 | G | W | g | w | ァ | キ | ヌ | ラ | g | π | ||||
| 08 | ( | 8 | H | X | h | x | ィ | ク | ネ | リ | √ | x | ||||
| 09 | ) | 9 | I | Y | i | y | ゥ | ケ | ノ | ル | ¬ | y | ||||
| 0A | * | : | J | Z | j | z | ェ | コ | ハ | レ | j | 千 | ||||
| 0B | + | ; | K | [ | k | { | ォ | サ | ヒ | ロ | × | 万 | ||||
| 0C | , | < | L | ¥ | l | | | ャ | シ | フ | ワ | ¢ | 円 | ||||
| 0D | - | = | M | ] | m | } | ュ | ス | ヘ | ン | モ | ÷ | ||||
| 0E | . | > | N | ^ | n | → | ョ | セ | ホ | ゙ | n | |||||
| 0F | / | ? | O | _ | o | ← | ッ | ソ | マ | ゚ | o | ■ |

このキャラクタは、一覧コード表ではなくこの図が正解です。
| ピン番号 | 16 | 15 | 4 | 3 | 2 | 1 | 18 | 17 |
| デジタル入出力ビット名 | RA7 | RA6 | RA5 | RA4 | RA3 | RA2 | RA1 | RA0 |
| ピン番号 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 |
| デジタル入出力ビット名 | RB7 | RB6 | RB5 | RB4 | RB3 | RB2 | RB1 | RB0 |
| LCDピン名称(番号) | D7(14) | D6(13) | D5(12) | D4(11) | E(6) | RS(4) |
一部変更(*4) 2015/10/14
追記(*3) 2014/01/25
追記(*2) 2013/07/25
追記(*1) 2011/12/12
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.