スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PSoCLP5でカラーグラフィックLCDパネルを表示してみる。(実践編1 8bitインターフェース)

以前の記事、カラーグラフィックLCDパネルを表示してみる。にて、Aitendoで今販売されている★特売品★2.4インチ液晶 with 基板 [L024AC-2P]を8bitモード、16bitモードで作動させる比較対象な動画を上げてみました。

記事中にも書いてある通り、現在秋月電子で販売されているPSoC 5LP Prototyping Kitを使いました。
このPSoC 5LP Prototyping Kit、他Duino系のMCU EVALボードと同じでI/O保護など回路を省き、簡素化されてはいるものの、書き込み器で有るKitProg部分と、本体であるターゲットボード部分にそれぞれPSoC5LPが搭載されています。Digikeyなどで、単純にMCUだけを購入する価格よりも、かなりお安くPSoC5LPをお試しすることが出来ます。

このPSoC5LP、他MCUとの大きな違いはPLDを内蔵し、MCUのバスに繋がってること。もちろんPLD部分をMCUと独立した回路としても使用可能なので、MCUを使いはじめる時にするLチカ、も、このPLD部分のみを使いほとんどコードの記述をせずとも、ハードウエア回路として作ることが出来ます。もちろんMCU部分を使っての記述もOk。
それと、PSoC 5LP Prototyping Kitでは、I/O部分の電源電圧が全て繋がっているので全て5Vor3.3Vにしか設定出来ませんが、PSoC5LP自体はI/Oバンクごとの電源電圧を変更することにより1つのMCUで違ったI/Oの電圧を入出力出来たりします。

I/O 部分はCPLDやFPGAの様に、特にデジタル入出力は特定の機能ピン以外、指定することが出来ます。MCUのみしか使ったことがない方には、このCPLDやFPGAを使うようなピン指定や回路図による、入出力ピンや、機能ブロックの配置、配線は面倒な物に感じるかもしれませんが、用意されているハードウエア機能ブロックを使えばFPGA、CPLDのソレよりも遥かに簡単にハードウエアを実装出来ます。また、用意されている機能ブロックは、MCUと独立してハードウエア接続のみで完結できますが、用意されているハードウエア機能ブロックをMCUから操作出来るようにAPIが用意してあり、MCUのソフトウエア側から操作出来ます。

と、ゆうことは、、、試してませんが5V駆動としてこのPLD部分を使う、と、LinuxCNCなどのパラレルポートを入出力を行うNCコントローラーなど、このPSoCLP5をほぼパラレルポートと直結とし、リミットスイッチなどのチャタリング対策のデバウンスを間に挟んだり、ステッパコントロール用のStep/Dir信号をモニタしたり、、、とかなり面白い使い方が出来るのでは?と。。

ただ、残念なことにメーカーご謹製のとても使いやすいIDE、PSoC Creator自体がWindows環境下でないと動かないのはちょっと痛い所、、。。

今回はPSoC Creator3.1を使いました。



ではでは、比較的改造?の少ない液晶のパネル、基板には手を付けない8bitパラレル入力から。

今回使ったILI9325Cを液晶コントローラーインターフェースとして使用するTFT液晶モジュール [CP2401T-C]は、aitendoの商品ページに有るデータシートによると5Vでは駆動出来ず、3.3V程度での駆動を想定しているようなので、液晶基板を組み立てる際、付属する抵抗を使用せず、ジャンパします。

IMG_2323.jpg


PSoC 5LP Prototyping Kitの方はそのままではUSBからの給電で5Vでの作動となってしまうので、書き込み器側のダイオードD1を取り外し(ズラし)KitProg側からの5V電源VTARGを切ります。

IMG_2324.jpg
貧乏性なので、ダイオードは完全に取り外さないで接続を切ってあるだけ、、なのは内緒w


また、ターゲットボード側はLDOなり何なりで3.3Vを作り出し、ターゲット側のVDDへ給電します。これで3.3V駆動となります。

