■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

inserted by FC2 system