for yamada

Dependencies:   mbed

Committer:
YSB
Date:
Mon Aug 05 08:15:12 2013 +0000
Revision:
0:0f410f137263
for yamada;

Who changed what in which revision?

UserRevisionLine numberNew 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 }