本篇直接實戰,沒辦法領導催得緊,沒時間細枝末節學習什麼代碼、結構體、類型了,直接上代碼吧。
本次接觸的代碼是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;
}