This program is for OV7670 and TFT-LCD(REL225L01)

Dependencies:   mbed

Revision:
0:03f32e3679c8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Feb 16 14:51:28 2012 +0000
@@ -0,0 +1,143 @@
+#include "mbed.h"
+#include "OV7670.h"
+#include "REL225L01.h"
+REL225L01 tft;
+
+DigitalOut myled1(LED1);
+DigitalOut myled2(LED2);
+DigitalOut myled3(LED3);
+DigitalOut myled4(LED4);
+InterruptIn VSYNC_IN(p5);
+DigitalOut CMOS_CS(p20);
+DigitalOut EN_EXCLK(p21);
+DigitalOut EN_595(p23);
+I2C i2c(p9,p10); //sda, scl
+
+
+void flip1()
+{
+    EN_595 = 0;
+    tft.lcd_cw_start();
+    EN_595 = 1;   
+    EN_EXCLK = 1;
+    CMOS_CS = 0;
+}
+
+void flip2()
+{
+    EN_595 = 0;
+    tft.lcd_cw_end();
+    EN_595 = 1;
+    EN_EXCLK = 0;
+    CMOS_CS = 1;
+}
+    
+
+int main() {
+   char cmd[2];
+   CMOS_CS = 1;   
+   EN_EXCLK=0;
+   EN_595=0;
+   myled1=1;
+   i2c.start();
+   //
+   //cmd[0] = REG_CLKRC; //
+   //cmd[1] = 0x01; //Set Camera Active
+   //i2c.write(OV7670_I2C_ADDR,cmd,2); // send string
+   //wait(0.07); //could also pull,65ms is typical
+   
+   regval_list *vals=ov7670_default_regs;
+   //while(vals->reg_num!=0xff||vals->value!=0xff)
+   while(vals->reg_num!=0xff||vals->value!=0xff)
+   {
+    cmd[0] = vals->reg_num;
+    cmd[1] = vals->value;
+    i2c.write(OV7670_I2C_ADDR,cmd,2);
+    wait(0.01);
+   vals++;
+   }
+   
+   vals=ov7670_fmt_rgb565;
+   //while(vals->reg_num!=0xff||vals->value!=0xff)
+   while(vals->reg_num!=0xff||vals->value!=0xff)
+   {
+    cmd[0] = vals->reg_num;
+    cmd[1] = vals->value;
+    i2c.write(OV7670_I2C_ADDR,cmd,2);
+    wait(0.01);
+   vals++;
+   }
+   
+   wait(2);
+ 
+   unsigned char v;
+   // Horizontal setting: 11bits, top 8 live in hstart and hstop. Bottom 3 of
+   // hstart are in href[2:0], bottom 3 of hstop in href[5:3]. There is
+   //a mystery "edge offset" value in the top two bit fo href.
+   
+   cmd[0] = REG_HSTART;
+   cmd[1] = (hstart>>3)&0xff;
+   i2c.write(OV7670_I2C_ADDR,cmd,2);
+   wait(0.01);
+   cmd[0] = REG_HSTOP;
+   cmd[1] = (hstop >> 3) & 0xff;
+   i2c.write(OV7670_I2C_ADDR,cmd,2);
+   //v = (0xb6 & 0xc0) | ((hstop & 0x07)<<3)| (hstart & 0x07);
+   v = (0x80 & 0xc0) | ((hstop & 0x07)<<3)| (hstart & 0x07);
+   wait(0.01);
+   cmd[0] = REG_HREF;
+   cmd[1] = v;
+   i2c.write(OV7670_I2C_ADDR,cmd,2);
+   
+   /*
+    * Vertical : simillar arrangement, but only 10 bits
+    */
+   cmd[0] = REG_VSTART;
+   cmd[1] = (vstart>>2)&0xff;
+   i2c.write(OV7670_I2C_ADDR,cmd,2);
+   wait(0.01);
+   cmd[0] = REG_VSTOP;
+   cmd[1] = (vstop >>2) & 0xff;
+   i2c.write(OV7670_I2C_ADDR,cmd,2);
+   v = (0x0a & 0xf0) | ((vstop & 0x03) <<2) | (vstart & 0x03);
+   cmd[0] = REG_VREF;
+   cmd[1] = v;
+   wait(0.01);
+   i2c.write(OV7670_I2C_ADDR,cmd,2);
+   cmd[0] =  REG_COM7;
+   cmd[1] = COM7_FMT_QVGA | COM7_RGB;
+   wait(0.01);
+   i2c.write(OV7670_I2C_ADDR,cmd,2);
+   
+   i2c.stop();
+   
+   myled1=0;
+   myled2=1;
+   // TFT-LCD setting
+   tft.lcd_init();
+   tft.lcd_clear(BLUE);
+   //wait(1);
+   //tft.lcd_clear(RED);
+   //wait(1);
+   tft.lcd_cw_start();
+   //Changing Internal/External WR, Data by VSYNC signal of CMOS Camera module 
+   //LCD module write period : 2sec
+   EN_595 = 1;
+   
+   VSYNC_IN.fall(&flip1); 
+   VSYNC_IN.rise(&flip2);
+   
+   //wait(0.28);
+   
+   //Stop Re-Display 
+   //tft.lcd_cw_end();
+   //VSYNC_IN.fall(&flip2);
+   
+   myled2=0;
+    while(1) {
+        myled3 = 1;
+        wait(0.2);
+        myled3 = 0;
+        wait(0.2);
+    }
+}