こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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"

#defineLCD_RS RA0
//#defineLCD_RW RA4
#define LCD_EN RA1

#define LCD_DATA PORTB

#defineLCD_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
}

投稿日時 - 2016-01-14 17:45:28

QNo.9111263

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.3

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

LCD_DATA = (init_value<<4) ;

LCD_DATA = 2;// Four bit mode

LCD_DATA = (2<<4) ;

投稿日時 - 2016-01-15 21:34:58

ANo.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();
が良いかも知れません、動作未確認ですが参考にして下さい。

投稿日時 - 2016-01-15 19:31:00

ANo.1

void
lcd_writeを変更すればできそうですね。
★の行が変更箇所です。

lcd_write(unsigned char c)
{
__delay_us(40);
★LCD_DATA = ( c & 0xF0 );
LCD_STROBE();
★LCD_DATA = ( (c << 4) & 0xF0 )
LCD_STROBE();
}

投稿日時 - 2016-01-14 18:51:26

お礼

早速の回答、ありがとうございます。

今、試したところ無事表示できました。

投稿日時 - 2016-01-15 08:34:44

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-