秋月で売ってる5Vのスイッチング電源(こんなようなの)に、手持ちのLD1117-3.3を使いました。同じく秋月で扱っている低損失三端子レギュレーター 3.3V800mA NJM2845DL1-33 4個入とかを使ってもよいでしょう。

超小型スイッチングACアダプター3.3V2A 100V~240V GF12-US03320とか、私は持ってないのでアレですけど、直結でイケる、の、か???

ついでに秋月でこのようなタクトスイッチを購入し、ターゲットボードのリセットスイッチ取り付け部分に取り付けておくと良いかも。
タクトスイッチ(黒)
タクトスイッチ(白)


PSoC Creatorを立ち上げて、使用するデバイス、CY8C5888LTI-LP97を指定して、新規ワークスペース新規プロジェクトを作ります。
PSoC Creatorの使い方等は「うだうだ電子工作」や、他サイトを参考に。。

右側のWorkspaceExplorerからTopDesign.cyschを選択して開きます。
左側のComponentCatalog内のフォルダ、Displayの中からGraphicLCD8-bitInterfaceMacroを回路図上にクリック-ドラッグ-ドロップ。
あと、Ports and Pinsフォルダから、DigitalOutputPinも一つ、クリックードラッグードロップ

必要な部品はこれだけ。

回路図上のGraphicLCDIntfをダブルクリックすると、グラフィックLCDインターフェースの設定ウインドウが開きます。この設定ウインドウ左下のDatasheetをクリックすると、このブロックの説明が書かれたデータシートがPDFにて表示されます。基本、このボタンを押して出てくるデータシートは英語なのですが、ブロックのバージョンが古いかもですが、PSoC コンポーネント名で検索するとCypressのサイト内のコンポーネントの説明サイト内下に日本語に翻訳されたデータシートが出てくる場合もあります。

ちなみに日本語のGraphic LCD Interface (GraphicLCDIntf)ページ下部に詳細が書かれた日本語のPDFへのリンクがあります。

このデータシート内のILI9325の設定数値をグラフィックLCDの初期設定に入力します。

P000.jpg

P001.jpg

設定が終了したらOkをクリックしてウインドウを閉じます。

次にPin_1をダブルクリックし、設定ウインドウを開きます。

P002.jpg

設定はソフトウエア側から操作する為、HW connectionのチェックボックスのチェックを外します。あと、右側に有るInitial drive StateをHigh(1)に。
多分他の設定は大丈夫だと思います。色々とタブが有るので、Pinsのデータシートと照らし合わせながら見てみると、細く設定できることがわかると思います。

次に左側WorkspaceExplorer内の .cydwrの拡張子付いたファイルを開きます。

P003.jpg

このウインドウ内下部のPinにて、使用するピンを実際のPSoC5LPに割り当てます。ここで注意が必要なのは、このPSoC 5LP Prototyping Kit、ユーザーLEDと、ユーザースイッチ、あとADC使用時に使う端子にコンデンサがついてたりするので、避けます。また、ピンが足らない状況になった場合などで、機能として使わない場合、コンデンサをズラして、通常のI/Oとしての使用も可能です。

P004.jpg

配線の都合の良い用に、配置します。

次に今のウインドウ内下部のclockタブを開きます。
文字の何も書いてない(他の所でも良いが、、)ところをダブルクリックするとシステムクロックの設定画面が開きます。

この中のPLLのDesiredを60MHzにします。テキトーです。
P005.jpg

OKを押し、ウインドウを閉じます。

今度は、同じウインドウ内の下部タブSystemをクリックし、Systemの設定をします。
赤丸で囲ってある所を供給電圧と同じ3.3に変更します。
P006.jpg

実際の所、この電圧の設定、5Vのままでも動いてしまいますが、一応設定出来る所があるので設定しておきます。

これでPSoC5LPのハードウエア側の設定は終わりです。
P007.jpg

