📄 ov9121.c
字号:
//#pragma ot(6,SIZE)
/*
ID_Address 是OV9121的地址在这里是写是0X60,读是0X61
sub_Address 是OV9121内部寄存器的地址,也就是要写的寄存器址
hex 所送的数值,用16进制表示
*/
#include <intrins.h>
#include <AT892051.H>
#include <OV9121_1.h>
#include <OV9121_screen.h>
#define LAMP P1_6
#define ERRORCOUNT 1
sbit SCCB_D=P1^1;
sbit SCCB_C=P1^0;
sbit SCCB_E=P3^7;
//sbit EXPSTB=P1^4;
//sbit FREX=P1^3;
void main(void)
{
bit SCCB(unsigned char ID_Address,unsigned int sub_Address,unsigned char *hex);
//void Delay_2(unsigned char DelayCount);
unsigned char/*p,i,*/a=0x08,b=0x23,c=0xa0,d=0x53,e=0x4a,f=0x83,g=/*0x5b*/0x20,h=0xf6,value,sum;
unsigned int ID_Address=0x61,sub_address=0x0000,mm=0x0050;
P1=P3=0xff;
//BEEP=0;
//if(KEY==0)
//{
//LAMP=(!LAMP);Delay_2(100000);LAMP=1;Delay_2(100000);
//SCCB(0x60,0x37,&a); //单屏和多屏
//SCCB(0x60,0x15,&c); //水平场信号变换
SCCB(0x60,0x18,&d);SCCB(0x60,0x17,&b); //水平窗口变成一行象素384个
//SCCB(0x60,0x1A,&e);
SCCB(0x60,0x10,&f); //暴光时间控制
SCCB(0x60,0x19,&g); ////垂直窗口调整288个行象素;;
SCCB(0x60,0x13,&h); //自动和手动暴光
while(1)
{
SCCB(ID_Address,sub_address,&value);
sum=value;
RWXX(&sum,0x01,mm,0xa0,M2464);
sub_address++;mm++;//i++;
if(sub_address>0x38) break;
}
while(1){
//EXPSTB=0;Delay_2(5);FREX=0;
screen();
}
}
//}
/**********************************************************************/
//LAMP=(!LAMP);Delay_2(100);LAMP=0;
//LAMP=(!LAMP);Delay_2(500);LAMP=0;
bit SCCB(unsigned char ID_Address,unsigned int sub_Address,unsigned char *hex)
{
void SCCBstart(void);
void SCCBstop(void);
unsigned char SCCBreceiveByte(void);
void SCCBsendByte(unsigned char sendbyte);
/*bit */void SCCBRecAck(void);
void SCCBNoAck(void);
void SCCBAck(void);
void Delay_1(unsigned long DelayCount);
unsigned char data j=1,i=ERRORCOUNT;
bit errorflag=1;
while(i--)
{
SCCBstart();
SCCBsendByte(ID_Address&0xfe); //送控制字0XC2
SCCBRecAck();
if(CY) continue;
SCCBsendByte((unsigned char)sub_Address); //送寄存器地址
SCCBRecAck();
if(CY) continue;
if(!(ID_Address&0x01)) //如果是写
{
j=1;
errorflag=0;
while(j--)
{
SCCBsendByte(*hex); //送操作数
SCCBRecAck(); //应答继续
if(!CY) continue;
errorflag=1;
break;
}
if(errorflag==1)
continue;
break;
}
else //如果是读
{
SCCBstart(); //重新启动总线
SCCBsendByte(ID_Address); //送控制字也就是ID地址
SCCBRecAck(); //应答
if(CY) continue;
/*while(--j) //循环一次
{
*hex++=SCCBreceiveByte(); //送数
SCCBAck(); //应答
}*/
*hex=SCCBreceiveByte(); //read last byte data
SCCBNoAck(); //应答
LAMP=(!LAMP);Delay_1(500);LAMP=1; //程序调式用
errorflag=0;
break;
}
}
SCCBstop(); //总线停止
if(!(ID_Address&0x01)) //如果是写
{
Delay_1(255); //延时
Delay_1(255);
Delay_1(255);
Delay_1(255);
}
Delay_1(255);
Delay_1(255);
Delay_1(255);
Delay_1(255);
return(errorflag); //返回errorflag
}
/*****************以下是对SCCB总线的操作子程序***/
/*****************启动总线**********************/
void SCCBstart(void)
{
SCCB_E=1;
SCCB_D=1;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
SCCB_E=0;
_nop_();
_nop_();
_nop_();
///////////////////////////////////////////////////////
SCCB_C=1;
SCCB_D=0;
_nop_(); //0.25us
SCCB_D=1;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_D=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_C=0;
_nop_();
_nop_();
_nop_();
//SCCB_D=1; //SCCB_E从1到0表示BUS启动
}
/*******************SCCB总线停止*********************/
void SCCBStop(void)
{
SCCB_C=0;
SCCB_D=0;
SCCB_E=0;
_nop_();
SCCB_C=1;
_nop_();
_nop_();
_nop_();
SCCB_D=1;
_nop_();
_nop_();
SCCB_E=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_D=0;
SCCB_C=0;
} //SCCB_E从1到0表示BUS IDLE
/**************检查应答位*******************/
/*bit*/void SCCBRecAck(void)
{
SCCB_C=0;
SCCB_D=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_C=1;
CY=SCCB_D;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_C=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();//因为返回值总是放在CY中的
//return(CY);
}
/***************对SCCB总线产生应答*******************/
void SCCBAck(void)
{
SCCB_D=0;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_C=0;
_nop_();
SCCB_D=1;
}
/*****************不对SCCB总线产生应答***************/
void SCCBNoAck(void)
{
SCCB_D=1;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_C=0;
}
/*******************向SCCB总线写数据*********************/
void SCCBsendByte(unsigned char sendbyte)
{
unsigned char data j=8;
for(;j>0;j--)
{
SCCB_C=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
SCCB_D=CY;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
}
//SCCB_C=0;
}
/**********************从SCCB总线上读数据子程序**********/
unsigned char SCCBreceiveByte(void)
{
register receivebyte,i=8;
SCCB_C=0;
while(i--)
{
SCCB_C=1;
_nop_();
_nop_();
_nop_();
receivebyte=(receivebyte<<1)|SCCB_D;
SCCB_C=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
return(receivebyte);
}
/***************一个简单延时程序************************/
void Delay_1(unsigned long DelayCount)
{
while(DelayCount--);
}
////////////////////////////////////////////////////////////////////
/*void Delay_2(unsigned char DelayCount)
{
unsigned char i=0;
//unsigned char j=200000;
while(i<DelayCount)
{i++;}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -