2.4インチ液晶ディスプレイ高速表示③ Arduino UNO R4 MINIMA・WiFi 編
最新ArduinoマイコンボードであるArduino UNO R4でILI9341ドライバー搭載の2.4インチ液晶ディスプレイを高速で制御しよう企画の第三弾。
最初から見ていない人は、ぜひ最初から見てくれると嬉しい。
Arduino UNO R4が発表された時の売り文句が、「前世代のUNO R3とピン配置や動作電圧を同じにし、ハードウェアおよび電気的な互換性は最大限維持した。」といったことだった。 だがしかし、それはArduino IDEで用意されたライブラリ等を使った場合であって、私キャッスルのようなちょっと道を外れた使い方での互換性は皆無だ。
ということは、このページを見ている人にとっては先刻承知ではあるとは思うが。
長々と書いててもしょうがないので、さっそくArduino UNO R4用のプログラム修正箇所を書きたいと思う。 気を付けないといけないのは、MINIMAとWiFiとでは若干違うということだ。 何度も言っているが、MINIMAとWiFiは姉妹品ではなく、別物という認識を持つべきだ。
Arduino UNO R4 MINIMAでの修正箇所。
void Lcd_Writ_Bus(unsigned char d) { R_PORT3->PODR_b.PODR4 = d ; R_PORT3->PODR_b.PODR3 = d >> 1 ; R_PORT1->PODR_b.PODR5 = d >> 2 ; R_PORT1->PODR_b.PODR4 = d >> 3 ; R_PORT1->PODR_b.PODR3 = d >> 4 ; R_PORT1->PODR_b.PODR2 = d >> 5 ; R_PORT1->PODR_b.PODR6 = d >> 6 ; R_PORT1->PODR_b.PODR7 = d >> 7 ; R_PORT0->PODR_b.PODR0 = 0; R_PORT0->PODR_b.PODR0 = 1; } void Lcd_Write_Com(unsigned char VH) { R_PORT0->PODR_b.PODR1 = 0; Lcd_Writ_Bus(VH); } void Lcd_Write_Data(unsigned char VH) { R_PORT0->PODR_b.PODR1 = 1; Lcd_Writ_Bus(VH); } void H_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) { unsigned int i, j; R_PORT0->PODR_b.PODR2 = 0; l = l + x; Address_set(x, y, l, y); j = l * 2; for(i = 1; i <= j; i++) Lcd_Write_Data(c); R_PORT0->PODR_b.PODR2 = 1; } void V_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c) { unsigned int i, j; R_PORT0->PODR_b.PODR2 = 0; l = l + y; Address_set(x, y, x, l); j = l * 2; for(i = 1; i <= j; i++) Lcd_Write_Data(c); R_PORT0->PODR_b.PODR2 = 1; } void LCD_Clear(unsigned int j) { unsigned int i,m; R_PORT0->PODR_b.PODR2 = 0; Address_set(0, 0, 239, 319); for(i = 0; i < 240; i++) for(m = 0; m < 320; m++){ Lcd_Write_Data(j>>8); Lcd_Write_Data(j); } R_PORT0->PODR_b.PODR2 = 1; }
このように書き換えることで、4秒半まで縮まる。 なかなか早い。
が、UNO R3の60秒が3秒に、MEGAの90秒が9秒に、DUEの30秒が3秒に、ってのと比べると、UNO R4の15秒が4秒半にってのはちょっとインパクトに欠ける・・・。
ちなみに、Arduino UNO R4 WiFiでの修正では、Lcd_Writ_Bus関数の中が若干違う。
void Lcd_Writ_Bus(unsigned char d) { R_PORT3->PODR_b.PODR4 = d ; R_PORT3->PODR_b.PODR3 = d >> 1 ; R_PORT1->PODR_b.PODR4 = d >> 2 ; R_PORT1->PODR_b.PODR5 = d >> 3 ; R_PORT1->PODR_b.PODR6 = d >> 4 ; R_PORT1->PODR_b.PODR7 = d >> 5 ; R_PORT1->PODR_b.PODR11 = d >> 6 ; R_PORT1->PODR_b.PODR12 = d >> 7 ; R_PORT0->PODR_b.PODR0 = 0; R_PORT0->PODR_b.PODR0 = 1; }
このようにすればいい。
時間はMINIMAと変わらない。