とりあえず、プログラムのソースコードを書く前に上記画像のビルドボタンを押して、プログラム内のハードウエアの設定と、プログラム内で使うAPIの生成を行います。
プログラムのソースコードを書いてる間でも、ハードウエア部分を触ったらこのビルドボタンを押して、API(アプリケーションプログラムインターフェース)を生成し直します。そうでないと、オート入力可能なテキストエディタなので、関数等のコマンドが自動で出てきませんし、エラーっぽい表示がなされてしまいます。これ記述を間違えない様にするの大事です。。


次は実際のLCDパネルとPSoC基板の結線です。
8bitモードそのままで、LCDパネルのバックライトの抵抗をジャンパとし3.3V駆動としてあればそれ以上液晶基板自体を触ることは有りません。あとは、8本のデータ線と電源線、5本の制御線を繋ぐだけです。

PSoCクリエーター  特売液晶基板

  d[7:0]        DB0 ~DB7
  d_c          RS
  ncs          CS
  nrd          RD
  nwr          WR
  Pin_1         RST

と繋ぎます。
あとはGND、VCC(+3.3V)、LEDA(+3.3V)を繋ぎます。

このPSoCクリエーター側のnの付いたもの、は、信号がないときにHighとなる反転であるとゆうことです。アクティブLowですよ。ってことの印です。nを取るとLCDパネル基板のシルク印刷通りですね。

また、Pin1を一つ使いましたがGraphicLCDインターフェースマクロでは、LCDパネルのリセット信号をサポートしていないので通常のGPIOとして設定し、RST信号を操作します。

配線が済んだところで次はプログラムです。

WorkspaceExplorerのプロジェクト内のソースからmain.cをダブルクリックして開きます。

回路図の所で見たグラフィックLCDインターフェースのデータシートから、まずグラフィックLCDインターフェースをスタートする関数

GraphicLCDIntf_1_Start();

を実行します。APIとゆうか、関数はPSoCクリエーターが生成したもので、その関数のソースコードは右側のWorkspaceExplorer内にあります。

その後、ILI9325の初期設定をするのですが、このILI9325、実は16bitモードが基本で、ラッチを使って8bitモードに対応しています。
PSoC5LP側の出力と、ILI9325側の入力を8bitとしましたので、コマンド、データ共々、8bitを2回に分けて送信します。

