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;

}

 

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