本篇直接实战,没办法领导催得紧,没时间细枝末节学习什么代码、结构体、类型了,直接上代码吧。
本次接触的代码是ov7670摄像头的keil驱动。
拿到资料包的时候里面有两个程序,分别是ov7670 keil的驱动程序以及在stm32上面直接跑的ov7670程序。
我先从第一个驱动程序开始看。
我准备一段一段看,所有看的过程都记录下来。let's go!!!!
#include <c8051f330.h>
#include <english_16x8.h>
第一部分是上了这俩头文件。先来看第一个头文件,从名字上看就知道是51的配置文件
/* BYTE Registers */
sfr P0 = 0x80; /* PORT 0 LATCH */
sfr SP = 0x81; /* STACK POINTER */
sfr DPL = 0x82; /* DATA POINTER LOW */
sfr DPH = 0x83; /* DATA POINTER HIGH */
sfr PCON = 0x87; /* POWER CONTROL */
sfr TCON = 0x88; /* TIMER/COUNTER CONTROL */
sfr TMOD = 0x89; /* TIMER/COUNTER MODE */
sfr TL0 = 0x8A; /* TIMER/COUNTER 0 LOW */
sfr TL1 = 0x8B; /* TIMER/COUNTER 1 LOW */
sfr TH0 = 0x8C; /* TIMER/COUNTER 0 HIGH */
sfr TH1 = 0x8D; /* TIMER/COUNTER 1 HIGH */
记得这个sfr是个寄存器的类型,所以这就是把地址分配给了这些寄存器,并且给与了寄存器变量名。地址是从0x80到0xFF,这个非常奇怪的是有许多sfr是只有一个位的,先不去管了。
大概这个头文件的意义就是将各种寄存器赋值各种地址。
紧接着是这个头文件:#include <english_16x8.h>
#ifndef _OV7660_H
#define _OV7660_H
const char code english[][16]={
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
{0x00,0x00,0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00},/*"!",1*/
{0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/
{0x00,0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00},/*"#",3*/
{0x00,0x00,0x18,0x18,0x3C,0x66,0x60,0x30,0x18,0x0C,0x06,0x66,0x3C,0x18,0x18,0x00},/*"$",4*/
{0x00,0x00,0x00,0x70,0xD8,0xDA,0x76,0x0C,0x18,0x30,0x6E,0x5B,0x1B,0x0E,0x00,0x00},/*"%",5*/
这个东西看起来就像是字库,暂定为字库,用到再说
接下来是一些主函数里面的定义:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
#define AM 001
#define TIME 100
#define SDA_IN() {P0MDOUT= 0X00;}
#define SDA_OUT() {P0MDOUT= 0XFF;}
又给一些应该是颜色的变量赋地址。
这里有两个SDA_IN和SDA_OUT是两个函数,操作是将0或者FF赋值给pomdout
然后是
//Tft control lines
sbit Tft_RS_PIN=P0^6;
sbit Tft_WR_PIN=P0^7;
sbit Tft_RST_PIN=P0^4;
//camera control lines
sbit I2C_SCL=P0^1;
sbit I2C_SDA=P0^0;
sbit Cmos_VSYNC=P0^5;
sbit SDA_STATE=P0^0;
//sn74lvc245 control lines
sbit Cmos_CS_PIN=P0^2;
//SN74LVC1G125 CONTROL LINES
sbit WR_CONTROL_PIN=P0^3;
void OSCILLATOR_Init (void);
void Port_Init(void);
void Ext_Interrupt_Init (void);
void Tft_Init(void);
void TftClear(unsigned int Color);
void Tft_WR_DATA16(unsigned int inputdata);
void TftWrite16(unsigned int index);
void TftWrite(unsigned int index,unsigned int inputdata);
void TftWR_Str(unsigned int x,unsigned int y,unsigned char *s,unsigned int color,unsigned int xcolor);
void TftWR_SingleStr(unsigned char inputdata,unsigned int color,unsigned int xcolor);
void Tft_SetBackground(unsigned int StartX,unsigned int StartY,unsigned int LongX,unsigned int LongY);
void Tft_SetCursor(unsigned int Xpos, unsigned int Ypos);
unsigned char WrCmos7670(unsigned char regID, unsigned char regDat);
unsigned char Cmos7670_init(void);
void set_Cmos7670reg(void);
void delay_us(unsigned int time);
void delay_ms(unsigned int time);
void delay( unsigned long cnt);
首先是给Tft控制线赋值,用P0.6\0.70.4分别给Tft线【TFT(Thin Film Transistor)是薄膜晶体管的缩写】
摄像头控线给了P0.0\0.1\0.5这里两个变量都是从P0.0里面弄东西。具体的待会函数里面再看。
。。。。。
我们先看main函数
void main(void)
{
PCA0MD &= ~0x40; // 取反
OSCILLATOR_Init (); // 初始化两个值
Port_Init();
Ext_Interrupt_Init( );
WR_CONTROL_PIN=1;
Tft_Init( );
TftClear(BLACK);
TftWR_Str(60,70,"C8051F330 Camera",RED,BLACK);
TftWR_Str(60,100,"QI FEI DIAN ZI VER1.0",RED,BLACK);
TftWR_Str(60,130,"OV7670 Initializing......",RED,BLACK);
delay_ms(3000);
while(1!=Cmos7670_init());
delay_ms(3000);
TftClear(BLACK);
TftWR_Str(60,110,"OV7670 Init SUCCESS! ",RED,BLACK);
delay_ms(5000);
TftClear(BLACK);
EA = 1;
while(1);
}
还有个函数
void TftWrite(unsigned int index,unsigned int inputdata)
{
unsigned int x;
unsigned int y;
unsigned int indexh;
unsigned int indexl;
unsigned int inputdatah;
unsigned int inputdatal;
x=index;
y=inputdata;
indexh=(index&0xff00)>>8;
indexl=index&0x00ff;
inputdatah=(inputdata&0xff00)>>8;
inputdatal=inputdata&0x00ff;
P1MDOUT= 0XFF;
Tft_RS_PIN= 0;
P1=0;
P1=indexh;
Tft_WR_PIN=0;
Tft_WR_PIN=1;
P1=0;
P1=indexl;
Tft_WR_PIN=0;
Tft_WR_PIN=1;
Tft_RS_PIN=1;
P1=0;
P1=inputdatah;
Tft_WR_PIN=0;
Tft_WR_PIN=1;
P1=0;
P1=inputdatal;
Tft_WR_PIN=0;
Tft_WR_PIN=1;
P1MDOUT= 0X00;
}