void ILI9325_Write(uint16 cmd,uint16 data)
{
GraphicLCDIntf_1_Write8(0,(uint8)(cmd>>8));
GraphicLCDIntf_1_Write8(0,(uint8)(cmd & 0xff));
GraphicLCDIntf_1_Write8(1,(uint8)(data >> 8));
GraphicLCDIntf_1_Write8(1,(uint8)(data & 0xff));


この関数に16bit幅のコマンドと、データを送ると双方8bitを2回ずつの通信で、16bit幅のコマンドとデータを送信します。
データ自体は桁数の高い方の8bitを送り、次に低い方の8bitを送ります。
PSoC側のLCDインターフェースにMCUから8bitのデータを送るのはGraphicLCDIntf_1_Write8とゆう関数で、最初の数値でコマンドかデータかを指定して、次に送るデータを入れます。

コマンドのみ、データのみを送る関数も作っておきます。これは、コマンドを送ってからデータを次々に送ることが出来るので、その時に使います。

void TFT_WriteCMD(uint16_t cmd)
{
GraphicLCDIntf_1_Write8(0,(uint8)(cmd>>8));
GraphicLCDIntf_1_Write8(0,(uint8)(cmd & 0xff));
}

void TFT_WriteData(uint16_t data)
{
GraphicLCDIntf_1_Write8(1,(uint8)(data>>8));
GraphicLCDIntf_1_Write8(1,(uint8)(data & 0xff));
}

ILI9325Cは双方向の通信が可能、ですが、送信のみでも表示することができます。
表示器なので、あまりILI9325Cからデータを読み込む事も無いであろうと勝手に判断、送信のみでの表示です。
MCU側が3.3V駆動であればほぼ直結、オシロを見て信号に乱れがある場合はダンピング抵抗をかます程度で良いのですが、MCUが5V駆動の場合、双方向のインターフェースとせねばならぬのでレベル変換だけでも16bitモードだと少なくとも16本の双方向の通信が必要になります。レベル変換ICは通常のレベル変換可能なロジックICよりチョコっとお高めなので、それならば入手性が高くお安いロジックICで、双方向でないレベル変換で、と。。

このLCDパネルの初期化コードは販売しているaitendoのパネルの商品ページ内初期化コードとゆうところにあります。厳密にゆうと、この初期化コードはサンプルでしかないので、細々とした設定変更はILI9325Cのデータシートに英語ですが、詳しく書かれています。

とりあえず、の駆動の為に、この初期化コードをベタ張りし、使用します。

先に使わせていただいたCypressDeveloperCommunity内のSPI TFT Color LCD240x320 +SDとゆうスレッド内に有ったSPI通信のILI9341用のライブラリを流用し、その他作画ルーチンはライブラリを使用しました。

ただ、ソコに有るものは、ライセンス的に??で有るため、とりあえずの作動確認用のmain.cを貼り付けておきます。




/* ========================================

main.c
ILI9325 8bitmode

* ========================================
*/
#include
#include

#define ENDCOL 240 // X
#define ENDROW 320 // Y

#define WHITE 0xFFFF
#define BLACK 0x0000
#define RED 0xF800
#define GREEN 0x07E0
#define BLUE 0x001F
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define BROWN 0x8000
#define ORANGE 0xFC00
#define PERPLE 0x8010
#define COBALT 0x041F

void TFT_Initial(void);
void TFT_WriteCMD(uint16_t cmd);
void TFT_WriteData(uint16_t data);
void ILI9325_Write(uint16 cmd,uint16 data);
void TFT_SetCol(uint16_t StartCol,uint16_t EndCol);
void TFT_SetPage(uint16_t StartPage,uint16_t EndPage);
void TFT_ClearScreen(void);
void TFT_ClearScreen_Color(uint16_t color);
void TFT_SetXY(uint16_t poX, uint16_t poY);
void TFT_SetPixel(uint16_t poX, uint16_t poY,uint16_t color);
void TFT_FillRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width, uint16_t color);
void TFT_DrawHorizontalLine( uint16_t poX, uint16_t poY, uint16_t length,uint16_t color);
void TFT_DrawLine( uint16_t x0,uint16_t y0,uint16_t x1, uint16_t y1,uint16_t color);
void random_line(void) ;


int main()
{

/* Place your initialization/startup code here (e.g. MyInst_Start()) */

GraphicLCDIntf_1_Start();

TFT_Initial();

/* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
for(;;)
{
/* Place your application code here. */



TFT_ClearScreen();
TFT_ClearScreen_Color(WHITE);
TFT_ClearScreen_Color(BLUE);
TFT_ClearScreen_Color(GREEN);
TFT_ClearScreen_Color(RED);
TFT_ClearScreen_Color(YELLOW);
TFT_FillRectangle(50,50,100,100,GREEN);
random_line();

}
}




