■Garbagecollection■ | |
Last Update : 2009/05/28 | |
〜 秋月のジャンク基板で遊んでみよう 〜
■ 秋月のH8Sジャンク基板で遊んでみる@450 (その5) LCD制御を自前でやってみる・・・?
やっぱり、他所のパクリばかりじゃダメかな・・・と思いLCD制御のヘッダファイルを作ってみました。
それとLCDのテストを一緒にやってみました。
delayは、まぁ適当なわけで・・・まぁこんなもんでしょ〜的な感じで・・
lcdcontrl.h
/*******************************************************************************/ /* Program Name : lcdcontrl.h /* Disctiption : LCD制御ヘッダー /* History : Ver 1.00 2009/05/23 /* /* /* /*******************************************************************************/ #include <2144s.h> /*******************************************************************************/ /* Function Name : Define Port /* Disctiption : 出力ポート設定 /* Input : /* Output : LCD OUTPUT PORT SETTINGS /* 7 6 5 4 3 2 1 0 */ /* - - E RS DB7 DB6 DB5 DB4 */ /*******************************************************************************/ #define LCD_PORT P6.DR.BYTE #define LCD_PORTD P6.DDR #define LCD_RS P6.DR.BIT.B4 #define LCD_E P6.DR.BIT.B5 #define LCD_STROBE ((LCD_E = 1),(LCD_E=0)) /*******************************************************************************/ /* Function Name : Prototype declaration /* Disctiption : プロトタイプ宣言 /* Input : /* Output : /*******************************************************************************/ void delay50us(void); void delay_ms(unsigned int time); void lcd_write(unsigned char c); void lcd_wrt8(unsigned char c); void lcd_clear(void); void lcd_pos(unsigned char pos); void lcd_putc(char c); void lcd_puts(char *s); void lcd_init(void); void lcd_cur(unsigned char lin,unsigned char col); /*******************************************************************************/ /* Function Name : delay50us /* Disctiption : 50uS待ち /* Input : /* Output : /*******************************************************************************/ void delay50us(void) { unsigned int i; for (i=0;i<10;i++) ; } /*******************************************************************************/ /* Function Name : delay_ms /* Disctiption : ○ms待ち /* Input : 1ms単位で指定 /* Output : 1000msは1秒みたいな・・ /*******************************************************************************/ void delay_ms(unsigned int time) { unsigned int i,j; for (j=0;j<time;j++) for (i=0;i<90;i++) ; } /*******************************************************************************/ /* Function Name : lcd_write /* Disctiption : 指定キャラクタを表示する。(4BitMode) /* Input : キャラクタ /* Output : LCDへ指定キャラクタを表示させる。 /*******************************************************************************/ void lcd_write(unsigned char c) { LCD_PORT=(LCD_PORT & 0xF0) | (c >> 4); LCD_STROBE; LCD_PORT=(LCD_PORT & 0xF0) | (c & 0x0F); LCD_STROBE; delay50us(); } /*******************************************************************************/ /* Function Name : lcd_wrt8 /* Disctiption : 指定キャラクタを表示する。(8BitMode) /* Input : キャラクタ /* Output : LCDへ指定キャラクタを表示させる。 /*******************************************************************************/ void lcd_wrt8( unsigned char c ) { LCD_RS = 0; LCD_PORT=c; LCD_STROBE; delay50us(); } /*******************************************************************************/ /* Function Name : lcd_clear /* Disctiption : 表示クリア /* Input : /* Output : /*******************************************************************************/ void lcd_clear(void) { LCD_RS=0; lcd_write(0x1); delay_ms(2); } /*******************************************************************************/ /* Function Name : lcd_pos /* Disctiption : 表示位置指定 上1桁目80H 下1桁目C0H /* Input : 位置指定 /* Output : LCDに表示位置を指定 /*******************************************************************************/ void lcd_pos(unsigned char pos) { LCD_RS=0; lcd_write(pos); } /*******************************************************************************/ /* Function Name : lcd_cur /* Disctiption : 表示位置指定 行、桁 /* Input : 位置指定 /* Output : LCDに表示位置を指定 /*******************************************************************************/ void lcd_cur(unsigned char lin,unsigned char col) { unsigned char adr; if( lin ==1 ) adr = (unsigned char)col + 0x80; if( lin >=2 ) adr = (unsigned char)col + 0xc0; LCD_RS=0; lcd_write(adr); } /*******************************************************************************/ /* Function Name : lcd_putc /* Disctiption : 1キャラクタ表示 /* Input : キャラクタ /* Output : LCDに表示 /*******************************************************************************/ void lcd_putc(char c) { LCD_RS=1; // write characters lcd_write(c); } /*******************************************************************************/ /* Function Name : lcd_puts /* Disctiption : 文字列表示 /* Input : 文字列 /* Output : LCDに表示 /*******************************************************************************/ void lcd_puts(char *s) { LCD_RS=1; // write characters while(*s) lcd_write(*s++); } /*******************************************************************************/ /* Function Name : lcd_init /* Disctiption : LCDイニシャライズ /* Input : /* Output : /*******************************************************************************/ // LCD初期化 void lcd_init(void) { LCD_RS=0; // write control bytes delay_ms(15); // power on delay LCD_PORT=0x3; // attention! LCD_STROBE; delay_ms(5); LCD_STROBE; delay50us(); LCD_STROBE; delay_ms(5); LCD_PORT = 0x2; // set 4 bit mode LCD_STROBE; delay50us(); lcd_write(0x28); // 4 bit mode, 1/16 duty, 5x8 font lcd_write(0x08); // display off lcd_write(0x0F); // display on, blink curson on lcd_write(0x06); // entry mode } |
H8S_LCD1.c
#include <2144s.h> #include "lcdcontrl.h" /*----------------*/ main() { /* なぜか頭にstaticをつけないと 下のようなErrorになる*/ /* H8S_LCD.c:(.text+0x481): undefined reference to `_memcpy' */ /* 0123456789ABCDF*/ static unsigned char str1[] = " Garbage "; static unsigned char str2[] = " Collection."; LCD_PORTD=0xff; // LCD用ポート全出力 lcd_init(); lcd_clear(); while(1) { delay_ms(1000); lcd_pos(0x80); lcd_puts( str1); delay_ms(1000); lcd_pos(0xC0); lcd_puts( str2); delay_ms(1000); lcd_clear(); lcd_cur(1,1); lcd_putc('A'); delay_ms(1000); lcd_cur(1,3); lcd_putc('B'); delay_ms(1000); lcd_cur(1,5); lcd_putc('C'); delay_ms(1000); lcd_cur(1,7); lcd_putc('D'); delay_ms(1000); lcd_cur(1,9); lcd_putc('E'); delay_ms(1000); lcd_cur(1,11); lcd_putc('F'); delay_ms(1000); lcd_cur(1,13); lcd_putc('G'); delay_ms(1000); lcd_cur(1,15); lcd_putc('H'); delay_ms(1000); lcd_cur(2,2); lcd_putc('1'); delay_ms(1000); lcd_cur(2,4); lcd_putc('2'); delay_ms(1000); lcd_cur(2,6); lcd_putc('3'); delay_ms(1000); lcd_cur(2,8); lcd_putc('4'); delay_ms(1000); lcd_cur(2,10); lcd_putc('5'); delay_ms(1000); lcd_cur(2,12); lcd_putc('6'); delay_ms(1000); lcd_cur(2,14); lcd_putc('7'); delay_ms(1000); lcd_cur(2,16); lcd_putc('8'); delay_ms(1000); } } |
コンパイルしたものをソースと一緒に圧縮した物を置いておきます。
H8S_LCD_TEST1.zip