雨でどこにも出かけようが無いので、秋月で買った500円の液晶で遊ぶことにします。



RB4-7の4bitをデータ送りに使っています。コントロールは、RA0-2がそれぞれ、RS、R/W、Enableです。左上のボリュームはコントラスト調整用。

コントロール用の lcd.c はこんなかんじで。
検索して見つけた幾つかの先輩方のソースをパクりまくって出来ております。
参考にさせていただいたところは、
http://homepage3.nifty.com/mitt/pic/pic5_17.html
http://www.picfun.com/p87703.html
http://hp.hana-neko.com/electro/electro/pic/16f84lcd.htm#prg
とか、ほかにもたくさんです。
************************************
#define _XTAL_FREQ 4000000
#include <htc.h>
#include “lcd.h”
#define LCD_RS RA0
#define LCD_RW RA1
#define LCD_EN RA2
#define LCD_DATA PORTB
#define LCD_STROBE() ((LCD_EN = 1),(LCD_EN=0))
void
lcd_write(unsigned char c)
{
__delay_us(40);
LCD_DATA = ( c & 0xF0 );
LCD_STROBE();
LCD_DATA = ( ( c << 4 ) & 0xF0 );
LCD_STROBE();
}
void
lcd_clear(void)
{
LCD_RS = 0;
lcd_write(0x1);
__delay_ms(2);
}
void
lcd_puts(const char * s)
{
LCD_RS = 1;
while(*s)
lcd_write(*s++);
}
void
lcd_putch(char c)
{
LCD_RS = 1;
lcd_write( c );
}
void
lcd_goto(unsigned char pos)
{
LCD_RS = 0;
lcd_write(0x80+pos);
}
void
lcd_init()
{
char init_value;
init_value = 0b00110000;
LCD_RS = 0;
LCD_EN = 0;
LCD_RW = 0;
__delay_ms(15);
LCD_DATA = init_value;
LCD_STROBE();
__delay_ms(5);
LCD_STROBE();
__delay_us(200);
LCD_STROBE();
__delay_us(200);
LCD_DATA = 0b00100000;
LCD_STROBE();
lcd_write(0x28);
lcd_write(0xC);
lcd_clear();
lcd_write(0x6);
}
************************************
んで、メイン関数はこんな感じで
************************************
#include <htc.h>
#include “lcd.h”
#include “stdio.h”
#define _XTAL_FREQ 4000000
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & CP_OFF);
void putch(unsigned char ch);
void
main(void)
{
TRISA=0;
TRISB=0;
lcd_init();
lcd_goto(0);
while(1){
lcd_clear;
lcd_goto(0x0);
printf(“Hello World”);
lcd_goto(0x40);
printf(“(^_^)/”);
__delay_ms(1000);
}
}
void
putch(unsigned char ch)
{
lcd_putch(ch);
}
************************************
無事動きました。

コメント