void TFT_Initial(void)
{

Pin_1_Write(1);
CyDelay(5);
Pin_1_Write(0);
CyDelay(20);
Pin_1_Write(1);
CyDelay(50);

// ILI9325_Write(0x0000, 0x005e); // Set internal timing
// ILI9325_Write(0x0078, 0x00f0);
//************* Start Initial Sequence **********//
ILI9325_Write(0x0001, 0x0100); // set SS and SM bit
ILI9325_Write(0x0002, 0x0200); // set 1 line inversion
ILI9325_Write(0x0003, 0x1030); // set GRAM write direction and BGR=1.
ILI9325_Write(0x0004, 0x0000); // Resize register
ILI9325_Write(0x0008, 0x0207); // set the back porch and front porch
ILI9325_Write(0x0009, 0x0000); // set non-display area refresh cycle ISC[3:0]
ILI9325_Write(0x000A, 0x0000); // FMARK function
ILI9325_Write(0x000C, 0x0000); // RGB interface setting
ILI9325_Write(0x000D, 0x0000); // Frame marker Position
ILI9325_Write(0x000F, 0x0000); // RGB interface polarity
//*************Power On sequence ****************//
ILI9325_Write(0x0010, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB
ILI9325_Write(0x0011, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0]
ILI9325_Write(0x0012, 0x0000); // VREG1OUT voltage
ILI9325_Write(0x0013, 0x0000); // VDV[4:0] for VCOM amplitude
CyDelay(200); // Dis-charge capacitor power voltage
ILI9325_Write(0x0010, 0x1690); // SAP, BT[3:0], AP, DSTB, SLP, STB
ILI9325_Write(0x0011, 0x0227); // R11h=0x0221 at VCI=3.3V, DC1[2:0], DC0[2:0], VC[2:0]
CyDelay(50); // Delay 50ms
ILI9325_Write(0x0012, 0x008C); // External reference voltage= Vci;
CyDelay(50); // Delay 50ms
ILI9325_Write(0x0013, 0x1700); // VDV[4:0] for VCOM amplitude // 0x1D00
ILI9325_Write(0x0029, 0x002C); // VCM[5:0] for VCOMH // 0x0035
ILI9325_Write(0x002B, 0x000D); // Frame Rate = 93Hz
CyDelay(50); // Delay 50ms
ILI9325_Write(0x0020, 0x0000); // GRAM horizontal Address
ILI9325_Write(0x0021, 0x0000); // GRAM Vertical Address
// ----------- Adjust the Gamma Curve ----------//
ILI9325_Write(0x0030, 0x0000);
ILI9325_Write(0x0031, 0x0507);
ILI9325_Write(0x0032, 0x0004);
ILI9325_Write(0x0035, 0x0205);
ILI9325_Write(0x0036, 0x0004);
ILI9325_Write(0x0037, 0x0307);
ILI9325_Write(0x0038, 0x0002);
ILI9325_Write(0x0039, 0x0707);
ILI9325_Write(0x003C, 0x0502);
ILI9325_Write(0x003D, 0x0005);
//------------------ Set GRAM area ---------------//
ILI9325_Write(0x0050, 0x0000); // Horizontal GRAM Start Address
ILI9325_Write(0x0051, 0x00EF); // Horizontal GRAM End Address
ILI9325_Write(0x0052, 0x0000); // Vertical GRAM Start Address
ILI9325_Write(0x0053, 0x013F); // Vertical GRAM Start Address
ILI9325_Write(0x0060, 0xA700); // Gate Scan Line
ILI9325_Write(0x0061, 0x0001); // NDL,VLE, REV
ILI9325_Write(0x006A, 0x0000); // set scrolling line
//-------------- Partial Display Control ---------//
ILI9325_Write(0x0080, 0x0000);
ILI9325_Write(0x0081, 0x0000);
ILI9325_Write(0x0082, 0x0000);
ILI9325_Write(0x0083, 0x0000);
ILI9325_Write(0x0084, 0x0000);
ILI9325_Write(0x0085, 0x0000);
//-------------- Panel Control -------------------//
ILI9325_Write(0x0090, 0x0010);
ILI9325_Write(0x0092, 0x0000);
ILI9325_Write(0x0093, 0x0003);
ILI9325_Write(0x0095, 0x0100);
ILI9325_Write(0x0097, 0x0000);
ILI9325_Write(0x0098, 0x0000);
ILI9325_Write(0x0007, 0x0133); // 262K color and display ON
}

//*************************************************************************************
void TFT_WriteCMD(uint16_t cmd)
{
GraphicLCDIntf_1_Write8(0,(uint8)(cmd>>8));
GraphicLCDIntf_1_Write8(0,(uint8)(cmd & 0xff));
}
//*************************************************************************************
void TFT_WriteData(uint16_t data)
{
GraphicLCDIntf_1_Write8(1,(uint8)(data>>8));
GraphicLCDIntf_1_Write8(1,(uint8)(data & 0xff));
}

void ILI9325_Write(uint16 cmd,uint16 data)
{
GraphicLCDIntf_1_Write8(0,(uint8)(cmd>>8));
GraphicLCDIntf_1_Write8(0,(uint8)(cmd & 0xff));
GraphicLCDIntf_1_Write8(1,(uint8)(data >> 8));
GraphicLCDIntf_1_Write8(1,(uint8)(data & 0xff));
}

void TFT_SetCol(uint16_t StartCol,uint16_t EndCol)
{
TFT_WriteCMD(0x0050);/* Column Command address */
TFT_WriteData(StartCol);/* Holizontal Gram Address Set */
TFT_WriteCMD(0x0051);
TFT_WriteData(EndCol);
TFT_WriteCMD(0x0020);
TFT_WriteData(0x0000);
}
//*************************************************************************************
void TFT_SetPage(uint16_t StartPage,uint16_t EndPage)
{
TFT_WriteCMD(0x0052); /* Column Command address */
TFT_WriteData(StartPage); /* Vertical Gram Address Set */
TFT_WriteCMD(0x0053);
TFT_WriteData(EndPage);
TFT_WriteCMD(0x0021);
TFT_WriteData(0x0000);
}

void TFT_ClearScreen(void)
{
uint16_t i=0;
TFT_SetCol(0, ENDCOL);
TFT_SetPage(0, ENDROW);
TFT_WriteCMD(0x0022); /* start to write to display ram */
for(i=0; i<19200; i++)
{
TFT_WriteData(0);
TFT_WriteData(0);
TFT_WriteData(0);
TFT_WriteData(0);
}
}


void TFT_ClearScreen_Color(uint16_t color)
{
uint16_t i=0;
TFT_SetCol(0, ENDCOL);
TFT_SetPage(0, ENDROW);
TFT_WriteCMD(0x0022); /* start to write to display ram*/
for(i=0; i<19200; i++)
{
TFT_WriteData(color);
TFT_WriteData(color);
TFT_WriteData(color);
TFT_WriteData(color);
}
}
//*************************************************************************************
void TFT_SetXY(uint16_t poX, uint16_t poY)
{
ILI9325_Write(0x0020, poX);
ILI9325_Write(0x0021, poY);
TFT_WriteCMD(0x22);
}
//*************************************************************************************
void TFT_SetPixel(uint16_t poX, uint16_t poY,uint16_t color)
{
TFT_SetXY(poX, poY);
TFT_WriteData(color);
}
//*************************************************************************************
void TFT_FillRectangle(uint16_t poX, uint16_t poY, uint16_t length, uint16_t width, uint16_t color)
{
uint16 i;
for (i=0;i TFT_DrawHorizontalLine(poX ,poY+i,length,color);
}
}



//*************************************************************************************
void TFT_DrawHorizontalLine( uint16_t poX, uint16_t poY, uint16_t length,uint16_t color)
{
int i=0;
for(i=0; i {
TFT_SetXY(poX + i ,poY);
TFT_WriteData(color);
}
}


void TFT_DrawLine( uint16_t x0,uint16_t y0,uint16_t x1, uint16_t y1,uint16_t color)
{
int x = x1-x0;
int y = y1-y0;
int dx = abs(x), sx = x0 int dy = -abs(y), sy = y0 int err = dx+dy, e2; /* error value e_xy */
for (;;){ /* loop */
TFT_SetPixel(x0,y0,color);
e2 = 2*err;
if (e2 >= dy) { /* e_xy+e_x > 0 */
if (x0 == x1) break;
err += dy; x0 += sx;
}
if (e2 <= dx) { /* e_xy+e_y < 0 */
if (y0 == y1) break;
err += dx; y0 += sy;
}
}
}

void random_line(void) {


int i,x0,y0,x1,y1;
int randomColour;

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

x0=rand() % 240;
y0=rand() % 320;
x1=rand() % 240;
y1=rand() % 320;

randomColour=(((uint32_t)rand()<<16) | rand()) & 0xffffff;

TFT_DrawLine(x0,y0,x1,y1,randomColour);
}
}




/* [] END OF FILE */





ILI9341用のライブラリとの違いは、コマンドに割り当てられた数値が違うこと。
同一メーカーのグラフィックLCDコントローラーなので、コマンド名は非常に近いです。

送信の順番も、点を書くのであれば上記main.c内の
void TFT_SetXY(uint16_t poX, uint16_t poY)
{
ILI9325_Write(0x0020, poX);
ILI9325_Write(0x0021, poY);
TFT_WriteCMD(0x22);
}
に有るように0x0020とゆうコマンドがx軸の位置指定で、poXがx軸の位置(アドレス)です。
同じようにY軸は0x0021とゆうコマンドがy軸の位置指定で、poYが、y軸の位置(アドレス)です。

なぜ、アドレスと書くのか、、、それは、画面上の1画素がx軸とy軸とゆうアドレスを持ち、何色であるか、とゆうデータを持っているからです。
通常のRAMと同じようにアドレスを指定してデータを書き込んでいます。
画素数が多くなればなるほど、容量の大きなRAMと同じように番地であるデータの桁数が大きくなります。

1画面分塗りつぶすルーチンでは、

void TFT_ClearScreen_Color(uint16_t color)
{
uint16_t i=0;
TFT_SetCol(0, ENDCOL);
TFT_SetPage(0, ENDROW);
TFT_WriteCMD(0x0022); /* start to write to display ra */
/* m */
for(i=0; i<19200; i++)
{
TFT_WriteData(color);
TFT_WriteData(color);
TFT_WriteData(color);
TFT_WriteData(color);
}
}

x軸Y軸共々の始まりの番地と終わりの番地を指定して、あとは、画素数分の色のデータをひたすら書き込んでいます。


一応上記のプログラムでループ部分を書き直せば四角やラインまで書けるはずです。


上記そのままだと、この動画のように。。

グラフィックLCDパネルの制御では、初期化して、点が書けることが一つのマイルストーンなのかな?と思います。

点が書ければ線が書けて、線が書ければ面が書ける。面が書けるとブロックが書けて、ブロックが書けるとフォントが書ける、、と言った具合だと思います。

私自身あまりハンダ付けは得意ではないのですが、とりあえず、のフレキシブル基板のハンダ付けを。。

IMG_2325.jpg

画像がボケておりますが、ベストは実体顕微鏡での位置決めなのですが、そんなものは持ち合わせていないので、セロテープを仮固定用として、位置決めをします。ハンダ付けは下手くそなので、ルーペなどを使い、フレキシブル基板と、基板上のパターンをしっかりと合わせて、セロテープで仮固定をします。しっかりとフラックスを塗り、ハンダゴテ自体は基板上のパターンと、かすかにフレキシブル基板上の端子を温めるようにして、ハンダを流します。フラックスがしっかり効いていれば、ハンダ表面が活性化され、半田自体が多すぎない限り、パターン間、フレキシブル基板上の端子間で半田がブリッジすることはほとんど有りません。なるべく、多数の端子にハンダゴテの小手先が掛かるようにすると、フラックスが効いてる間は、レジスト部分が半田を弾くように、また、パターン上で水の玉のように、半田の量が均質化されます。余分に半田が乗り過ぎたら、基板のパターン側に半田を引き寄せ、半田吸収線や、撚り線の銅線にフラックスを塗ったものとかで吸い取らせます。。できたな、と思ったらルーペ等でブリッジしてないかの確認をします。しっかり検査しましょう。。

スポンサーサイト

テーマ : 自作・改造
ジャンル : コンピュータ

コメントの投稿

非公開コメント

ライセンス
アクセスカウンター
プロフィール

あきらひとし。

Author:あきらひとし。
木工用CNCルーターフレームと、ステッピングモータードライバを作ってみました。
たぶん記事は一般的な人には殆ど必要のない事ばかりなの、かも。

モーターは回るだけでも楽しい。制御(速度、トルク、位置)できるともっと楽しい!

メールフォーム

名前:
メール:
件名:
本文:

リンク
最新記事
カテゴリ
スポンサードリンク
スポンサードリンク 
スポンサードリンク
オンラインカウンター
現在の閲覧者数:
検索フォーム
RSSリンクの表示
最新トラックバック
最新コメント
月別アーカイブ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。