動いた。ATmega168からUARTでコマンドを送って、動かす。
SourceCode, hex, Makefile(avr-gcc 3.4.6)
データシートにはマイコンが5Vの場合、マイコンのTXDとLCDの間に1kΩの抵抗を入れろと書いてあったが、なぜかVCCとの間に入れてプルアップにしたら小気味よく動いた。RXDはそのまま。
■カラーコードの変換関数
前の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);
}
}