ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.

このブログを検索

あなたは 番目のお客様です.

2008年3月28日金曜日

R8Cで液晶SC1602BSの表示を行う

以下はR8C/tinyで液晶SC1602BSの表示を行うプログラムです
ちゃんと動けば
Hello R8C/Tiny
コンニチハ!
と表示されるはずです.

タイマXを使い時間をコントロールしています
R8CとSC1602BSのピン接続
DB7<->p1_7
DB6<->p1_6
DB5<->p1_5
DB4<->p1_4
RS<->p1_3
E<->p1_2
R/W<->GND
Vo<->GND
Vss<->GND
Vdd<->5V

以下がソースプログラム

#include "sfr_r815.h" // R8C SFR定義ファイル

// マイクロsec単位の待ちルーチン,引数iは2550以下!
void delay(int i){
int t1,t2;
t1=tx;
t1=t1-i/10;
t2=t1+256;
while(tx!=t1 && tx!=t2){}
}

// En端子のon-off
void en(void){
p1_2=1;
delay(20);
p1_2=0;
delay(20);
}

//コマンドの書き込み
void cmnd(char i){
p1=i&(0B11110000);
en();
p1=(i<<4)&(0B11110000); //i<<4は4ビット左シフト&はビット間のAND
en();
delay(40);
}

//データの書き込み
void dat(char i){
p1=i&(0B11110000);
p1_3=1;
en();
p1=(i<<4)&(0B11110000);
p1_3=1;
en();
delay(40);

}

// メイン関数
void main(void)
{
int i;
//メインクロック切替
prc0 = 1; //プロテクト制御(書き換え許可)
cm13 = 1; //Xin-Xout端子切り替え
cm05 = 0; //Xin-Xoutメインクロック発振
cm06 = 0; //8分周以外(分周なし)
asm("nop"); //発振の安定待ち
asm("nop"); //  (同上)
asm("nop"); //  (同上)
asm("nop"); //  (同上)
ocd2 = 0; //メインクロック選択
prc0 = 0; //プロテクト制御(書き換え禁止)

// I/Oポートの初期設定
pd1 =0B11111100; //P1_2to7 出力モード設定
p1 =0B00000000; //P1_2to7 Lレベル

//タイマXの初期設定
txck0=0; //f1
txck1=0;
txmod0=0;
txmod1=0;
txmod2=0;
prex=200-1; //プリスケーラ1/200
//tx=255;
txs=1; //タイマX開始

for(i=0;i<20;i++)delay(1000); //Wait 20ms
p1 =0B00110000;
en();
for(i=0;i<5;i++)delay(1000); //Wait 5ms
en();
delay(100); //Wait 100Us
en();
delay(50); //Wait 50Us
p1=0B00100000; //Function set
en();
delay(50); //Wait 50Us
cmnd(0B00101100); //N=1:2lines F=1:10dots
cmnd(0B00001100); //Display On Off Control
cmnd(0B00000110); //Entry Mode Increment

while(1){
cmnd(0B00000001); //Clear LCD
delay(2000); //Wait 2ms
dat(0X48); //H
dat(0X65); //e
dat(0X6C); //l
dat(0X6C); //l
dat(0X6F); //o
dat(0X20); //
dat(0X52); //R
dat(0X38); //8
dat(0X43); //C
dat(0X2F); ///
dat(0X54); //T
dat(0X69); //i
dat(0X6E); //n
dat(0X79); //y
for(i=0;i<1000;i++)delay(1000); //Wait 1000ms
cmnd(0B00000001); //Clear LCD
delay(2000); //Wait 2ms
cmnd(0XC0); //DDRAM=40 Lower Line
dat(0XBA); //コ
dat(0XDD); //ン
dat(0XC6); //ニ
dat(0XC1); //チ
dat(0XCA); //ハ
dat(0X21); //!
for(i=0;i<1000;i++)delay(1000); //Wait 1000ms
}//while(1)
}