LCDのSD1602HULBをpic18F45K20で制御
参考文献
普通最後に書くところだけどほとんどここを参考にしたので、最初に書く。 PICで遊ぶ電子工作 - 液晶ディスプレイを使う
ハードウェア部
すでに資料があるのに自分で新たにつくるのは正直面倒。
ソフトウェア部
仕組みはともかく、作ったソースコードのみを公開することにする。 上のサイトを参考にすれば似たようなものができるだろう。
#include <xc.h> //コンフィギュレーションビット(内部オシレータを使用) #pragma config BOREN = ON, CPD = OFF, DEBUG = OFF, WRT = OFF, FOSC = HS, WDTE = OFF, CP = OFF, LVP = OFF, PWRTE = ON //クロック周波数の指定(10MHz) #define _XTAL_FREQ 10000000 //各種ポート名 #define EN PORTBbits.RB3 #define RS PORTBbits.RB1 #define RW PORTBbits.RB2 #define DB4 PORTBbits.RB4 #define DB5 PORTBbits.RB5 #define DB6 PORTBbits.RB6 #define DB7 PORTBbits.RB7 //プロトタイプ宣言 void write4bit(unsigned char); void picInit(); void lcdInit(); void lcdTest(); void lcd_data(unsigned char); void lcd_cmd(unsigned char); void write4bit(unsigned char); //メイン関数 void main() { //PICマイコンの初期化 __delay_ms(49); picInit(); //ディスレイ初期化開始 lcdInit(); //テスト用(LEDを点滅させながらLCDに文字を表示) while(1) { __delay_ms(49); PORTAbits.RA0 = 1; __delay_ms(49); PORTAbits.RA0 = 0; lcdTest(); } } void picInit() { OSCCON = 0b00000000 ; //クロック周波数の指定 ANSEL = 0b00000000 ; //デジタルで出力 ANSELH = 0b00001000 ; // デジタルで出力 TRISA = 0b00000000 ; //すべてのピンを出力にする TRISB = 0b00000000 ; TRISC = 0b00000000 ; TRISD = 0b00000000 ; PORTA = 0b00000000 ; //すべてのピンをLowにする PORTB = 0b00000000 ; PORTC = 0b00000000 ; PORTD = 0b00000000 ; PORTAbits.RA2 = 1; } void lcdInit() { EN = 0; RS = 0; RW = 0; //8ビットモードへ __delay_ms(20); write4bit(0x3); __delay_ms(10); write4bit(0x3); __delay_ms(5); write4bit(0x3); //4ビットモードへ __delay_ms(5); write4bit(0x2); __delay_ms(5); //2桁表示 lcd_cmd(0x28); __delay_ms(5); //LCD ON lcd_cmd(0x08); __delay_ms(5); //ディスプレイオン lcd_cmd(0x0D); __delay_ms(5); //エントリーモードセット lcd_cmd(0x06); __delay_ms(5); } void lcdTest()//0x44を出力し続ける。 { lcd_cmd(0x80); __delay_ms(20); lcd_cmd(0x80); __delay_ms(20); lcd_cmd(0x80); __delay_ms(20); lcd_data(0x44); } void write4bit(unsigned char data) { PORTB = (data << 4); EN = 1; __delay_us(20); EN = 0; __delay_us(20); } void lcd_data(unsigned char data) { RS = 1; PORTB = (data & 0xF0); EN = 1; __delay_us(20); EN = 0; __delay_us(20); PORTB = (data & 0x0F) << 4; EN = 1; __delay_us(20); EN = 0; __delay_us(20); } void lcd_cmd(unsigned char data) { RS = 0; PORTB = (data & 0xF0); EN = 1; __delay_us(20); EN = 0; __delay_us(20); PORTB = (data & 0x0F) << 4; EN = 1; __delay_us(20); EN = 0; __delay_us(20); }