じゅんのなんでもD.I.Y.

インターネットラジオVer.2を製作中・・・

全体表示

[ リスト ]

イメージ 1

HITEC C PIC16用のLCDサンプルルーチンはちょっとひどい。LCDのコントロールビットにはPORTAを使い、データポートはPORTDを使う。

しかも4ビットモードで動かしているのでPORTDの4〜7は使用せず、サンプルルーチンを見ると別のIOに使うこともできない。

このままだとPORTDもない18ピンPICでは使用ができない。

そこでコントロールビットも含めてPORTBだけで表示できるように改造した。

/*
 *	LCD interface example
 *	Uses routines from delay.c
 *	This code will interface to a standard LCD controller
 *	like the Hitachi HD44780. It uses it in 4 bit mode, with
 *	the hardware connected as follows (the standard 14 pin 
 *	LCD connector is used):
 *	
 *	PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
 *	PORTB bit 5 is connected to the LCD RS input (register select)
 *	PORTB bit 4 is connected to the LCD EN bit (enable)
 *	
 *	To use these routines, set up the port I/O (TRISB) then
 *	call lcd_init(), then other routines as required.
 *	
 */

#ifndef _XTAL_FREQ
 // Unless specified elsewhere, 4MHz system frequency is assumed
 #define _XTAL_FREQ 4000000
#endif


#include	<htc.h>
#include	"lcd.h"

#define	LCD_RS RB5
#define LCD_EN RB4
#define LCD_PORT PORTB
#define LCD_TRIS TRISB

#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_PORT = ( LCD_PORT & 0xF0 ) + ( c >> 4 ); 
	LCD_STROBE();
	LCD_PORT = ( LCD_PORT & 0xF0 ) + ( 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;
	LCD_TRIS	= 0;
	LCD_RS		= 0;
	LCD_EN		= 0;
	
	__delay_ms(15);	// wait 15mSec after power applied,
	LCD_PORT = ( LCD_PORT & 0xF0 ) + init_value;
	LCD_STROBE();
	__delay_ms(5);
	LCD_STROBE();
	__delay_us(200);
	LCD_STROBE();
	__delay_us(200);
	LCD_PORT = ( LCD_PORT & 0xF0 ) + 2;	// Four bit mode
	LCD_STROBE();

	lcd_write(0x28); // Set interface length
	lcd_write(0xF); // Display On, Cursor On, Cursor Blink
	lcd_clear();	// Clear screen
	lcd_write(0x6); // Set entry Mode
}

上記の改造したLCDサンプルルーチンを使ったサンプル表示ソフトが下記です。PIC16F648Aを使っています。

#include <htc.h>
#include "lcd.h"

	__CONFIG( UNPROTECT & LVPDIS & BORDIS & MCLRDIS & PWRTEN & WDTDIS & INTIO );

void
main(void)
{
	CMCON = 0b00000111;
	lcd_init();
	lcd_goto(0);	// select first line
	lcd_puts("12345678");
	lcd_goto(0x40);	// Select second line
	lcd_puts("Hello world");

	for(;;);
}




閉じる コメント(2)

顔アイコン

確かにひどいですね。
初めからPORTBにすればよかったのに・・・

2010/1/29(金) 午前 7:23 [ 回路師 ]

顔アイコン

まーね〜w

サンプルだって言われればそれまでなんだけどね〜

2010/1/29(金) 午前 9:43 じゅん


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事