動いた。ATmega168からUARTでコマンドを送って、動かす。

SourceCode, hex, Makefile(avr-gcc 3.4.6)

データシートにはマイコンが5Vの場合、マイコンのTXDとLCDの間に1kΩの抵抗を入れろと書いてあったが、なぜかVCCとの間に入れてプルアップにしたら小気味よく動いた。RXDはそのまま。Dontronics uLCD128

■カラーコードの変換関数

前のs.h.log: Dontronics uLCD128のカラーコード変換もちょっと間違いがあったので直した

voidcolorToSb(char*color,char*sb){

//msb

sb[0]=((color[0]&0b11111)<<3)//RED

+((color[1]&0b111000)>>3);//GREEN-A

//lsb

sb[1]=((color[1]&0b111)<<5)//GREEN-B

+(color[2]&0b11111);//BLUE;

}



■LCDからのエラーを受け取る関数

LCDのエラーコードを定義しておいて

#defineACK0x06

#defineNAK0x15

返事を待つ関数

/*LCDの返事を待つ*/

charlcd_waitRes(void){

chari;

for(i=0;i<20;i++){

switch(usart_recvData){

caseNAK://error

usart_recvData=NULL;

returnTRUE;

break;

caseACK://success

usart_recvData=NULL;

returnFALSE;

break;

}

_delay_ms(0xFF);

}

returnFALSE;

}

/**UART受信割り込み**/

SIGNAL(SIG_USART_RECV){

if(bit_is_clear(UCSR0A,FE0)){//フレーミングエラーが無い時

usart_recvData=UDR0;//受信データをグローバル変数に取得

}

}

■四角の描画関数

/*LCDを四角に塗りつぶす*/

voidlcd_paintArea(charx1,chary1,charx2,chary2,char*sb){

loop_until_bit_is_set(UCSR0A,UDRE0);//送信データレジスタ空きまで待機

UDR0=’p’;

loop_until_bit_is_set(UCSR0A,UDRE0);

UDR0=x1;

loop_until_bit_is_set(UCSR0A,UDRE0);

UDR0=y1;

loop_until_bit_is_set(UCSR0A,UDRE0);

UDR0=x2;

loop_until_bit_is_set(UCSR0A,UDRE0);

UDR0=y2;

loop_until_bit_is_set(UCSR0A,UDRE0);

UDR0=sb[0];

loop_until_bit_is_set(UCSR0A,UDRE0);

UDR0=sb[1];

}

■main()

先に色を3つ作っておいて(赤、緑、青)、msb,lsbに変換して、lcd_printArea()の最後のsbの所に渡して描画をどんどん切り替えている。

intmain(void){

port_init();//PORT設定

usart_init(MYUBRR);//USART設定

sei();//全割り込み許可



LED_SET();//起動確認LED

_delay_ms(0xFF);

LED_CLR();

_delay_ms(0xFF);

LED_SET();


usart_sendStr(“U”);//接続

lcd_waitRes();

usart_sendStr(“E”);//クリア

lcd_waitRes();


charcolor0[3]={0b11111,0b000000,0b00000};//RGB

charcolor1[3]={0b00000,0b111111,0b00000};

charcolor2[3]={0b00000,0b000000,0b11111};


charsb[2];

for(;;){

colorToSb(color0,sb);//msb,lsb取得

lcd_paintArea(10,0,60,100,sb);//x1,y1,x2,y2,color(msb,lsb)

lcd_waitRes();



LED_CLR();

_delay_ms(0xFF);

_delay_ms(0xFF);

_delay_ms(0xFF);


colorToSb(color1,sb);//msb,lsb取得

lcd_paintArea(10,0,60,100,sb);

lcd_waitRes();



LED_CLR();

_delay_ms(0xFF);

_delay_ms(0xFF);

_delay_ms(0xFF);


colorToSb(color2,sb);//msb,lsb取得

lcd_paintArea(10,0,60,100,sb);

lcd_waitRes();



LED_CLR();

_delay_ms(0xFF);

_delay_ms(0xFF);

_delay_ms(0xFF);

}



}