2011年9月5日月曜日

PICで液晶

/* *** */

#include <htc.h>

__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & MCLRE_ON & BOREN_OFF & LVP_OFF & DEBUG_OFF);

#define _XTAL_FREQ 20000000

#define E RB0
#define RS RB1
#define RW RB2

#define D4 RA3
#define D5 RA2
#define D6 RA1
#define D7 RA0

void LCD_init(void);
void LCD_clear(void);
char LCD_printf(char text[]);
void LCD_8set(unsigned char, char, char);
void LCD_4set(unsigned char, char, char);

static void interrupt intr(void) {
if (RCIF) {
RCIF = 0;
char c = RCREG;
if (c == 0x1B) { LCD_clear(); return; }
if (c == 0x08) { LCD_8set(0x80, 0, 0); return; }
if (c == 0x0D) { LCD_8set(0xC0, 0, 0); return; }
LCD_8set(c, 1, 0);
}
}

void main(void) {
TRISA = 0b000000;
TRISB = 0b00000000;
ANSEL = 0;
PORTA = 0;
PORTB = 0;

LCD_init();

LCD_printf("LCD init ok...");
__delay_s(1);
LCD_clear();

for(;;) {
LCD_printf("hello");
__delay_s(1);
LCD_clear();
__delay_ms(1);

LCD_printf("world");
__delay_s(1);
LCD_clear();
__delay_ms(1);
}
}

void LCD_init(void) {
__delay_ms(15);

LCD_4set(0x30, 0, 0);
__delay_ms(5);
LCD_4set(0x30, 0, 0);
__delay_ms(1);
LCD_4set(0x30, 0, 0);

LCD_4set(0x20, 0, 0);

LCD_4set(0x20, 0, 0);
LCD_4set(0x80, 0, 0);

LCD_4set(0x00, 0, 0);
LCD_4set(0x80, 0, 0);

LCD_4set(0x00, 0, 0);
LCD_4set(0x01, 0, 0);

__delay_ms(2);

LCD_8set(0x06, 0, 0);

LCD_8set(0x80, 0, 0);

LCD_8set(0x0C, 0, 0);
}

void LCD_clear(void) {
LCD_8set(0x01, 0, 0);
__delay_ms(1);
LCD_8set(0x0C, 0, 0);
}

char LCD_printf(char text[]) {
char c;
for (c = 0; text[c] != '\0';c++)
{ LCD_8set(text[c], 1, 0); }
return c;
}

void LCD_8set(unsigned char data, char RSb, char RWb) {
LCD_4set(((data << 0) & 0xF0), RSb, RWb);
LCD_4set(((data << 4) & 0xF0), RSb, RWb);
}

void LCD_4set(unsigned char data, char RSb, char RWb) {
RS = RSb;
RW = RWb;
D4 = ((data >> 4) & 1);
D5 = ((data >> 5) & 1);
D6 = ((data >> 6) & 1);
D7 = ((data >> 7) & 1);

__delay_us(500);
E = 1;
__delay_us(1000);
E = 0;
}
/* *** */

PIC16F88 @ 20MHz
液晶との接続はコード最初のほうで確認してください
あと__delay_s()の追加をしてない人は
__delay_msに修正するなり
#define __delay_s(sec) { __delay_ms(sec * 1000); }
とか書き足すなり(動作確認はしてないけど)
適当に対応してください


実はこれARMチャレンジャーの液晶の動作確認に作ったコード
なぜかARMからだと動作してくれなかったので
PICで動作確認
んでこのコードをARMに移植しても動かないんだよね…
LCDの電源が5VでARMが3.3Vだからとかいうくだらない理由でも無いと思うんだけど…
何なんだろう

0 件のコメント:

コメントを投稿