• 締切済み

LCDのサブルーチンについて

今、LCDとPICの接続方法を [PIC(下位4ビット)⇔LCD]から[PIC(上位4ビット)⇔LCD]に変更することを考えています。 LCDのサブルーチンはHi-Tech CコンパイラーのLCDのサンプルで使用されていたものを使用しています。 接続方法を変更するにあたりサブルーチンを書き換えなくてはいけないのですが、どのように書き換えればいいのかわかりません。 参考までにLCDのサブルーチンとPICとLCDとの接続方法を示した図を掲載します。 #define _LEGACY_HEADERS #define _XTAL_FREQ 4000000 #include <pic.h> #include "lcd.h" #define LCD_RS RA0 //#define LCD_RW RA4 #define LCD_EN RA1 #define LCD_DATA PORTB #define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0)) /* write a byte to the LCD in 4 bit mode */ void lcd_write(unsigned char c) { __delay_us(40); LCD_DATA = ( ( c >> 4 ) & 0x0F ); LCD_STROBE(); LCD_DATA = ( c & 0x0F ); LCD_STROBE(); } /* * Clear and home the LCD */ void lcd_clear(void) { LCD_RS = 0; lcd_write(0x1); __delay_ms(2); } /* write a string of chars to the LCD */ void lcd_puts(const char * s) { LCD_RS = 1; // write characters while(*s) lcd_write(*s++); } /* write one character to the LCD */ void lcd_putch(char c) { LCD_RS = 1; // write characters lcd_write( c ); } /* * Go to the specified position */ void lcd_goto(unsigned char pos) { LCD_RS = 0; lcd_write(0x80+pos); } /* initialise the LCD - put into 4 bit mode */ void lcd_init() { char init_value; //ADCON1 = 0x06; // Disable analog pins on PORTA init_value = 0x3; //TRISA=0; //TRISB=0; LCD_RS = 0; LCD_EN = 0; //LCD_RW = 0; __delay_ms(15); // wait 15mSec after power applied, LCD_DATA = init_value; LCD_STROBE(); __delay_ms(5); LCD_STROBE(); __delay_us(200); LCD_STROBE(); __delay_us(200); LCD_DATA = 2; // Four bit mode LCD_STROBE(); lcd_write(0x28); // Set interface length //lcd_write(0xF); // Display On, Cursor On, Cursor Blink lcd_write(0x0C); lcd_clear(); // Clear screen lcd_write(0x6); // Set entry Mode }

みんなの回答

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.3

(1) 補足 LCD 8ビットモード → 4ビットモード の変更が抜けていました LCD_DATA = init_value; ↓ LCD_DATA = (init_value<<4) ; LCD_DATA = 2;// Four bit mode ↓ LCD_DATA = (2<<4) ;

  • koujikuu
  • ベストアンサー率43% (429/993)
回答No.2

たぶん LCD_DATA = ( ( c >> 4 ) & 0x0F ); // 上位4ビット PORTB 3-0 出力 LCD_STROBE(); LCD_DATA = ( c & 0x0F ); // 下位4ビット PORTB 3-0 出力 LCD_STROBE(); を LCD_DATA = ( c & 0xF0 ); // 上位4ビット PORTB 7-4 出力 LCD_STROBE(); LCD_DATA = ( (c<<4) & 0xF0 ); // 下位4ビット PORTB 7-4 出力 LCD_STROBE(); ではないかと でもこのままでは、PORTB 3-0 が強制的に0にセットされるので LCD_DATA &= 0x0F ; // PORTB 7-4ビット クリア LCD_DATA |=( c & 0xF0 ) ; // C上位4ビットデータをPORTB 7-4へセット LCD_STROBE(); LCD_DATA &= 0x0F ; // PORTB 7-4ビットクリア LCD_DATA |= ((C<<4) & 0xF0) ; // C下位4ビットデータをPORTB 7-4へセット LCD_STROBE(); が良いかも知れません、動作未確認ですが参考にして下さい。