/**************************************************************** * QVGAlcd_HX8347D_lib.c * カラーグラフィックLCD(240x320ドット)用ライブラリ * 横表示で設定 * Glcd_Init(); // 初期化 * Glcd_Clear(); // 全画面消去 * Glcd_Pixel(); // 1ドット表示 * Glcd_Char(); // ANK文字表示 * Glcd_Str(); // ANK文字列表示 * Glcd_Line(); // 直線描画 * Glcd_Circle(); // 円描画 * Glcd_Image(); // イメージ描画 * * 2025/6/16 N.Ishii *****************************************************************/ #include /* PIC32 peripheral library */ #include "QVGAlcd_HX8347D_lib.h" #include "ASCII12dot.h" //ASCII 12x12dot /************************************ * レジスタ設定関数 *************************************/ void WriteComm(unsigned int index) { LCD_CS = 0; // CS Low LCD_RS = 0; // Command //// index上位バイト出力 LATE = ((index>>8) & 0x00FF) | (LATE & 0xFF00); // 注:LATE(RE)ポートは16bitだが出力されているのは下位8bitだけ LCD_WR = 0; // WR out Nop(); LCD_WR = 1; //// index下位バイト出力 LATE = (index & 0x00FF) | (LATE & 0xFF00); LCD_WR = 0; // WR out Nop(); LCD_WR = 1; LCD_CS = 1; // CS Hi } /************************************ * データ出力関数関数 *************************************/ void WriteData(unsigned int data) { LCD_CS = 0; // CS Low LCD_RS = 1; // Data //// index上位バイト出力 LATE = ((data>>8) & 0x00FF) | (LATE & 0xFF00); LCD_WR = 0; // WR out Nop(); LCD_WR = 1; //// index下位バイト出力 LATE = (data & 0x00FF) | (LATE & 0xFF00); LCD_WR = 0; // WR out Nop(); LCD_WR = 1; LCD_CS = 1; // CS Hi } /************************************ * LCD初期化関数 *************************************/ void Glcd_Init(void){ delay_ms(20); LCD_CS = 1; // CS High LCD_WR = 1; // WR High LCD_RESET = 0; // Reset LCD delay_ms(0x1); // 1msec wait LCD_RESET = 1; // Clear RESET delay_ms(25); // 25msec wait //// HX8347D_CM22() WriteComm(0x002E);WriteData(0x0079); // Cycle Control 2:GDOF[7:0]=8'b0111_1001 WriteComm(0x00EE);WriteData(0x000C); // ? //// Driving ability Setting(駆動能力セット) WriteComm(0x00EA);WriteData(0x0000); // PTBA[15:8] WriteComm(0x00EB);WriteData(0x0020); // PTBA[7:0] WriteComm(0x00EC);WriteData(0x0008); // STBA[15:8] WriteComm(0x00ED);WriteData(0x00C4); // STBA[7:0] WriteComm(0x00E8);WriteData(0x0040); // OPON[7:0] WriteComm(0x00E9);WriteData(0x0038); // OPON1[7:0] WriteComm(0x00F1);WriteData(0x0001); // OTPS1B WriteComm(0x00F2);WriteData(0x0010); // GEN WriteComm(0x0027);WriteData(0x00A3); // Display Control 2: PT[1:0]=10 PTV[1:0]=10 [PTG]=1 [REF]=1 //// Gamma 2.2 Setting WriteComm(0x0040);WriteData(0x0000); // r1 Control(1) WriteComm(0x0041);WriteData(0x0000); // r1 Control(2) WriteComm(0x0042);WriteData(0x0001); // r1 Control(3) WriteComm(0x0043);WriteData(0x0012); // r1 Control(4) WriteComm(0x0044);WriteData(0x0010); // r1 Control(5) WriteComm(0x0045);WriteData(0x0026); // r1 Control(6) WriteComm(0x0046);WriteData(0x0008); // r1 Control(7) WriteComm(0x0047);WriteData(0x0053); // r1 Control(8) WriteComm(0x0048);WriteData(0x0002); // r1 Control(9) WriteComm(0x0049);WriteData(0x0015); // r1 Control(10) WriteComm(0x004A);WriteData(0x0019); // r1 Control(11) WriteComm(0x004B);WriteData(0x0019); // r1 Control(12) WriteComm(0x004C);WriteData(0x0016); // r1 Control(13) WriteComm(0x0050);WriteData(0x0019); // r1 Control(18) WriteComm(0x0051);WriteData(0x002F); // r1 Control(19) WriteComm(0x0052);WriteData(0x002D); // r1 Control(20) WriteComm(0x0053);WriteData(0x003E); // r1 Control(21) WriteComm(0x0054);WriteData(0x003F); // r1 Control(22) WriteComm(0x0055);WriteData(0x003F); // r1 Control(23) WriteComm(0x0056);WriteData(0x002C); // r1 Control(24) WriteComm(0x0057);WriteData(0x0077); // r1 Control(25) WriteComm(0x0058);WriteData(0x0009); // r1 Control(26) WriteComm(0x0059);WriteData(0x0006); // r1 Control(27) WriteComm(0x005A);WriteData(0x0006); // r1 Control(28) WriteComm(0x005B);WriteData(0x000A); // r1 Control(29) WriteComm(0x005C);WriteData(0x001D); // r1 Control(30) WriteComm(0x005D);WriteData(0x00CC); // r1 Control(35) //// Power Voltage Setting WriteComm(0x001B);WriteData(0x001B); //VRH=4.65V WriteComm(0x001A);WriteData(0x0001); //BT (VGH~15V);(VGL~-10V);(DDVDH~5V) WriteComm(0x0024);WriteData(0x002F); //VMH(VCOM High voltage ~3.2V) WriteComm(0x0025);WriteData(0x0057); //VML(VCOM Low voltage -1.2V) //// VCOM offset WriteComm(0x0023);WriteData(0x0097); //for Flicker adjust //can reload from OTP //// Power on Setting WriteComm(0x0018);WriteData(0x0036); //I/P_RADJ);(N/P_RADJ);( Normal mode 75Hz WriteComm(0x0019);WriteData(0x0001); //OSC_EN='1');( start Osc WriteComm(0x0001);WriteData(0x0000); //DP_STB='0');( out deep sleep WriteComm(0x001F);WriteData(0x0088);// GAS=1);( VOMG=00);( PON=0);( DK=1);( XDK=0) delay_ms(5); WriteComm(0x001F);WriteData(0x0080);// GAS=1);( VOMG=00);( PON=0);( DK=0);( XDK=0);( delay_ms(5); WriteComm(0x001F);WriteData(0x0090);// GAS=1);( VOMG=00);( PON=1);( DK=0);( XDK=0);( delay_ms(5); WriteComm(0x001F);WriteData(0x00D0);// GAS=1);( VOMG=10);( PON=1);( DK=0);( XDK=0);( delay_ms(5); //// 262k/65k color selection WriteComm(0x0017);WriteData(0x0005); //default 0x0006 262k color // 0x0005 65k color //// SET PANEL WriteComm(0x0036);WriteData(0x0000); //SS_P);( GS_P);(REV_P);(BGR_P //// Display ON Setting WriteComm(0x0028);WriteData(0x0038); //GON=1);( DTE=1);( D=1000 delay_ms(40); WriteComm(0x0028);WriteData(0x003C); //GON=1);( DTE=1);( D=1100 //// GRAM領域設定(横表示設定) WriteComm(0x0002);WriteData(0x0000); // Column Start Address Upper WriteComm(0x0003);WriteData(0x0000); // Column Start Address Lower WriteComm(0x0004);WriteData(0x0001); // Column End Address Upper WriteComm(0x0005);WriteData(0x003F); // Column End Address Lower:319 WriteComm(0x0006);WriteData(0x0000); // Row Start Address Upper WriteComm(0x0007);WriteData(0x0000); // Row Start Address Lower WriteComm(0x0008);WriteData(0x0000); // Row End Address Upper WriteComm(0x0009);WriteData(0x00EF); // Row End Address Lower:239 WriteComm(0x0016);WriteData(0x0068); // 横置き表示 MY=0,MX=1,MV=1, RGB=1(BGR配列パネル) WriteComm(0x0022); // SRAM write } /*************************** * 画面消去関数 * 消去用色指定あり ****************************/ void Glcd_Clear(unsigned int Color){ long px; // 塗り潰し範囲内の画素総数 //// 原点にセット WriteComm(0x0002);WriteData(0x0000); // Column Start Address Upper WriteComm(0x0003);WriteData(0x0000); // Column Start Address Lower WriteComm(0x0006);WriteData(0x0000); // Row Start Address Upper WriteComm(0x0007);WriteData(0x0000); // Row Start Address Lower WriteComm(0x0022); // write ram /// 塗り潰し範囲内の画素総数だけ書込みし指定色で塗潰す px = (long)ENDCOL * ENDROW; // 320x240= 76800ドット while (px--) { WriteData(Color); // Colorコード出力 } } /*********************************** * 1ピクセル表示関数 * 座標は(0,0)-(319,239) ***********************************/ void Glcd_Pixel(unsigned int Xpos, unsigned int Ypos, unsigned int Color){ if((Xpos> 8); // Column Start Address Upper WriteComm(0x0003);WriteData(Xpos & 0xFF); // Column Start Address Lower WriteComm(0x0006);WriteData(Ypos >> 8); // Row Start Address Upper WriteComm(0x0007);WriteData(Ypos & 0xFF); // Row Start Address Lower WriteComm(0x0022); // write ram //// ドット表示 LCD_CS = 0; // CS Low LCD_RS = 1; // Data //// Color上位バイト出力 LATE = ((Color>>8) & 0x00FF) | (LATE & 0xFF00); LCD_WR = 0; // WR out Nop(); LCD_WR = 1; //// Color下位バイト出力 LATE = (Color & 0x00FF) | (LATE & 0xFF00); LCD_WR = 0; // WR out Nop(); LCD_WR = 1; LCD_CS = 1; // CS Hi } } /*************************** * 直線描画関数 ***************************/ #define abs(a) (((a)>0) ? (a) : -(a)) void Glcd_Line(short x0, short y0, short x1, short y1, unsigned short Color) { short steep, t; short deltax, deltay, error; short x, y; short ystep; y0=ENDROW-y0 -1; // Y座標反転 y1=ENDROW-y1 -1; /// 差分の大きいほうを求める steep = (abs(y1 - y0) > abs(x1 - x0)); /// x、yの入れ替え if(steep){ t = x0; x0 = y0; y0 = t; t = x1; x1 = y1; y1 = t; } if(x0 > x1) { t = x0; x0 = x1; x1 = t; t = y0; y0 = y1; y1 = t; } deltax = x1 - x0; // 傾き計算 deltay = abs(y1 - y0); error = 0; y = y0; /// 傾きでステップの正負を切り替え if(y0 < y1) ystep = 1; else ystep = -1; /// 直線を点で描画 for(x=x0; x<=x1; x++) { if(steep) Glcd_Pixel(y,x,Color); else Glcd_Pixel(x,y,Color); error += deltay; if((error << 1) >= deltax) { y += ystep; error -= deltax; } } } /************************************* * 円を描く関数 * 中心点と半径を指定 * (Fussyさんのアルゴリズムを使用) **************************************/ void Glcd_Circle(int x0, int y0, int r, unsigned short color) { int x = r; int y = 0; int F = -2 * r + 3; while(x >= y){ Glcd_Pixel(x0+x, y0+y, color); Glcd_Pixel(x0-x, y0+y, color); Glcd_Pixel(x0+x, y0-y, color); Glcd_Pixel(x0-x, y0-y, color); Glcd_Pixel(x0+y, y0+x, color); Glcd_Pixel(x0-y, y0+x, color); Glcd_Pixel(x0+y, y0-x, color); Glcd_Pixel(x0-y, y0-x, color); if(F >= 0){ x--; F -= 4 * x; } y++; F += 4 * y + 2; } } /***************************************** * ANK文字表示関数 12x12ドット * 320/12=26文字/行 240/14=17行 * (0, 0) - (25, 16)の範囲 ******************************************/ void Glcd_Char(char colum, char line, unsigned char letter, unsigned short Color1, unsigned short Color2){ unsigned char j, i, Mask; if((colum < XChar) && (line < YLine)){ // 範囲チェック // ANK表示出力 3バイトの2ラインずつを6回繰り返す for(j=0; j<6; j++){ // 8ドット連続部の表示 Mask = 0x80; for(i=0; i<8; i++){ // 1ライン目前半8ドット表示 if((ANKFont[letter][j*3] & Mask) != 0) Glcd_Pixel(colum*12+i+4, line*14+j*2+2, Color1); else Glcd_Pixel(colum*12+i+4, line*14+j*2+2, Color2); //背景色 // 2ライン目後半8ドット表示 if((ANKFont[letter][j*3+2] & Mask) != 0) Glcd_Pixel(colum*12+i+8, line*14+j*2+3, Color1); else Glcd_Pixel(colum*12+i+8, line*14+j*2+3, Color2); //背景色 Mask = Mask >> 1; } // 分割部4ドットずつ表示 Mask = 0x80; // 1ライン目後半4ドット表示 for(i=0; i<4; i++){ if((ANKFont[letter][j*3+1] & Mask) != 0) Glcd_Pixel(colum*12+i+12, line*14+j*2+2, Color1); else Glcd_Pixel(colum*12+i+12, line*14+j*2+2, Color2); //背景色 Mask = Mask >> 1; } // 2ライン目前半4ドット表示 for(i=4; i<8; i++){ if((ANKFont[letter][j*3+1] & Mask) != 0) Glcd_Pixel(colum*12+i, line*14+j*2+3, Color1); else Glcd_Pixel(colum*12+i, line*14+j*2+3, Color2); //背景色 Mask = Mask >> 1; } } } } /****************************** * 文字列描画関数 * 16文字x20行で指定 ******************************/ void Glcd_Str(char colum, char line, char *s, unsigned short Color1, unsigned short Color2) { while (*s){ Glcd_Char(colum++, line, *s++, Color1, Color2); if(colum >= XChar){ line++; colum = 0; if(line >= YLine) line = 0; } } } /********************************************************* * イメージ表示関数 *  データは縦方向8ライン分が1バイトで格納されている * 128×128/8=2kバイト/画面 * グラフィック色(Color1)と背景色(Color2)両方を指定 * 130518追加: N.Ishii **********************************************************/ void Glcd_Image(char line, const unsigned char *ptr, unsigned short Color1, unsigned short Color2) { unsigned char Mask; short i, vline, colum; for(vline=line; vline