Abe Takumi
/
ssd1963_test
for yamada
ssd1963.cpp@0:0f410f137263, 2013-08-05 (annotated)
- Committer:
- YSB
- Date:
- Mon Aug 05 08:15:12 2013 +0000
- Revision:
- 0:0f410f137263
for yamada;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
YSB | 0:0f410f137263 | 1 | #include "mbed.h" |
YSB | 0:0f410f137263 | 2 | #include "ssd1963.h" |
YSB | 0:0f410f137263 | 3 | #include "ASCII12dot.h" |
YSB | 0:0f410f137263 | 4 | /* |
YSB | 0:0f410f137263 | 5 | BusOut lcd_bus(D0,D1,D2,D3,D4,D5,D6,D7); |
YSB | 0:0f410f137263 | 6 | DigitalOut RSout(RS); |
YSB | 0:0f410f137263 | 7 | DigitalOut RDout(RD); |
YSB | 0:0f410f137263 | 8 | DigitalOut CSout(CS); |
YSB | 0:0f410f137263 | 9 | DigitalOut WRout(WR); |
YSB | 0:0f410f137263 | 10 | DigitalOut RSTout(RST); |
YSB | 0:0f410f137263 | 11 | */ |
YSB | 0:0f410f137263 | 12 | |
YSB | 0:0f410f137263 | 13 | TFTout::TFTout(PinName cs,PinName rd,PinName rs,PinName wr,PinName rst,PinName d0,PinName d1,PinName d2,PinName d3,PinName d4,PinName d5,PinName d6,PinName d7) : _CSout(cs), _RDout(rd), _RSout(rs), _WRout(wr), _RSTout(rst), _lcd_bus(d0,d1,d2,d3,d4,d5,d6,d7){ |
YSB | 0:0f410f137263 | 14 | wait(0.1);//wait until capacira stabilising |
YSB | 0:0f410f137263 | 15 | lcd_Init(); |
YSB | 0:0f410f137263 | 16 | lcd_Clear(0xFFFFFF); |
YSB | 0:0f410f137263 | 17 | } |
YSB | 0:0f410f137263 | 18 | |
YSB | 0:0f410f137263 | 19 | void TFTout::lcd_out(int rs,char data){ |
YSB | 0:0f410f137263 | 20 | _RDout = 1; |
YSB | 0:0f410f137263 | 21 | _RSout = rs; |
YSB | 0:0f410f137263 | 22 | _WRout = 0; |
YSB | 0:0f410f137263 | 23 | _CSout = 0; |
YSB | 0:0f410f137263 | 24 | _lcd_bus = data; |
YSB | 0:0f410f137263 | 25 | //for(int i=0;i<10;i++){} |
YSB | 0:0f410f137263 | 26 | _CSout = 1; |
YSB | 0:0f410f137263 | 27 | _WRout = 1; |
YSB | 0:0f410f137263 | 28 | } |
YSB | 0:0f410f137263 | 29 | |
YSB | 0:0f410f137263 | 30 | void TFTout::Command_Write(unsigned char command,unsigned char data1){ |
YSB | 0:0f410f137263 | 31 | lcd_out(0,command); |
YSB | 0:0f410f137263 | 32 | lcd_out(1,data1); |
YSB | 0:0f410f137263 | 33 | } |
YSB | 0:0f410f137263 | 34 | |
YSB | 0:0f410f137263 | 35 | void TFTout::SendData(unsigned long color){ |
YSB | 0:0f410f137263 | 36 | lcd_out(1,(color)>>16); |
YSB | 0:0f410f137263 | 37 | lcd_out(1,(color)>>8); |
YSB | 0:0f410f137263 | 38 | lcd_out(1,color); |
YSB | 0:0f410f137263 | 39 | } |
YSB | 0:0f410f137263 | 40 | |
YSB | 0:0f410f137263 | 41 | void TFTout::WindowSet(unsigned int s_x,unsigned int e_x,unsigned int s_y,unsigned int e_y){ |
YSB | 0:0f410f137263 | 42 | lcd_out(0,0x2a); |
YSB | 0:0f410f137263 | 43 | lcd_out(1,(s_x)>>8); |
YSB | 0:0f410f137263 | 44 | lcd_out(1,(s_x)); |
YSB | 0:0f410f137263 | 45 | lcd_out(1,(e_x)>>8); |
YSB | 0:0f410f137263 | 46 | lcd_out(1,(e_x)); |
YSB | 0:0f410f137263 | 47 | |
YSB | 0:0f410f137263 | 48 | lcd_out(0,0x2b); |
YSB | 0:0f410f137263 | 49 | lcd_out(1,(s_y)>>8); |
YSB | 0:0f410f137263 | 50 | lcd_out(1,(s_y)); |
YSB | 0:0f410f137263 | 51 | lcd_out(1,(e_y)>>8); |
YSB | 0:0f410f137263 | 52 | lcd_out(1,(e_y)); |
YSB | 0:0f410f137263 | 53 | } |
YSB | 0:0f410f137263 | 54 | |
YSB | 0:0f410f137263 | 55 | void TFTout::lcd_Clear(unsigned long Color){ |
YSB | 0:0f410f137263 | 56 | unsigned int x,y; |
YSB | 0:0f410f137263 | 57 | WindowSet(0x0000,0x01df,0x0000,0x010f); |
YSB | 0:0f410f137263 | 58 | lcd_out(0,0x2c); |
YSB | 0:0f410f137263 | 59 | for(x=0;x<ENDCOL;x++){ |
YSB | 0:0f410f137263 | 60 | for (y= 0;y<ENDROW;y++){ |
YSB | 0:0f410f137263 | 61 | SendData(Color); |
YSB | 0:0f410f137263 | 62 | } |
YSB | 0:0f410f137263 | 63 | } |
YSB | 0:0f410f137263 | 64 | } |
YSB | 0:0f410f137263 | 65 | |
YSB | 0:0f410f137263 | 66 | void TFTout::lcd_Init(void){ |
YSB | 0:0f410f137263 | 67 | _RSTout = 0; |
YSB | 0:0f410f137263 | 68 | wait(0.000001); |
YSB | 0:0f410f137263 | 69 | _RSTout = 1; |
YSB | 0:0f410f137263 | 70 | wait(0.000001); |
YSB | 0:0f410f137263 | 71 | |
YSB | 0:0f410f137263 | 72 | lcd_out(0,0x01); //Software Reset |
YSB | 0:0f410f137263 | 73 | lcd_out(0,0x01); |
YSB | 0:0f410f137263 | 74 | lcd_out(0,0x01); |
YSB | 0:0f410f137263 | 75 | Command_Write(0xe0,0x01); // START PLL |
YSB | 0:0f410f137263 | 76 | Command_Write(0xe0,0x03); // LOCK PLL |
YSB | 0:0f410f137263 | 77 | |
YSB | 0:0f410f137263 | 78 | lcd_out(0,0xb0); //SET LCD MODE SET TFT 18Bits MODE |
YSB | 0:0f410f137263 | 79 | lcd_out(1,0x08); //SET TFT MODE & hsync+Vsync+DEN MODE |
YSB | 0:0f410f137263 | 80 | lcd_out(1,0x00); //SET TFT MODE & hsync+Vsync+DEN MODE |
YSB | 0:0f410f137263 | 81 | lcd_out(1,0x01); //SET horizontal size=480-1 HightByte |
YSB | 0:0f410f137263 | 82 | lcd_out(1,0xdf); //SET horizontal size=480-1 LowByte |
YSB | 0:0f410f137263 | 83 | lcd_out(1,0x01); //SET vertical size=272-1 HightByte |
YSB | 0:0f410f137263 | 84 | lcd_out(1,0x0f); //SET vertical size=272-1 LowByte |
YSB | 0:0f410f137263 | 85 | lcd_out(1,0x00); //SET even/odd line RGB seq.=RGB |
YSB | 0:0f410f137263 | 86 | |
YSB | 0:0f410f137263 | 87 | Command_Write(0xf0,0x00); //SET pixel data I/F format=8bit |
YSB | 0:0f410f137263 | 88 | Command_Write(0x3a,0x60); // SET R G B format = 6 6 6 |
YSB | 0:0f410f137263 | 89 | |
YSB | 0:0f410f137263 | 90 | lcd_out(0,0xe2); //SET PLL freq=113.33MHz ; |
YSB | 0:0f410f137263 | 91 | lcd_out(1,0x22); |
YSB | 0:0f410f137263 | 92 | lcd_out(1,0x03); |
YSB | 0:0f410f137263 | 93 | lcd_out(1,0x04); |
YSB | 0:0f410f137263 | 94 | |
YSB | 0:0f410f137263 | 95 | lcd_out(0,0xe6); //SET PCLK freq=9MHz ; pixel clock frequency |
YSB | 0:0f410f137263 | 96 | lcd_out(1,0x01); |
YSB | 0:0f410f137263 | 97 | lcd_out(1,0x45); |
YSB | 0:0f410f137263 | 98 | lcd_out(1,0x47); |
YSB | 0:0f410f137263 | 99 | |
YSB | 0:0f410f137263 | 100 | lcd_out(0,0xb4); //SET HBP |
YSB | 0:0f410f137263 | 101 | lcd_out(1,0x02); //SET HSYNC Total = 525 |
YSB | 0:0f410f137263 | 102 | lcd_out(1,0x0d); |
YSB | 0:0f410f137263 | 103 | lcd_out(1,0x00); //SET HBP = 43 |
YSB | 0:0f410f137263 | 104 | lcd_out(1,0x2b); |
YSB | 0:0f410f137263 | 105 | lcd_out(1,0x28); //SET VBP 41 = 40 + 1 |
YSB | 0:0f410f137263 | 106 | lcd_out(1,0x00); //SET Hsync pulse start position |
YSB | 0:0f410f137263 | 107 | lcd_out(1,0x00); |
YSB | 0:0f410f137263 | 108 | lcd_out(1,0x00); //SET Hsync pulse subpixel start position |
YSB | 0:0f410f137263 | 109 | |
YSB | 0:0f410f137263 | 110 | lcd_out(0,0xb6); //SET VBP |
YSB | 0:0f410f137263 | 111 | lcd_out(1,0x01); //SET Vsync total 286 = 285 + 1 |
YSB | 0:0f410f137263 | 112 | lcd_out(1,0x1d); |
YSB | 0:0f410f137263 | 113 | lcd_out(1,0x00); //SET VBP = 12 |
YSB | 0:0f410f137263 | 114 | lcd_out(1,0x0c); |
YSB | 0:0f410f137263 | 115 | lcd_out(1,0x09); //SET Vsync pulse 10 = 9 + 1 |
YSB | 0:0f410f137263 | 116 | lcd_out(1,0x00); //SET Vsync pulse start position |
YSB | 0:0f410f137263 | 117 | lcd_out(1,0x00); |
YSB | 0:0f410f137263 | 118 | |
YSB | 0:0f410f137263 | 119 | lcd_out(0,0x2a); //SET column address |
YSB | 0:0f410f137263 | 120 | lcd_out(1,0x00); //SET start column address=0 |
YSB | 0:0f410f137263 | 121 | lcd_out(1,0x00); |
YSB | 0:0f410f137263 | 122 | lcd_out(1,0x01); //SET end column address=480 |
YSB | 0:0f410f137263 | 123 | lcd_out(1,0xdf); |
YSB | 0:0f410f137263 | 124 | |
YSB | 0:0f410f137263 | 125 | lcd_out(0,0x2b); //SET page address |
YSB | 0:0f410f137263 | 126 | lcd_out(1,0x00); //SET start page address=0 |
YSB | 0:0f410f137263 | 127 | lcd_out(1,0x00); |
YSB | 0:0f410f137263 | 128 | lcd_out(1,0x01); //SET end page address=272 |
YSB | 0:0f410f137263 | 129 | lcd_out(1,0x0f); |
YSB | 0:0f410f137263 | 130 | |
YSB | 0:0f410f137263 | 131 | lcd_out(0,0x29); //SET display on |
YSB | 0:0f410f137263 | 132 | lcd_out(0,0x2c); |
YSB | 0:0f410f137263 | 133 | } |
YSB | 0:0f410f137263 | 134 | |
YSB | 0:0f410f137263 | 135 | void TFTout::WRITE_PIXEL(int x,int y,unsigned long Color){ |
YSB | 0:0f410f137263 | 136 | WindowSet(x,x,y,y); |
YSB | 0:0f410f137263 | 137 | lcd_out(0,0x2c); |
YSB | 0:0f410f137263 | 138 | SendData(Color); |
YSB | 0:0f410f137263 | 139 | } |
YSB | 0:0f410f137263 | 140 | |
YSB | 0:0f410f137263 | 141 | //************************** |
YSB | 0:0f410f137263 | 142 | // 直線描画関数 |
YSB | 0:0f410f137263 | 143 | //************************** |
YSB | 0:0f410f137263 | 144 | #define abs(a) (((a)>0) ? (a) : -(a)) |
YSB | 0:0f410f137263 | 145 | void TFTout::lcd_Line(short x0, short y0, short x1, short y1, unsigned long Color) |
YSB | 0:0f410f137263 | 146 | { |
YSB | 0:0f410f137263 | 147 | short steep, t; |
YSB | 0:0f410f137263 | 148 | short deltax, deltay, error; |
YSB | 0:0f410f137263 | 149 | short x, y; |
YSB | 0:0f410f137263 | 150 | short ystep; |
YSB | 0:0f410f137263 | 151 | |
YSB | 0:0f410f137263 | 152 | y0=ENDROW-y0 -1; // Y座標反転 |
YSB | 0:0f410f137263 | 153 | y1=ENDROW-y1 -1; |
YSB | 0:0f410f137263 | 154 | /// 差分の大きいほうを求める |
YSB | 0:0f410f137263 | 155 | steep = (abs(y1 - y0) > abs(x1 - x0)); |
YSB | 0:0f410f137263 | 156 | /// x、yの入れ替え |
YSB | 0:0f410f137263 | 157 | if(steep){ |
YSB | 0:0f410f137263 | 158 | t = x0; x0 = y0; y0 = t; |
YSB | 0:0f410f137263 | 159 | t = x1; x1 = y1; y1 = t; |
YSB | 0:0f410f137263 | 160 | } |
YSB | 0:0f410f137263 | 161 | if(x0 > x1) { |
YSB | 0:0f410f137263 | 162 | t = x0; x0 = x1; x1 = t; |
YSB | 0:0f410f137263 | 163 | t = y0; y0 = y1; y1 = t; |
YSB | 0:0f410f137263 | 164 | } |
YSB | 0:0f410f137263 | 165 | deltax = x1 - x0; // 傾き計算 |
YSB | 0:0f410f137263 | 166 | deltay = abs(y1 - y0); |
YSB | 0:0f410f137263 | 167 | error = 0; |
YSB | 0:0f410f137263 | 168 | y = y0; |
YSB | 0:0f410f137263 | 169 | /// 傾きでステップの正負を切り替え |
YSB | 0:0f410f137263 | 170 | if(y0 < y1) ystep = 1; else ystep = -1; |
YSB | 0:0f410f137263 | 171 | /// 直線を点で描画 |
YSB | 0:0f410f137263 | 172 | for(x=x0; x<=x1; x++) { |
YSB | 0:0f410f137263 | 173 | if(steep) WRITE_PIXEL(y,x,Color); else WRITE_PIXEL(x,y,Color); |
YSB | 0:0f410f137263 | 174 | error += deltay; |
YSB | 0:0f410f137263 | 175 | if((error << 1) >= deltax) { |
YSB | 0:0f410f137263 | 176 | y += ystep; |
YSB | 0:0f410f137263 | 177 | error -= deltax; |
YSB | 0:0f410f137263 | 178 | } |
YSB | 0:0f410f137263 | 179 | } |
YSB | 0:0f410f137263 | 180 | } |
YSB | 0:0f410f137263 | 181 | //************************************ |
YSB | 0:0f410f137263 | 182 | // 円を描く関数 |
YSB | 0:0f410f137263 | 183 | // 中心点と半径を指定 |
YSB | 0:0f410f137263 | 184 | // (Fussyさんのアルゴリズムを使用) |
YSB | 0:0f410f137263 | 185 | //************************************ |
YSB | 0:0f410f137263 | 186 | void TFTout::lcd_Circle(int x0, int y0, int r, unsigned long color) |
YSB | 0:0f410f137263 | 187 | { |
YSB | 0:0f410f137263 | 188 | int x = r; |
YSB | 0:0f410f137263 | 189 | int y = 0; |
YSB | 0:0f410f137263 | 190 | int F = -2 * r + 3; |
YSB | 0:0f410f137263 | 191 | |
YSB | 0:0f410f137263 | 192 | while(x >= y){ |
YSB | 0:0f410f137263 | 193 | WRITE_PIXEL(x0+x, y0+y, color); |
YSB | 0:0f410f137263 | 194 | WRITE_PIXEL(x0-x, y0+y, color); |
YSB | 0:0f410f137263 | 195 | WRITE_PIXEL(x0+x, y0-y, color); |
YSB | 0:0f410f137263 | 196 | WRITE_PIXEL(x0-x, y0-y, color); |
YSB | 0:0f410f137263 | 197 | WRITE_PIXEL(x0+y, y0+x, color); |
YSB | 0:0f410f137263 | 198 | WRITE_PIXEL(x0-y, y0+x, color); |
YSB | 0:0f410f137263 | 199 | WRITE_PIXEL(x0+y, y0-x, color); |
YSB | 0:0f410f137263 | 200 | WRITE_PIXEL(x0-y, y0-x, color); |
YSB | 0:0f410f137263 | 201 | if(F >= 0){ |
YSB | 0:0f410f137263 | 202 | x--; |
YSB | 0:0f410f137263 | 203 | F -= 4 * x; |
YSB | 0:0f410f137263 | 204 | } |
YSB | 0:0f410f137263 | 205 | y++; |
YSB | 0:0f410f137263 | 206 | F += 4 * y + 2; |
YSB | 0:0f410f137263 | 207 | } |
YSB | 0:0f410f137263 | 208 | } |
YSB | 0:0f410f137263 | 209 | |
YSB | 0:0f410f137263 | 210 | //**************************************** |
YSB | 0:0f410f137263 | 211 | // ANK文字表示関数 12x12ドット |
YSB | 0:0f410f137263 | 212 | // 320/12=26文字/行 240/14=17行 |
YSB | 0:0f410f137263 | 213 | // (0, 0) - (25, 16)の範囲 |
YSB | 0:0f410f137263 | 214 | //**************************************** |
YSB | 0:0f410f137263 | 215 | void TFTout::lcd_Char(char colum, char line, unsigned char letter, unsigned long Color1, unsigned long Color2){ |
YSB | 0:0f410f137263 | 216 | unsigned char j, i, Mask; |
YSB | 0:0f410f137263 | 217 | |
YSB | 0:0f410f137263 | 218 | if((colum < XChar) && (line < YLine)){ // 範囲チェック |
YSB | 0:0f410f137263 | 219 | // ANK表示出力 3バイトの2ラインずつを6回繰り返す |
YSB | 0:0f410f137263 | 220 | for(j=0; j<6; j++){ |
YSB | 0:0f410f137263 | 221 | // 8ドット連続部の表示 |
YSB | 0:0f410f137263 | 222 | Mask = 0x80; |
YSB | 0:0f410f137263 | 223 | for(i=0; i<8; i++){ |
YSB | 0:0f410f137263 | 224 | // 1ライン目前半8ドット表示 |
YSB | 0:0f410f137263 | 225 | if((ANKFont[letter][j*3] & Mask) != 0) |
YSB | 0:0f410f137263 | 226 | WRITE_PIXEL((colum*12)+i+4, (line*14)+(j*2)+2, Color1); |
YSB | 0:0f410f137263 | 227 | else |
YSB | 0:0f410f137263 | 228 | WRITE_PIXEL(colum*12+i+4, line*14+j*2+2, Color2); //背景色 |
YSB | 0:0f410f137263 | 229 | // 2ライン目後半8ドット表示 |
YSB | 0:0f410f137263 | 230 | if((ANKFont[letter][j*3+2] & Mask) != 0) |
YSB | 0:0f410f137263 | 231 | WRITE_PIXEL(colum*12+i+8, line*14+j*2+3, Color1); |
YSB | 0:0f410f137263 | 232 | else |
YSB | 0:0f410f137263 | 233 | WRITE_PIXEL(colum*12+i+8, line*14+j*2+3, Color2); //背景色 |
YSB | 0:0f410f137263 | 234 | Mask = Mask >> 1; |
YSB | 0:0f410f137263 | 235 | } |
YSB | 0:0f410f137263 | 236 | // 分割部4ドットずつ表示 |
YSB | 0:0f410f137263 | 237 | Mask = 0x80; |
YSB | 0:0f410f137263 | 238 | // 1ライン目後半4ドット表示 |
YSB | 0:0f410f137263 | 239 | for(i=0; i<4; i++){ |
YSB | 0:0f410f137263 | 240 | if((ANKFont[letter][j*3+1] & Mask) != 0) |
YSB | 0:0f410f137263 | 241 | WRITE_PIXEL(colum*12+i+12, line*14+j*2+2, Color1); |
YSB | 0:0f410f137263 | 242 | else |
YSB | 0:0f410f137263 | 243 | WRITE_PIXEL(colum*12+i+12, line*14+j*2+2, Color2); //背景色 |
YSB | 0:0f410f137263 | 244 | Mask = Mask >> 1; |
YSB | 0:0f410f137263 | 245 | } |
YSB | 0:0f410f137263 | 246 | // 2ライン目前半4ドット表示 |
YSB | 0:0f410f137263 | 247 | for(i=4; i<8; i++){ |
YSB | 0:0f410f137263 | 248 | if((ANKFont[letter][j*3+1] & Mask) != 0) |
YSB | 0:0f410f137263 | 249 | WRITE_PIXEL(colum*12+i, line*14+j*2+3, Color1); |
YSB | 0:0f410f137263 | 250 | else |
YSB | 0:0f410f137263 | 251 | WRITE_PIXEL(colum*12+i, line*14+j*2+3, Color2); //背景色 |
YSB | 0:0f410f137263 | 252 | Mask = Mask >> 1; |
YSB | 0:0f410f137263 | 253 | } |
YSB | 0:0f410f137263 | 254 | } |
YSB | 0:0f410f137263 | 255 | } |
YSB | 0:0f410f137263 | 256 | } |
YSB | 0:0f410f137263 | 257 | |
YSB | 0:0f410f137263 | 258 | //***************************** |
YSB | 0:0f410f137263 | 259 | // 文字列描画関数 |
YSB | 0:0f410f137263 | 260 | // 16文字x20行で指定 |
YSB | 0:0f410f137263 | 261 | //****************************/ |
YSB | 0:0f410f137263 | 262 | void TFTout::lcd_Str(char colum, char line, char *s, unsigned long Color1, unsigned long Color2) |
YSB | 0:0f410f137263 | 263 | { |
YSB | 0:0f410f137263 | 264 | while (*s){ |
YSB | 0:0f410f137263 | 265 | lcd_Char(colum++, line, *s++, Color1, Color2); |
YSB | 0:0f410f137263 | 266 | if(colum >= XChar){ |
YSB | 0:0f410f137263 | 267 | line++; |
YSB | 0:0f410f137263 | 268 | colum = 0; |
YSB | 0:0f410f137263 | 269 | if(line >= YLine) |
YSB | 0:0f410f137263 | 270 | line = 0; |
YSB | 0:0f410f137263 | 271 | } |
YSB | 0:0f410f137263 | 272 | } |
YSB | 0:0f410f137263 | 273 | } |