1 LCD(MAR3953)を使う
1.1 LCD(MAR3953)
1.1.1 概要
今回使用のLCD MA3953 (上段表面、下段裏面)
この表示器(MAR3953)はドライバーにST7796Sを使用した 3.95インチのArduinoModuleです。
この表示器を使用し、受信機を作成したいと思いました。
いつ、どこから、いくらで購入したかは不明です。
今回も Arduino で言う ライブラリーは使用せずに MounRiver Studio Ⅱ でMCUはCH32V203C8T6を使用してプログラムを作成します。
MAR3953 表示部の仕様は
今回使用するデータBUSは 8bit です。
タッチパネルの仕様は(不明なため予想も含め)
この表示器を使用し、受信機を作成したいと思いました。
いつ、どこから、いくらで購入したかは不明です。
今回も Arduino で言う ライブラリーは使用せずに MounRiver Studio Ⅱ でMCUはCH32V203C8T6を使用してプログラムを作成します。
MAR3953 表示部の仕様は
| 画面大きさ(inch) | 3.95 |
| Driver | ST7796S |
| Doto | 320X480 |
| 発色 | RGB 65K(16bit) |
| データBUS | 16又は8bitパラレル ※8bitは、□ のR4に短絡片を取り付ける。 |
| 付属品 | タッチパネル、SDメモリ |
| 付属品I/O | SPI |
| 消費電流(mA) | 180 |
| 使用電圧 | 5〜3.3(V) ※3.3Vは □ の 3端子レギュレータを外す事 |
| 本体大きさ(mm) | 106×62 |
今回使用するデータBUSは 8bit です。
タッチパネルの仕様は(不明なため予想も含め)
| Driver | XPT2046 |
| 方式 | 4線式抵抗膜 |
| 分解能 | 12bit 4096×4096 |
| I/O | SPI |
1.1.2 モジュールと内部端子
MAR3954モジュールと Driver ST7796Sとの端子の関係
MAR3954とST7796Sのマニュアルを見ていて端子がどんな関係なのか調べた結果を下表に示す。
ST7796S端子の名前末尾のXは負論理を示しているようだ。
MAR3954とST7796Sのマニュアルを見ていて端子がどんな関係なのか調べた結果を下表に示す。
| MAR3954端子 | ST7796S端子 | 目的 | 機能 |
|---|---|---|---|
| LCD_RST | RESX | リセット | システムを初期化します(Lowでリセット)。 |
| LCD_CS | CSX | チップセレクト | このパネルを選択して通信を有効にします(Lowで有効)。 |
| LCD_RS | D/CX | レジスタ選択 | 送信データが「コマンド(Low)」か「表示データ(High)」かを指定します。 |
| LCD_WR | WRX | 書き込み信号 | マイコンからLCDへデータを書き込む際の同期信号です。 |
| LCD_RD | RDX | 読み出し信号 | LCDからデータを読み出す際の同期信号です。 |
| DB0〜DB7 | DB0〜DB7 | データ信号 | データ信号 |
1.1.3 交流特性(※51P^52P)
|
|
1.1.4 CH32V203C8T6との接続
今回テストするライン関係の表示状況
MAR3953のI/Oは8bitで以下の様にCH32V203C8T6と接続する。
|
|
1.2 コマンド
以下コマンドテーブルは ST7796S Datasheet『9 COMMAND Table List』に記載されています。
はよく使用されるコマンド。
各コマンドとデータの詳細は ST7796S Datasheet『9.2 COMMAND Table1』に記載されています。
各コマンドとデータの詳細は ST7796S Datasheet『9.2 COMMAND Table1』に記載されています。
| コマンド | データ | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 概要 | 値 | R/W | Byte | 概要 | ||||||||
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |||||
| NOP | 0x00 | -- | -- | - | - | - | - | - | - | - | - | |
| Software reset | 0x01 | -- | -- | - | - | - | - | - | - | - | - | |
| Read display ID | 0x04 | R | 4 | Dummy | ||||||||
| ID17 | ID16 | ID15 | ID14 | ID13 | ID12 | ID11 | ID10 | |||||
| ID27 | ID26 | ID25 | IF24 | ID23 | ID22 | ID21 | ID10 | |||||
| ID37 | ID36 | ID35 | ID34 | ID33 | ID32 | ID31 | ID30 | |||||
| Read Number of the Errors on DSI | 0x05 | R | 2 | Dummy | ||||||||
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |||||
| Read display status | 0x09 | R | 5 | Dummy | ||||||||
| BSTON | MY | MX | MV | ML | RGB | ST25 | ST24 | |||||
| ST23 | IFPF2 | IFPF1 | IFPF0 | IDMON | PTLON | SLOUT | NORON | |||||
| Vscroll | ST14 | INVON | ALLON | ALLOFF | DISON | TEON | GCS2 | |||||
| GCS1 | GCS0 | TEM | ST4 | ST3 | ST2 | ST1 | ST0 | |||||
| Read display Power | 0x0A | R | 2 | Dummy | ||||||||
| BSTON | IDMON | PTLON | SLPOUT | NORON | DISON | 0 | 0 | |||||
| Read display MADCTL | 0x0B | R | 2 | Dummy | ||||||||
| MY | MX | MV | ML | RGB | DISDL | 0 | 0 | |||||
| Read display Interface Pixel Format | 0x0C | R | 2 | Dummy | ||||||||
| R3 | R2 | R1 | R0 | 0 | D2 | D1 | D0 | |||||
| Read display image | 0x0D | R | 2 | Dummy | ||||||||
| VSSON | 0 | INVON | 0 | 0 | GC2 | GC1 | GC0 | |||||
| Read display signal | 0x0E | R | 2 | Dummy | ||||||||
| TEON | TEM | HSYN | VSYN | PIXCLK | DATEN | 0 | DSIER | |||||
| Read display self-diagnostic result | 0x0F | R | 2 | Dummy | ||||||||
| D7 | D6 | 0 | 0 | 0 | 0 | 0 | D0 | |||||
| Sleep in | 0x10 | -- | -- | - | - | - | - | - | - | - | - | |
| Sleep out | 0x11 | -- | -- | - | - | - | - | - | - | - | - | |
| Partial mode on | 0x12 | -- | -- | - | - | - | - | - | - | - | - | |
| Partial mode off | 0x13 | -- | -- | - | - | - | - | - | - | - | - | |
| Display inversion off | 0x20 | -- | -- | - | - | - | - | - | - | - | - | |
| Display inversion in | 0x21 | -- | -- | - | - | - | - | - | - | - | - | |
| Display off | 0x28 | -- | -- | - | - | - | - | - | - | - | - | |
| Display on | 0x29 | -- | -- | - | - | - | - | - | - | - | - | |
| Column address set 書き込み範囲の列(X軸)の開始・終了アドレスを設定します。 | 0x2A | W | 4 | XStart add1[7:0] | ||||||||
| XStart add2[7:0] | ||||||||||||
| XEend add1[7:0] | ||||||||||||
| XEend add2[7:0] | ||||||||||||
| Row address set き込み範囲の行(Y軸)の開始・終了アドレスを設定します。 | 0x2B | W | 4 | YStart add1[7:0] | ||||||||
| YStart add2[7:0] | ||||||||||||
| YEend add1[7:0] | ||||||||||||
| YEend add2[7:0] | ||||||||||||
| Memory write 指定した範囲に対して、実際のピクセルデータを書き込みます。 | 0x2C | W | n | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
| Memory read | 0x2E | R | 2 | Dummy | ||||||||
| D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |||||
| Partial sart/end address set | 0x30 | W | 4 | Partial start add1 | ||||||||
| Partial start add2 | ||||||||||||
| Partial end add1 | ||||||||||||
| Partial end add2 | ||||||||||||
| Vertical scrolling definition | 0x33 | W | 6 | TFA15 | TFA14 | TFA13 | TFA12 | TFA11 | TFA10 | TFA9 | TFA8 | |
| TFA7 | TFA6 | TFA5 | TFA4 | TFA3 | TFA2 | TFA1 | TFA0 | |||||
| VSA15 | VSA14 | VSA13 | VSA12 | VSA11 | VSA10 | VSA9 | VSA8 | |||||
| VSA7 | VSA6 | VSA5 | VSA4 | VSA3 | VSA2 | VSA1 | VSA0 | |||||
| BFA15 | BFA14 | BFA13 | BFA12 | BFA11 | BFA10 | BFA9 | BFA8 | |||||
| BFA7 | BFA6 | BFA5 | BFA4 | BFA3 | BFA2 | BFA1 | BFA0 | |||||
| Tearing effect line off | 0x34 | -- | -- | - | - | - | - | - | - | - | - | |
| Tearing effect line on | 0x35 | W | 1 | - | - | - | - | - | - | - | TEM | |
| Memory data access contro 画面の回転(向き)や色の並び(RGB/BGR)を指定します。 | 0x36 | W | 1 | MY | MX | MV | ML | RGB | MH | 0 | 0 | |
| Vertical scrolling start address | 0x37 | W | 2 | VSP15 | VSP14 | VSP13 | VSP12 | VSP11 | VSP10 | VSP9 | VSP8 | |
| VSP7 | VSP6 | VSP5 | VSP4 | VSP3 | VSP2 | VSP1 | VSP0 | |||||
| Idle mode off | 0x38 | -- | -- | - | - | - | - | - | - | - | - | |
| Idle mode on | 0x39 | -- | -- | - | - | - | - | - | - | - | - | |
| Interface pixel format 1ピクセルあたりのビット数(16bit RGB565など)を設定します。 | 0x3A | W | 1 | R3 | R2 | R1 | R0 | 0 | D2 | D1 | D0 | |
| Memory write continue | 0x3C | W | 3 | D17 | D16 | D15 | D14 | D13 | D12 | D11 | D10 | |
| Dx7 | Dx6 | Dx5 | Dx4 | Dx3 | Dx2 | Dx1 | Dx0 | |||||
| Dn7 | Dn6 | Dn5 | Dn4 | Dn3 | Dn2 | Dn1 | Dn0 | |||||
| Memory read continue | 0x3E | R | 4 | Dummy | ||||||||
| D17 | D16 | D15 | D14 | D13 | D12 | D11 | D10 | |||||
| Dx7 | Dx6 | Dx5 | Dx4 | Dx3 | Dx2 | Dx1 | Dx0 | |||||
| Dn7 | Dn6 | Dn5 | Dn4 | Dn3 | Dn2 | Dn1 | Dn0 | |||||
| Set tear scanline | 0x44 | W | 2 | N15 | N14 | N13 | N12 | N11 | N10 | N9 | N8 | |
| N7 | N6 | N5 | N4 | N3 | N2 | N1 | N0 | |||||
| Get scanline | 0x45 | R | 3 | Dummy | ||||||||
| N15 | N14 | N13 | N12 | N11 | N10 | N9 | N8 | |||||
| N7 | N6 | N5 | N4 | N3 | N2 | N1 | N0 | |||||
| Write display brightness | 0x51 | W | 1 | DBV7 | DBV6 | DBV5 | DBV4 | DBV3 | DBV2 | DBV1 | DBV0 | |
| Read display brightness | 0x52 | R | 2 | Dummy | ||||||||
| DBV7 | DBV6 | DBV5 | DBV4 | DBV3 | DBV2 | DBV1 | DBV0 | |||||
| Write CTRL display | 0x53 | W | 1 | 0 | 0 | BCTRL | 0 | DD | BL | 0 | 0 | |
| Read CTRL display | 0x54 | R | 2 | Dummy | ||||||||
| 0 | 0 | BCTRL | 0 | DD | BL | 0 | 0 | |||||
| Write content adaptive brightness control | 0x55 | W | 1 | CECTRL | 0 | CE1 | CE0 | 0 | 0 | C1 | C0 | |
| Read content adaptive brightness control | 0x56 | R | 2 | Dummy | ||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | C1 | C0 | |||||
| Write CABC minimum brightness | 0x5E | W | 1 | CMB7 | CMB6 | CMB5 | CMB4 | CMB3 | CMB2 | CMB1 | CMB0 | |
| Read CABC minimum brightness | 0x5F | R | 2 | Dummy | ||||||||
| CMB7 | CMB6 | CMB5 | CMB4 | CMB3 | CMB2 | CMB1 | CMB0 | |||||
| Read First Checksum | 0xAA | R | 2 | Dummy | ||||||||
| FCS7 | FCS6 | FCS5 | FCS4 | FCS3 | FCS2 | FCS1 | FCS0 | |||||
| Read Continue Checksum | 0xAF | R | 2 | Dummy | ||||||||
| CCS7 | CCS6 | CCS5 | CCS4 | CCS3 | CCS2 | CCS1 | CCS0 | |||||
| Read ID1 | 0xDA | R | 2 | Dummy | ||||||||
| ID17 | ID16 | ID15 | ID14 | ID13 | ID12 | ID11 | ID10 | |||||
| Read ID2 | 0xDB | R | 2 | Dummy | ||||||||
| ID27 | ID26 | ID25 | ID24 | ID23 | ID22 | ID21 | ID20 | |||||
| Read ID3 | 0xDC | R | 2 | Dummy | ||||||||
| ID37 | ID36 | ID35 | ID34 | ID33 | ID32 | ID31 | ID30 | |||||
| Interface Mode Control | 0xB0 | W | 1 | SPI_EN | 0 | 0 | 0 | VSCP | HSCP | PKP | DEP | |
| Frame Rate Control1 (In Normal Mode/Full Colors) 通常モード時のフレームレート(リフレッシュ速度)を調整します。 | 0xB1 | W | 2 | FRS[3:0] | 0 | 0 | DIVA[1:0] | |||||
| 0 | 0 | 0 | RTNA[4:0] | |||||||||
| Frame Rate Control2 (In Idle Mode/8 colors) | 0xB2 | W | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 0 | 0 | 0 | RTNB[4:0] | |||||||||
| Frame Rate Control3 (In Partial Mode/Full colors) | 0xB3 | W | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 0 | 0 | 0 | RTNC[4:0] | |||||||||
| Display Inversion Control 画面の色の反転方式を設定します。 | 0xB4 | W | 1 | - | - | - | - | - | - | DINV[1:0] | ||
| Blanking Porch Control | 0xB5 | W | 4 | VFP[7:0] | ||||||||
| VBP[7:0] | ||||||||||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||
| HBP[7:0] | ||||||||||||
| Display Function Control 走査方向やインターフェースの動作を制御します。 | 0xB6 | W | 3 | BYPASS | RCM | RM | 0 | PTG[1:0] | PT[1:0] | |||
| 0 | GS | SS | SM | ISC[3:0] | ||||||||
| 0 | 0 | NL[5:0] | ||||||||||
| Entry Mode Set | 0xB7 | W | 1 | EPF[1:0] | 0 | 0 | DSTB | GON | DTE | 0 | ||
| Power Control 1 | 0xC0 | W | 2 | AVDD[1:0] | AVCL[1:0] | 0 | 0 | 0 | 0 | |||
| VGHS [2:0] | 0 | VGLS [2:0] | 0 | |||||||||
| Power Control 2 | 0xC1 | W | 1 | 0 | VRH[6:0] | |||||||
| Power Control 3 | 0xC2 | W | 1 | 1 | 0 | 1 | 0 | SOP[1:0] | GOP[1:0] | |||
| Vcom Control | 0xC5 | W | 1 | 0 | 0 | VCMP[5:0] | ||||||
| Vcom Offset Register | 0xC6 | W | 1 | VMFSEL | 0 | VMF_REG [5:0] | ||||||
| NVM Address/Data | 0xD0 | W | 2 | 0 | 0 | 0 | PROG_ADDR[4:0] | |||||
| PROG_DATA[7:0] | ||||||||||||
| NVM Byte Program Control | 0xD1 | W | 3 | PROGCODE[23:16] | ||||||||
| PROGCODE[15:8] | ||||||||||||
| PROGCODE[7:0] | ||||||||||||
| NVM Status Read | 0xD2 | R | 5 | Dummy | ||||||||
| ID2CNT[3:0] | ID1CNT[3:0] | |||||||||||
| VMFCNT[3:0] | ID3CNT[3:0] | |||||||||||
| BUSY | - | - | - | - | - | - | - | |||||
| - | - | VMF[5:0] | ||||||||||
| Read ID4 | 0xD3 | R | 4 | Dummy | ||||||||
| ID41[7:0] | ||||||||||||
| ID42[7:0] | ||||||||||||
| ID41?[7:0] | ||||||||||||
| Positive Gamma Control 階調表現(ガンマ特性)を微調整し、色味を整えます。 | 0xE0 | W | 14 | V63P[3:0] | V0P[3:0] | |||||||
| 0 | 0 | V1P[5:0] | ||||||||||
| 0 | 0 | V2P[5:0] | ||||||||||
| 0 | 0 | 0 | V4P[4:0] | |||||||||
| 0 | 0 | 0 | V6P[4:0] | |||||||||
| 0 | 0 | J0P[1:0] | V13P[3:0] | |||||||||
| 0 | V20P[6:0] | |||||||||||
| 0 | V36P[2:0] | 0 | V27P[2:0] | |||||||||
| 0 | V43P[6:0] | |||||||||||
| 0 | 0 | J1P[1:0] | V50P[3:0] | |||||||||
| 0 | 0 | 0 | V57P[4:0] | |||||||||
| 0 | 0 | 0 | V59P[4:0] | |||||||||
| 0 | 0 | V61P[5:0] | ||||||||||
| 0 | 0 | V62P[5:0] | ||||||||||
| Negative Gamma Control 階調表現(ガンマ特性)を微調整し、色味を整えます。 | 0xE1 | W | 14 | V63N[3:0] | V0N[3:0] | |||||||
| 0 | 0 | V1N[5:0] | ||||||||||
| 0 | 0 | V2N[5:0] | ||||||||||
| 0 | 0 | 0 | V4P[4:0] | |||||||||
| 0 | 0 | 0 | V6P[4:0] | |||||||||
| 0 | 0 | J0N[1:0] | V13N[3:0] | |||||||||
| 0 | V20N[6:0] | |||||||||||
| 0 | V36N[2:0] | 0 | V27N[2:0] | |||||||||
| 0 | 0 | V43P[5:0] | ||||||||||
| 0 | 0 | J1N[1:0] | V50N[3:0] | |||||||||
| 0 | 0 | 0 | V57N[4:0] | |||||||||
| 0 | 0 | 0 | V59N[4:0] | |||||||||
| 0 | 0 | V61N[5:0] | ||||||||||
| 0 | 0 | V62N[5:0] | ||||||||||
| Digital Gamma Control1 | 0xE2 | W | 64 | RCA00[3:0] | BCA00[3:0] | |||||||
| RCA01[3:0] | BCA01[3:0] | |||||||||||
| :: | ||||||||||||
| :: | ||||||||||||
| RCA62[3:0] | BCA62[3:0] | |||||||||||
| RCA63[3:0] | BCA63[3:0] | |||||||||||
| Digital Gamma Control2 | 0xE3 | W | 64 | RFA00[3:0] | BFA00[3:0] | |||||||
| RFA01[3:0] | BFA01[3:0] | |||||||||||
| :: | ||||||||||||
| :: | ||||||||||||
| RFA62[3:0] | BFA62[3:0] | |||||||||||
| RFA63[3:0] | BFA63[3:0] | |||||||||||
| Display Output CTRL Adjust | 0xE8 | W | 8 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | |||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||
| 0 | 0 | 1 | 0 | S_END[3:0] | ||||||||
| 0 | 0 | G_START[5:0] | ||||||||||
| G_EQ | 0 | G_END[5:0] | ||||||||||
| 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | |||||
| Command Set Control | 0xF0 | W | 1 | D[7:0] | ||||||||
| SPI Read Control | 0xFB | W | 1 | 0 | 0 | 0 | SPI_REN | SPI_CNT[3:0] | ||||
1.3 プログラム概容
今回使用するMCUはCH32V203C8T6だが、systemクロックは内部の96MHzとしている。
後に1.5倍早い144MHzでもテストしてみたい。
後に1.5倍早い144MHzでもテストしてみたい。
1.3.1 事前準備 UARTの変更
テスト中 printf( )でデータの異常を見ているが、これはUSART1で使用する事になっている。
しかしMCUのピンを振り分けると,UART4しか使用できなくなった。
(後にUSART1が使用できるようになったが)MounRiver Studio Ⅱのファイルをどのように変更したか記載しておく。
(1)debug.cに追記
(2)debug.hを変更
しかしMCUのピンを振り分けると,UART4しか使用できなくなった。
(後にUSART1が使用できるようになったが)MounRiver Studio Ⅱのファイルをどのように変更したか記載しておく。
(1)debug.cに追記
約210行以下に関係する物が記載されており、UART3の次に書き内容を追記した。
#elif(DEBUG == DEBUG_UART4)
while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);
USART_SendData(UART4, *buf++);
#elif(DEBUG == DEBUG_UART4)
while(USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET);
USART_SendData(UART4, *buf++);
(2)debug.hを変更
約30行近くに記載されている UART1をUART4へ変更する。
/* DEBUG UATR Definition */
#ifndef DEBUG
#define DEBUG DEBUG_UART1
#endif
#define DEBUG DEBUG_UART4
以上でUART4に接続して printf()が使用できるようになった。
/* DEBUG UATR Definition */
#ifndef DEBUG
#define DEBUG DEBUG_UART1
#endif
#define DEBUG DEBUG_UART4
以上でUART4に接続して printf()が使用できるようになった。
1.3.2 初期化
リセットさせ、カラーフォーマットを16bit [190]、メモリアクセス制御[183]、LCD画面の向きなど設定してディスプレーをON[169]にすることで初期化します。
[ ]はST7796Sデータシート Version V1.0 2014/11 の掲載ページです。
なお初期化方法についてはデータシートにはライブラリを参照するように記載されている。
詳細については『3.95inch_Arduino_Mega2560_8&16BIT_Module_ST7796S_MAR3953_V1.0』の『Demo_STM32』にある『lcd.c』の初期化も参考になると思う。
上記のファイルについては、LCDWIKIにあるので探してほしい
関数名は
void Set_Init (void)
MCUのI/O初期化とLCDの初期化をしています。
[ ]はST7796Sデータシート Version V1.0 2014/11 の掲載ページです。
なお初期化方法についてはデータシートにはライブラリを参照するように記載されている。
詳細については『3.95inch_Arduino_Mega2560_8&16BIT_Module_ST7796S_MAR3953_V1.0』の『Demo_STM32』にある『lcd.c』の初期化も参考になると思う。
上記のファイルについては、LCDWIKIにあるので探してほしい
関数名は
void Set_Init (void)
MCUのI/O初期化とLCDの初期化をしています。
1.3.3 LCDの基本アクセス方法
LCDの制御と表示は
RD,CS,RST,WR,RSの信号線とDB0〜DB7に値を入れる事により制御、表示している。
先に説明の1.1.3や1.1.4を参照ください。
RD,CS,RST,WR,RSの信号線とDB0〜DB7に値を入れる事により制御、表示している。
先に説明の1.1.3や1.1.4を参照ください。
| RD (Read) 読み取り信号 | 液晶コントローラからデータを読み出す際に使用します。このピンを「Low」にすることで、液晶内のレジスタ値やグラフィックデータがデータバスに出力されます。 |
| CS (Chip Select) チップセレクト信号 | モジュールを有効にするための信号です。このピンを「Low」にすると、モジュールがコマンドやデータを受け付けられる状態になります。 |
| RST (Reset) リセット信号 | モジュールを初期状態に戻すための信号です。電源投入時や動作が不安定になった際に、このピンを一定時間「Low」にすることでハードウェアリセットをかけます。 |
| WR (Write) 書き込み信号 | 液晶にデータを書き込む際に使用します。このピンが「High」から「Low」に立ち下がる、あるいは「Low」から「High」に立ち上がるタイミングで、データバス上の値が液晶コントローラに取り込まれます。 |
| RS (Register Select) レジスタ選択信号 |
送っているデータが「制御コマンド」なのか「表示データ(パラメータ)」なのかを区別します。 一般的に、RS=0 でコマンド、RS=1 でデータとして扱われます。製品によっては D/C (Data/Command) と表記されることもあります。 |
1.3.4 モジュールの書込信号
(1)基本シーケンス (※60P)
※はSitronix ST7796S Datasheet VersionV1.0のページ
①ホスト(信号を送る側)は、WDX信号が「立ち下がる(ONからOFFになる)」瞬間に、データ(D lines)を準備して流し始めます。
②ディスプレイ(受け取る側)は、WRX信号が「立ち上がる(OFFからONに戻る)」瞬間に、そのデータを読み取ります。
③読み取りが終わると、ホストはデータの送出を終了します。
プログラム例(CH32V203C8T6)
共通
基本シーケンス分
(2)データ送信シーケンス(※61P)
プログラム例(CH32V203C8T6)
※はSitronix ST7796S Datasheet VersionV1.0のページ
①ホスト(信号を送る側)は、WDX信号が「立ち下がる(ONからOFFになる)」瞬間に、データ(D lines)を準備して流し始めます。②ディスプレイ(受け取る側)は、WRX信号が「立ち上がる(OFFからONに戻る)」瞬間に、そのデータを読み取ります。
③読み取りが終わると、ホストはデータの送出を終了します。
プログラム例(CH32V203C8T6)
共通
基本シーケンス分
(2)データ送信シーケンス(※61P)
|
ホスト→ディスプレイに送るものは インデックスだけ インデックス+1パラメータ インデックス+複数のパラメータ(ピクセルデータ)になる。
|
今回はデータBusが8bitで、カラーが65Kなのでピクセルデータは下記の様になる。
|
1.3.5 モジュールの読込信号
(1)基本シーケンス (※73P)
①ディスプレイ(信号を送る側)は、RDX信号が「立ち下がる(ONからOFFになる)」瞬間に、データ(D lines)を準備して流し始めます。
②ホスト(受け取る側)は、RDX信号が「立ち上がる(OFFからONに戻る)」瞬間に、そのデータを読み取ります。
③読み取りが終わると、ディスプレイはデータの送出を終了します。
基本シーケンス分
(2)データ送信シーケンス(※73P)
プログラム例(CH32V203C8T6)
①ディスプレイ(信号を送る側)は、RDX信号が「立ち下がる(ONからOFFになる)」瞬間に、データ(D lines)を準備して流し始めます。②ホスト(受け取る側)は、RDX信号が「立ち上がる(OFFからONに戻る)」瞬間に、そのデータを読み取ります。
③読み取りが終わると、ディスプレイはデータの送出を終了します。
基本シーケンス分
(2)データ送信シーケンス(※73P)
|
ホスト→ディスプレイに送るものは コマンド+1パラメータ コマンド+複数のパラメータ(ディスプレイデータ)になる。
|
今回はデータBusが8bitで、カラーが65Kなのでピクセルデータは下記の様になる。
|
1.3.6 描画範囲指定
描く範囲を指定する。
関数名
void Lcd_SetAddress (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
x1:描画する左上のX軸ポイント
y1:描画する左上のy軸ポイント
x2:描画する右下のX軸ポイント
y2:描画する右下のY軸ポイント
関数名
void Lcd_SetAddress (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) {
x1:描画する左上のX軸ポイント
y1:描画する左上のy軸ポイント
x2:描画する右下のX軸ポイント
y2:描画する右下のY軸ポイント
1.3.7 ドットを描く
色データ(16bit RGB565形式)の送信は MAR3953とのデータバス接続が 8ビットなので上位Byte,下位Byteの2回に分けて送信する。
関数名
void Lcd_DrawPoint (uint16_t x, uint16_t y, uint16_t color)
x1:描画する左上のX軸ポイント
y1:描画する左上のy軸ポイント
colir:描画するカラー16bit値
関数名
void Lcd_DrawPoint (uint16_t x, uint16_t y, uint16_t color)
x1:描画する左上のX軸ポイント
y1:描画する左上のy軸ポイント
colir:描画するカラー16bit値
1.3.8 矩形を塗りつぶす
Lcd_DrawPoint (x,y,color);を使って塗りつぶせばよいが、GRAMの範囲設定は1ドット毎に出す必要がなく、矩形の場合最初にGRAMの範囲設定をすれば良いので、下記の様な関数を作成した。
関数名
void Lcd_Fill (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t bColor)
x1:描画する左上のX軸ポイント
y1:描画する左上のy軸ポイント
x2:描画する右下のX軸ポイント
y2:描画する右下のY軸ポイント
colir:描画するカラー16bit値
関数名
void Lcd_Fill (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t bColor)
x1:描画する左上のX軸ポイント
y1:描画する左上のy軸ポイント
x2:描画する右下のX軸ポイント
y2:描画する右下のY軸ポイント
colir:描画するカラー16bit値
1.3.9 直線を描く
X軸やY軸上の水平・垂直線を描く場合は矩形の塗りつぶしの様に、GRAMの範囲指定は1回で済む。
ただし斜線の場合は Lcd_DrawPoint (x, y, color);を使用して(都度GRAMの範囲指定もして)点を描き斜線を描いている。
下記関数は内部で水平・垂直線と斜線を区別して処理している。 関数名
void LcdStraightLine (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
x1:描画する左上のX軸ポイント
y1:描画する左上のy軸ポイント
x2:描画する右下のX軸ポイント
y2:描画する右下のY軸ポイント
colir:描画するカラー16bit値
下記関数は内部で水平・垂直線と斜線を区別して処理している。 関数名
void LcdStraightLine (uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color)
x1:描画する左上のX軸ポイント
y1:描画する左上のy軸ポイント
x2:描画する右下のX軸ポイント
y2:描画する右下のY軸ポイント
colir:描画するカラー16bit値
1.3.10 円を描く
円を描くためにミッチェナーのアルゴリズムを使っている。
ラスタディスプレイ(ピクセルで構成された画面)上に円(円周)を高速かつ正確に描画するための手法です。
(1) 特徴とメリット
(2) アルゴリズムの原理
(3) ブレゼンハムのアルゴリズムとの関係
(4) 応用
ラスタディスプレイ(ピクセルで構成された画面)上に円(円周)を高速かつ正確に描画するための手法です。
(1) 特徴とメリット
高速描画(整数演算のみ): 乗算や浮動小数点演算(小数計算)を使用せず、加減算とビットシフト(2倍)だけで描画できるため、計算処理が非常に高速です。
高品質な円 理想的な円の描画式 (X2+Y2 = r2) を基に、ピクセル中心がもっとも真の円に近い位置を選択するため、ギザギザ(エイリアシング)の少ない綺麗な円を描画できます。
計算の簡素化 ブレゼンハムのアルゴリズムよりも、判定式がシンプルに定式化されています。
高品質な円 理想的な円の描画式 (X2+Y2 = r2) を基に、ピクセル中心がもっとも真の円に近い位置を選択するため、ギザギザ(エイリアシング)の少ない綺麗な円を描画できます。
計算の簡素化 ブレゼンハムのアルゴリズムよりも、判定式がシンプルに定式化されています。
(2) アルゴリズムの原理
円は対称的な図形であるため、第1象限の45°分( X = 0 から x = y になるまで)だけを計算すれば、他の7つの対称位置は符号を反転させることで描画できます(8分割描画)。
① 初期設定: 始点を( 0 , r )とする。
② 判定式: 次のピクセル(右、または右下)を選択する際、真の円の半径との二乗誤差に基づいた判定式 d を使用します。
③ ループ処理: x を1ずつ増やしながら、判定式 d の符号に応じて y の値を更新(減らすか維持)します。
④ 対称描画: 算出した点( x , y ) を、(x,y).(-x,y),(x,-y),(-x,-y),(y,x),(-y,x),(x,-y),(-x,-y) の8箇所にプロットします。
① 初期設定: 始点を( 0 , r )とする。
② 判定式: 次のピクセル(右、または右下)を選択する際、真の円の半径との二乗誤差に基づいた判定式 d を使用します。
③ ループ処理: x を1ずつ増やしながら、判定式 d の符号に応じて y の値を更新(減らすか維持)します。
④ 対称描画: 算出した点( x , y ) を、(x,y).(-x,y),(x,-y),(-x,-y),(y,x),(-y,x),(x,-y),(-x,-y) の8箇所にプロットします。
(3) ブレゼンハムのアルゴリズムとの関係
ミッチェナーのアルゴリズムは、しばしば「ブレゼンハムのアルゴリズム」と同一視、またはそのバリエーションとして扱われます。基本的には、円の描画において整数演算のみを用いる「中点円描画アルゴリズム」の一種に分類されます。
(4) 応用
かつて描画速度が重要だった時代によく利用されていました。現代でも、組み込みシステムや高速描画が求められるライブラリの低レイヤー部分で用いられる手法です。
関数名
void Lcd_DrawCircle (uint16_t x0, uint16_t y0, uint8_t r, uint16_t color)
x0:描画する中心のX軸ポイント
y0:描画する中心のy軸ポイント
r:描画する半径
colir:描画するカラー16bit値
関数名
void Lcd_DrawCircle (uint16_t x0, uint16_t y0, uint8_t r, uint16_t color)
x0:描画する中心のX軸ポイント
y0:描画する中心のy軸ポイント
r:描画する半径
colir:描画するカラー16bit値
1.3.11 信号線描画
受信機を作成する場合に信号強度などを表す線が必要となったので、最初に紹介した線も描くようにしてみた。
入力値は0~127、表示している幅128となっている。
信号強度等はできるだけ早く描く必要があるので、信号値による色は計算せず事前に128個に2種類(Color HiByet,LoByet)の配列に記録した。
これはまだ使用する関数ではなく、テスト用なため、将来引数は変更になる可能性大!
バーの高さは5になっている。
関数名は
void LcdMeter(uint8_t Strength,uint16_t lcy)
Strength:信号の値
lcy:描画する左上のy軸ポイント
入力値は0~127、表示している幅128となっている。
信号強度等はできるだけ早く描く必要があるので、信号値による色は計算せず事前に128個に2種類(Color HiByet,LoByet)の配列に記録した。
これはまだ使用する関数ではなく、テスト用なため、将来引数は変更になる可能性大!
バーの高さは5になっている。
関数名は
void LcdMeter(uint8_t Strength,uint16_t lcy)
Strength:信号の値
lcy:描画する左上のy軸ポイント
