Quick test program for QVGA

Dependencies:   mbed

Committer:
chris
Date:
Mon Aug 09 21:03:32 2010 +0000
Revision:
0:4d473c333340

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
chris 0:4d473c333340 1 #include "mbed.h"
chris 0:4d473c333340 2
chris 0:4d473c333340 3 DigitalOut myled(LED1);
chris 0:4d473c333340 4
chris 0:4d473c333340 5
chris 0:4d473c333340 6 SPI m_spi(p11, p12, p13);
chris 0:4d473c333340 7 DigitalOut m_cs(p14);
chris 0:4d473c333340 8 DigitalOut m_dc(p15);
chris 0:4d473c333340 9 DigitalOut m_tcs(p16);
chris 0:4d473c333340 10 DigitalOut m_rst(p23);
chris 0:4d473c333340 11 PwmOut m_led(p24);
chris 0:4d473c333340 12
chris 0:4d473c333340 13
chris 0:4d473c333340 14
chris 0:4d473c333340 15 const int m_height = 240;
chris 0:4d473c333340 16 const int m_width = 320;
chris 0:4d473c333340 17
chris 0:4d473c333340 18 void spiWrite(uint16_t data)
chris 0:4d473c333340 19 {
chris 0:4d473c333340 20 m_cs = 0;
chris 0:4d473c333340 21 m_spi.write(data);
chris 0:4d473c333340 22 m_cs = 1;
chris 0:4d473c333340 23 }
chris 0:4d473c333340 24
chris 0:4d473c333340 25 bool m_drawMode = false;
chris 0:4d473c333340 26
chris 0:4d473c333340 27 void setRegAddr(uint16_t addr)
chris 0:4d473c333340 28 {
chris 0:4d473c333340 29 m_dc = 0;
chris 0:4d473c333340 30 spiWrite(addr);
chris 0:4d473c333340 31 }
chris 0:4d473c333340 32
chris 0:4d473c333340 33 void writeData(uint16_t data)
chris 0:4d473c333340 34 {
chris 0:4d473c333340 35 m_dc = 1;
chris 0:4d473c333340 36 spiWrite(data);
chris 0:4d473c333340 37 }
chris 0:4d473c333340 38
chris 0:4d473c333340 39 void point(uint16_t color)
chris 0:4d473c333340 40 {
chris 0:4d473c333340 41 if(!m_drawMode)
chris 0:4d473c333340 42 {
chris 0:4d473c333340 43 setRegAddr(0x22);
chris 0:4d473c333340 44 m_drawMode = true;
chris 0:4d473c333340 45 }
chris 0:4d473c333340 46 writeData(color);
chris 0:4d473c333340 47 }
chris 0:4d473c333340 48
chris 0:4d473c333340 49 void writeReg(uint16_t addr, uint16_t val)
chris 0:4d473c333340 50 {
chris 0:4d473c333340 51 m_drawMode = false;
chris 0:4d473c333340 52 setRegAddr(addr);
chris 0:4d473c333340 53
chris 0:4d473c333340 54 writeData(val);
chris 0:4d473c333340 55 }
chris 0:4d473c333340 56
chris 0:4d473c333340 57 void setPos(uint16_t x, uint16_t y)
chris 0:4d473c333340 58 {
chris 0:4d473c333340 59 // y = m_height - y;
chris 0:4d473c333340 60 writeReg(0x4e, y & 0xFF);
chris 0:4d473c333340 61 writeReg(0x4f, x & 0x1FF);
chris 0:4d473c333340 62 }
chris 0:4d473c333340 63
chris 0:4d473c333340 64 void setWindow(uint16_t startX, uint16_t startY, uint16_t endX, uint16_t endY)
chris 0:4d473c333340 65 {
chris 0:4d473c333340 66 //setPos( (startX + endX) / 2 , (startY + endY) / 2 );
chris 0:4d473c333340 67 writeReg( 0x44, (startY & 0xFF) | (endY << 8) );
chris 0:4d473c333340 68 writeReg( 0x45, startX & 0x1FF );
chris 0:4d473c333340 69 writeReg( 0x46, endX & 0x1FF );
chris 0:4d473c333340 70 // setPos( startX, startY );
chris 0:4d473c333340 71 // setPos( startX , startY );
chris 0:4d473c333340 72 // setPos( startX +1, startY+1 );
chris 0:4d473c333340 73 }
chris 0:4d473c333340 74
chris 0:4d473c333340 75 LocalFileSystem local("local");
chris 0:4d473c333340 76
chris 0:4d473c333340 77 void fillScreen(uint16_t color)
chris 0:4d473c333340 78 {
chris 0:4d473c333340 79 setPos(0,0);
chris 0:4d473c333340 80 for(int i = 0; i<m_height*m_width; i++)
chris 0:4d473c333340 81 point(color);
chris 0:4d473c333340 82 }
chris 0:4d473c333340 83
chris 0:4d473c333340 84 void drawLine(int startX, int startY, int endX, int endY, uint16_t color, int width)
chris 0:4d473c333340 85 {
chris 0:4d473c333340 86 float d = sqrt( (float) pow((endX - startX), 2.) + pow((endY - startY), 2.) );
chris 0:4d473c333340 87 int x = startX;
chris 0:4d473c333340 88 int y = startY;
chris 0:4d473c333340 89 float cos_a = (float) (endX - startX) / d;
chris 0:4d473c333340 90 float sin_a = (float) (endY - startY) / d;
chris 0:4d473c333340 91 for(int i = 0; i < d; i++)
chris 0:4d473c333340 92 {
chris 0:4d473c333340 93 for(float j = -(float)width/2; j <= (float)width/2; j++)
chris 0:4d473c333340 94 {
chris 0:4d473c333340 95 x = ((float)i*cos_a) + startX - (float) j * sin_a;
chris 0:4d473c333340 96 y = ((float)i*sin_a) + startY + (float) j * cos_a;
chris 0:4d473c333340 97 setPos(x,y);
chris 0:4d473c333340 98 point(color);
chris 0:4d473c333340 99 }
chris 0:4d473c333340 100 }
chris 0:4d473c333340 101 }
chris 0:4d473c333340 102
chris 0:4d473c333340 103 void drawLine2(int startX, int startY, int endX, int endY, uint16_t color, int w)
chris 0:4d473c333340 104 {
chris 0:4d473c333340 105 //Top trapezis
chris 0:4d473c333340 106 float d = sqrt( (float) pow((endX - startX), 2.) + pow((endY - startY), 2.) );
chris 0:4d473c333340 107 float cos_a = (float) (endX - startX) / d;
chris 0:4d473c333340 108 float sin_a = (float) (endY - startY) / d;
chris 0:4d473c333340 109 float tan_a = (float) (endY - startY) / (endX - startX);
chris 0:4d473c333340 110
chris 0:4d473c333340 111
chris 0:4d473c333340 112 int bY = endY + (float)(w*cos_a);
chris 0:4d473c333340 113 int eY = endY - (float)(w*cos_a);
chris 0:4d473c333340 114 for(int y = bY ; y > eY ; y-- )
chris 0:4d473c333340 115 {
chris 0:4d473c333340 116 int bX = endX - (float)(w*sin_a) - (float) (bY - y) / tan_a ;
chris 0:4d473c333340 117 int eX = endX - (float)(w*sin_a) + (float) (bY - y) * tan_a ;
chris 0:4d473c333340 118 setPos(bX,y);
chris 0:4d473c333340 119 for(int x = bX; x <= eX; x++)
chris 0:4d473c333340 120 {
chris 0:4d473c333340 121 point(color);
chris 0:4d473c333340 122 // wait(.1);
chris 0:4d473c333340 123 }
chris 0:4d473c333340 124 }
chris 0:4d473c333340 125
chris 0:4d473c333340 126
chris 0:4d473c333340 127 //Main parralelogram
chris 0:4d473c333340 128 int l = (float) (w / sin_a);
chris 0:4d473c333340 129
chris 0:4d473c333340 130 bY = eY;
chris 0:4d473c333340 131 eY = startY + (float)(w*cos_a);
chris 0:4d473c333340 132
chris 0:4d473c333340 133 for( int y = bY ; y > eY ; y-- )
chris 0:4d473c333340 134 {
chris 0:4d473c333340 135 int bX = startX + (float)( (y - startY)/tan_a) - l;
chris 0:4d473c333340 136 setPos(bX,y);
chris 0:4d473c333340 137 for(int x = bX; x <= bX + l*2; x++)
chris 0:4d473c333340 138 {
chris 0:4d473c333340 139 point(color);
chris 0:4d473c333340 140 // wait(.1);
chris 0:4d473c333340 141 }
chris 0:4d473c333340 142 }
chris 0:4d473c333340 143
chris 0:4d473c333340 144 }
chris 0:4d473c333340 145
chris 0:4d473c333340 146 #define ABS(a) (((a)>=0)?(a):-(a))
chris 0:4d473c333340 147
chris 0:4d473c333340 148 int main() {
chris 0:4d473c333340 149 m_cs = 1;
chris 0:4d473c333340 150 m_tcs = 1;
chris 0:4d473c333340 151 m_spi.format(16);
chris 0:4d473c333340 152 m_spi.frequency(20000000);
chris 0:4d473c333340 153
chris 0:4d473c333340 154 //SPI_1
chris 0:4d473c333340 155 //ssp_disable(LPC_SSP1);
chris 0:4d473c333340 156 LPC_SC->PCLKSEL0 &= ~(3 << 20);
chris 0:4d473c333340 157 LPC_SC->PCLKSEL0 |= (1 << 20);
chris 0:4d473c333340 158 LPC_SC->PCLKSEL0 &= ~(3 << 16);
chris 0:4d473c333340 159 LPC_SC->PCLKSEL0 |= (1 << 16);
chris 0:4d473c333340 160 LPC_SC->PCLKSEL1 &= ~(3 << 10);
chris 0:4d473c333340 161 LPC_SC->PCLKSEL1 |= (1 << 10);
chris 0:4d473c333340 162
chris 0:4d473c333340 163 LPC_SSP1->CPSR = 2; //72 / 2 = 36MHz
chris 0:4d473c333340 164
chris 0:4d473c333340 165 // A
chris 0:4d473c333340 166 // divider
chris 0:4d473c333340 167 LPC_SSP1->CR0 &= ~(0xFFFF << 8);
chris 0:4d473c333340 168 LPC_SSP1->CR0 |= (1 - 1) << 8; //1 clock/bit
chris 0:4d473c333340 169 LPC_SSP0->CR0 &= ~(0xFFFF << 8);
chris 0:4d473c333340 170 LPC_SSP0->CR0 |= (1 - 1) << 8; //1 clock/bit
chris 0:4d473c333340 171 //ssp_enable(LPC_SSP1);
chris 0:4d473c333340 172
chris 0:4d473c333340 173 m_led.period_us(2000);
chris 0:4d473c333340 174 m_led.write(.3);
chris 0:4d473c333340 175
chris 0:4d473c333340 176 m_rst = 0;
chris 0:4d473c333340 177 wait_ms(1000);
chris 0:4d473c333340 178 m_rst = 1;
chris 0:4d473c333340 179
chris 0:4d473c333340 180
chris 0:4d473c333340 181 writeReg(0x07, 0x0021);
chris 0:4d473c333340 182 writeReg(0x00, 0x0001);
chris 0:4d473c333340 183 writeReg(0x07, 0x0723);
chris 0:4d473c333340 184 writeReg(0x10, 0x0000);
chris 0:4d473c333340 185 wait_ms(200);
chris 0:4d473c333340 186 writeReg(0x07, 0x0033);
chris 0:4d473c333340 187 //writeReg(0x11, 0x6830);
chris 0:4d473c333340 188 writeReg(0x11, 0x6828);
chris 0:4d473c333340 189 writeReg(0x02, 0x0600);
chris 0:4d473c333340 190 writeReg(0x0f, 0x0000);
chris 0:4d473c333340 191 writeReg(0x01, 0x2b3f);
chris 0:4d473c333340 192 writeReg(0x0b, 0x5308);
chris 0:4d473c333340 193 writeReg(0x25, 0xa000);
chris 0:4d473c333340 194
chris 0:4d473c333340 195 // writeReg(0x01, 0x393f);
chris 0:4d473c333340 196 // writeReg(0x11, 0x6030);
chris 0:4d473c333340 197
chris 0:4d473c333340 198 wait(1);
chris 0:4d473c333340 199 /* uint16_t r;
chris 0:4d473c333340 200 uint16_t g;
chris 0:4d473c333340 201 uint16_t b;
chris 0:4d473c333340 202 for(int i =0; i<0x20; i+=2)
chris 0:4d473c333340 203 {
chris 0:4d473c333340 204 //fgetc(fp);
chris 0:4d473c333340 205 r = ABS(i-11);
chris 0:4d473c333340 206 g = i*2;
chris 0:4d473c333340 207 b = ABS(i-21);
chris 0:4d473c333340 208 fillScreen((r << 11) | (g<<5) | b); //Blank
chris 0:4d473c333340 209 }
chris 0:4d473c333340 210 */
chris 0:4d473c333340 211
chris 0:4d473c333340 212 fillScreen(0xFFFF);
chris 0:4d473c333340 213 //wait(1);
chris 0:4d473c333340 214
chris 0:4d473c333340 215
chris 0:4d473c333340 216 FILE *fp = fopen("/local/mbed.bmp", "r");
chris 0:4d473c333340 217 if(!fp)
chris 0:4d473c333340 218 {
chris 0:4d473c333340 219 error("!\n");
chris 0:4d473c333340 220 }
chris 0:4d473c333340 221 fseek(fp, 0xA, SEEK_SET);
chris 0:4d473c333340 222
chris 0:4d473c333340 223 int offset = fgetc(fp);
chris 0:4d473c333340 224 printf("offset = %d\n", offset);
chris 0:4d473c333340 225
chris 0:4d473c333340 226 fseek(fp, offset, SEEK_SET);
chris 0:4d473c333340 227 uint16_t r;
chris 0:4d473c333340 228 uint16_t g;
chris 0:4d473c333340 229 uint16_t b;
chris 0:4d473c333340 230
chris 0:4d473c333340 231
chris 0:4d473c333340 232 int px = 10;
chris 0:4d473c333340 233 int w = 300;
chris 0:4d473c333340 234 int py = 100;
chris 0:4d473c333340 235 int h = 96;
chris 0:4d473c333340 236
chris 0:4d473c333340 237 //writeReg(0x11, 0x6828);
chris 0:4d473c333340 238 //setWindow( x, x + 40, y, y + 40 );
chris 0:4d473c333340 239
chris 0:4d473c333340 240
chris 0:4d473c333340 241
chris 0:4d473c333340 242 for(int y = py; y < py + h; y++)
chris 0:4d473c333340 243 {
chris 0:4d473c333340 244 setPos(px, y);
chris 0:4d473c333340 245 for(int x = px; x < px + w; x++)
chris 0:4d473c333340 246 {
chris 0:4d473c333340 247
chris 0:4d473c333340 248 // setPos(x,y);
chris 0:4d473c333340 249 b = fgetc(fp) >> 3;
chris 0:4d473c333340 250 g = fgetc(fp) >> 2;
chris 0:4d473c333340 251 r = fgetc(fp) >> 3;
chris 0:4d473c333340 252 //fgetc(fp);
chris 0:4d473c333340 253 point( (r << 11) | (g<<5) | b );
chris 0:4d473c333340 254 //wait(.01);
chris 0:4d473c333340 255 }
chris 0:4d473c333340 256 }
chris 0:4d473c333340 257
chris 0:4d473c333340 258 fclose(fp);
chris 0:4d473c333340 259
chris 0:4d473c333340 260 wait (2.0);
chris 0:4d473c333340 261
chris 0:4d473c333340 262 fillScreen(0xFFFF);
chris 0:4d473c333340 263
chris 0:4d473c333340 264 for(float i = 25; i < 360*10; i++)
chris 0:4d473c333340 265 {
chris 0:4d473c333340 266 drawLine2( 160, 120, 160 + 100*cos((i/360)*3.14*2), 120 + 100*sin((i/360)*3.14*2), 0x0000, 2);
chris 0:4d473c333340 267 wait_ms(10);
chris 0:4d473c333340 268 drawLine2( 160, 120, 160 + 100*cos((i/360)*3.14*2), 120 + 100*sin((i/360)*3.14*2), 0xFFFF, 2);
chris 0:4d473c333340 269 }
chris 0:4d473c333340 270
chris 0:4d473c333340 271 while(1) {
chris 0:4d473c333340 272 myled = 1;
chris 0:4d473c333340 273 wait(0.2);
chris 0:4d473c333340 274 myled = 0;
chris 0:4d473c333340 275 wait(0.2);
chris 0:4d473c333340 276 }
chris 0:4d473c333340 277 }