#include #include #include // delay用 #define _XTAL_FREQ 8000000 #include "lcd.h" /******************************************************************************* * 異なるピンを使う場合はここを変更する * *******************************************************************************/ #define LCD_RS RA1 #define LCD_EN RA3 #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)) /******************************************************************************* * 秋月LCDピン配列 * *******************************************************************************/ //LCD_RS・・・4 //LCD_EN・・・6 //LCD_D4・・・11 //LCD_D5・・・12 //LCD_D6・・・13 //LCD_D7・・・14 /******************************************************************************* * lcd_write-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() ; } /******************************************************************************* * command- 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_goto - Go to the specified position * * c : 出力する文字データ * *******************************************************************************/ void lcd_goto(unsigned char pos){ LCD_RS = 0; lcd_write(0x80+pos); } /******************************************************************************* * 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(30) ; // 電源ON後15msまで待ってから初期化 // LCDの立上げ時のチェックデータ(イニシャライズ処理用)を設定 command(0x03) ; __delay_ms(10) ; 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 : 文字を表示した次にカーソルを移動するを指示 }