keil與仿真電路的學習(二)

本篇直接實戰,沒辦法領導催得緊,沒時間細枝末節學習什麼代碼、結構體、類型了,直接上代碼吧。

 

本次接觸的代碼是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;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章