Chris Styles
/
QVGAtest
Quick test program for QVGA
main.cpp@0:4d473c333340, 2010-08-09 (annotated)
- Committer:
- chris
- Date:
- Mon Aug 09 21:03:32 2010 +0000
- Revision:
- 0:4d473c333340
Who changed what in which revision?
User | Revision | Line number | New 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 | } |