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

このブログを検索

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

2008年7月10日木曜日

AT-Tiny26で液晶SC1602BSの表示を行う


以下はAT-Tiny26Lで液晶SC1602BSの表示を行うプログラムです
SC1602BSとTiny26は次のように接続してください.
;DB7<->PA7 DB6<->PA6
;DB5<->PA5 DB4<->PA4
;DB3<->Open DB2<->Open
;DB1<->Open DB0<->Open
;E<->PA2 R/W<->GND
;RS<->PA0 Vo<->GND
;Vss<->GND Vdd<->5V
クロックは,8MHz(内部発振でも外部発振でも可)で動くように作ってあります.
ちゃんと動けば
Hello
Tiny26
と表示されるはずです.
例えば「H」と表示する場合,dat(0x48);のように16進数を送っても構いませんが
dat('H');のように文字コードを送るのが簡単でよいでしょう.
ちなみに以前は割り込みで時間をコントロールするプログラムを公開していましたが
avr-gccの最近のバージョンでは動かなくなりました.

以下がソースプログラム
/*
液晶SC1602BSの表示を行う
wait()では,タイマ0を使い待ち時間をコントロールする
内部発振Int.RC Osc. 8MHz:Start-up time:6CK+64ms
Tiny26--SC1602BSのピン接続
PA0--RS
PA1
PA2--E
PA3
GND
AVCC
PA4--DB4
PA5--DB5
PA6--DB6
PA7--DB7
GND--R/W,Vo,Vss
5V--Vdd
*/
#include <avr/io.h>

//マイクロ秒単位の待ち
void delay(uint8_t t){
TCCR0=0B00000010;//clk/8 (64分周)
TCNT0=255-t;
TIFR |= 1<<TOV0;//TOV0クリア
while(!(TIFR & (1<<TOV0))){}//カウンタがオーバーフローするまで待つ
}

void en(void){
PORTA|= 1<<2;
delay(20);
PORTA&=~(1<<2);
delay(20);
}

void cmnd(uint8_t i){
PORTA=i&(0B11110000);
en();
PORTA=(i<<4)&(0B11110000); //i<<4は4ビット左シフト &はビット間のAND
en();
delay(40);
}

//データの書き込み
void dat(uint8_t i){
PORTA=i&(0B11110000);
PORTA|= 1<<0; //RS
en();
PORTA=(i<<4)&(0B11110000);
PORTA|= 1<<0; //RS
en();
delay(40);
PORTA&=~(1<<0); //RS clear
}

int main( void )
{
uint16_t i;
DDRA = 0B11111111; //PA all output
TCCR0=0B00000010; //CK/8
TIMSK|= 1<<TOIE0; //T0 Ovf Int Enable
//液晶初期設定
for(i=0;i<80;i++)delay(250); //Wait 20ms
PORTA=0B00110000;
en();
for(i=0;i<20;i++)delay(250); //Wait 5ms
en();
delay(100); //Wait 100Us
en();
delay(50); //Wait 50Us
PORTA=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
for(i=0;i<8;i++)delay(250); //Wait 2ms
dat('H'); //H
dat('e'); //e
dat('l'); //l
dat('l'); //l
dat('o'); //o
dat(' '); //
dat('T'); //T
dat('i'); //i
dat('n'); //n
dat('y'); //y
dat('2'); //2
dat('6'); //6
for(i=0;i<2000;i++)delay(250); //Wait 500ms
cmnd(0B00000001); //Clear LCD
for(i=0;i<8;i++)delay(250); //Wait 2ms
cmnd(0XC0); //DDRAM=40 Lower Line
dat('コ'); //コ
dat('ン'); //ン
dat('ニ'); //ニ
dat('チ'); //チ
dat('ハ'); //ハ
dat('!'); //!
for(i=0;i<2000;i++)delay(250); //Wait
}//while(1)

}