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