#define GB2T {SET_RCLK(1);SET_RCLK(0);TFT_CON_WR=0;TFT_CON_WR=1;} //更新FIFO输出数据,然后直接写入到TFT液晶 #define G20B2T {GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;} //从FIFO获取20字节的像素数据写入到TFT中 void main(void) { unsigned char test=0; unsigned char i=0; TFT_Init(); TFT_Clear(0xf800); UART_Init(); UART_Send_Str("串口初始化完成.\r\n"); while(!OV7670_Init()); UART_Send_Str("摄像头芯片初始化完成.\r\n"); P0M1=0XFF;P0M0=0X00;P0=0XFF; //将P0设置为高阻输,OV7670模块输出 //的像素数据不进入单片机,直接写入到 //TFT液晶中,因此单片机的IO要设置为高阻 CM_VSYNC=1; //用于检测场同步VSYNC,准双向IO设置为输入先要置高 while(1) { while(GET_VSYNC()); while(!GET_VSYNC()); //等待VSYNC信号的上升沿,它代表一帧图像的开始 SET_WRST(0); SET_RCLK(0); SET_RCLK(1); SET_RCLK(0); SET_RCLK(1); SET_WRST(1); //将FIFO的读写地址归0 //ZN-X开发板上把OV7670模块上FIFO的WRST与RRST接在了一起 //WRST置0,写地址由OV7670芯片在场同步信号期间的PCLK时钟清0 //RRST置0,读地址由RCLK时钟清0 //(读写复位为0时,如读写时钟有两个以上脉冲,则读写地址清0) SET_WEN(1); //打开FIFO写使能,以便OV7670将数据灌入FIFO while(GET_VSYNC()); while(!GET_VSYNC()); //等等VSYNC信号的上升沿,它代表前一帧图像已经结束 //此时一帧完整的图像已在FIFO中 SET_WEN(0); //关闭FIFO写使能 SET_OE(0); //使能FIFO数据输出端口(原本是高阻态) TFT_CON_CS=0; //TFT液晶使能 TFT_CON_RS=1; //切到数据模式 for(i=0;i<120;i++) //FIFO输出数据直接灌入到TFT液晶(此时TFT液晶为8位模式) { //下面这种作法是为了提高图像显示的流畅度,提高代码执行效率 G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T; G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T; G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T; G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T; } TFT_CON_CS=1; //关闭TFT片选 SET_OE(1); //关闭FIFO数据输出端使能,现呈高阻态 SET_TEST_PIN(test); //用于测试的LED闪灯,闪灯速度代表了帧频 test=~test; } while(1); } |