📄 demo.c
字号:
//////////////////////////////////////////////
// 1.在程序中"break point"注释行语句上加软件断点
// 2.菜单view->graph->Image:
// color space = RGB
// Start Address -R Source = y
// Start Address -G Source = y
// Start Address -B Source = y
// Lines Per Display = 96
// Pixels Per Line = 120
// Byte Packing to Fill 32 Bits = No
// Image Origin = Top Left
// 3.按F5运行到断点可显示采集图像
// 4.转动摄像头后再按F5可再次采集
///////////////////////////////////////
#include "math.h"
#include "scancode.h"
#include "stdio.h"
#define SPSA0 *(unsigned int *)0x38
#define SPSD0 *(unsigned int *)0x39
#define REGISTERCLKMD (*(unsigned int *)0x58)
#define REGISTERCLK (*(unsigned int *)0x29)
#define WAITSTATUS (*(unsigned int *)0x28)
#define IDKCCMDRESET 2
#define IDKCCMDCAPTURE 4
#define IDKCCMDRESETRP 8
#define IDKCCMDRESETWP 0x10
#define IDKCCMDCOLOR 0x20
#define IDKIMGREADY 2
ioport unsigned char port8000;
ioport unsigned char port8001;
ioport unsigned char port8002;
ioport unsigned char port8007;
ioport unsigned char porta000;
ioport unsigned char porta001;
ioport unsigned char porta004;
ioport unsigned int porta005;
ioport unsigned int porta006;
ioport unsigned char porta008;
ioport unsigned char porta00c;
#define I2C_REG porta008
void Delay(unsigned int nTime);
void StartIIC(void);
void StopIIC(void);
void AckIIC(void);
void WriteIIC(unsigned char data);
void Init5150(void);
void DelayMSEC(unsigned int nDelay);
void Close5150(void);
void SaveAsBMPFile(int nWidth,int nHeight);
#define VIDEOWIDTH 722
#define VIDEOHEIGHT 288
#define IMGWIDTH 120
#define IMGHEIGHT 96
#define XSTART 300
#define YSTART 100
#define XSAMPLE 2
#define YSAMPLE 1
unsigned char buffer[724],y[IMGWIDTH*IMGHEIGHT];
unsigned long imgoffset;
ioport unsigned int port0;
main()
{
int i,j,x,xx,xxx;
int c,xstart,ystart,xsample,ysample;
unsigned int uWork;
port0=1;
xx=1;
for ( j=0;j<72;j++ )
{
for ( i=0;i<90;i++ )
y[j*90+i]=0;
}
port8000=0; // 初始化ICETEK-CTR
port8000=0x80;
port8000=0;
port8007=0;
port8007=0x40;
c=0;
xsample=XSAMPLE;
ysample=YSAMPLE;
xstart=XSTART;
ystart=YSTART;
REGISTERCLKMD=0; // DSP低速运行
REGISTERCLK=0x6002; // 设置CLKOUT输出
WAITSTATUS&=0x08fff; // 等待状态
Init5150(); // 初始化ICETEK-TVP5150-E
REGISTERCLKMD=0x09007; // DSP提速运行
WAITSTATUS=0x09fff; // 至少1个等待状态
REGISTERCLK=0x6002;
xxx=porta00c;
while ( 1 )
{
if ( xx )
{
porta000=IDKCCMDRESET; porta000=0; //复位ICETEK-TVP5150-E
Delay(16);
porta000=IDKCCMDRESETWP; // 复位FIFO写指针
porta000=IDKCCMDCAPTURE; // 开始采集图象
do
{
xxx=porta00c; // 读状态寄存器
} while ( (xxx&2)==0 ); // 等待图象准备好
porta000=0;
}
x=0;
porta000=IDKCCMDRESETRP; // 复位FIFO读指针
Delay(16);
porta000=0;
Delay(16);
uWork=porta004; // 读取首个数据并放弃
Delay(16);
x=0;
for ( i=0;i<724;i++ ) buffer[i]=0;
for ( i=0;i<c;i++ ) uWork=porta004;
for ( j=0;j<VIDEOHEIGHT;j++ ) // 读取整幅图象722x288
{ // 并抽样生成120x96图象
for ( i=0;i<VIDEOWIDTH;i++ )
{
buffer[i]=porta004;
}
if ( x<IMGHEIGHT && j>=ystart &&(j%ysample==0) )
{
for ( i=0;i<IMGWIDTH;i++ )
{
y[x*IMGWIDTH+i]=buffer[i*xsample+xstart];
}
x++;
}
}
xxx=porta00c;
SaveAsBMPFile(VIDEOWIDTH,VIDEOHEIGHT);
x=0; // BREAK POINT
x=0;
x=0;
}
}
void Delay(unsigned int nDelay)
{
int i,j,k=0;
for ( i=0;i<nDelay;i++ )
for ( j=0;j<64;j++ )
k++;
}
void StartIIC(void)
{
I2C_REG = 0x05; /* "00100101":sda,scl = '1' */
DelayMSEC(1);
I2C_REG = 0x04; /* "00100100":sda= '0',scl = '1' */
DelayMSEC(1);
}
void StopIIC(void)
{
I2C_REG = 0x024; /* "00100101":sda = '0',scl = '1' */
DelayMSEC(1);
I2C_REG = 0x025; /* "00100101":sda,scl = '1' */
DelayMSEC(1);
}
void AckIIC(void)
{
I2C_REG = 0x020; /* "00100101":sda='z',scl = '0' */
I2C_REG = 0x022; /* "00100101":sda='z',scl = '0' */
DelayMSEC(1);
I2C_REG = 0x026; /* "00100101":sda='z',scl = '1' */
DelayMSEC(1);
I2C_REG = 0x022; /* "00100101":sda='z',scl = '0' */
DelayMSEC(1);
I2C_REG = 0x021; /* "00100101":sda='1',scl = '0' */
DelayMSEC(1);
}
void WriteIIC(unsigned char data)
{
unsigned char BitCounter = 8;
unsigned char Temp;
unsigned int reg_val;
reg_val = 0x020;
I2C_REG = 0x20; /*SCL 置低 sda 置低*/
DelayMSEC(1); /*延时*/
do{
Temp = data;
reg_val &= 0x0fffffffb;
I2C_REG = reg_val; /*SCL 置低*/
DelayMSEC(1); /*延时*/
if((Temp&0x80)==0x80)
reg_val |= 0x01; /*如果最高位是1*/
else
reg_val &= 0x0fffffe;
I2C_REG = reg_val; /*设置SDA*/
DelayMSEC(1); /*延时*/
reg_val |= 0x004;
I2C_REG = reg_val; /*SCL 置高*/
DelayMSEC(1); /*延时*/
Temp = data<<1;
data = Temp;
BitCounter --;
}while(BitCounter);
reg_val &= 0x0fffffffb;
I2C_REG = reg_val; /*SCL 置低*/
DelayMSEC(3); /*延时*/
}
void Init5150(void)
{
StartIIC();
WriteIIC(0x0ba);
AckIIC();
WriteIIC(0x03); // TVP5150控制寄存器3,取值0x8F
AckIIC();
WriteIIC(0x08f);
AckIIC();
StopIIC();
DelayMSEC(10);
}
void DelayMSEC(unsigned int nDelay)
{
unsigned int i,k;
for ( i=0;i<nDelay*64;i++ )
{
k++;
}
}
void SaveAsBMPFile(int nWidth,int nHeight)
{
FILE *fp;
unsigned int uWork;
int i,j;
if ( fp=fopen("video.bmp","wb+") )
{
uWork=0x42; fwrite(&uWork,1,1,fp); // BM
uWork=0x4d; fwrite(&uWork,1,1,fp);
uWork=0x36; fwrite(&uWork,1,1,fp); // size=14+40+720*288+4*256
uWork=0x31; fwrite(&uWork,1,1,fp);//00,03,2e,36
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp); // reserved
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=36; fwrite(&uWork,1,1,fp); // image offset=54
uWork=4; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=40; fwrite(&uWork,1,1,fp); // struct size=40
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0x78; fwrite(&uWork,1,1,fp); // width=720
uWork=0; fwrite(&uWork,1,1,fp);//00,00,02,d0
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0x60; fwrite(&uWork,1,1,fp); // height=288
uWork=0; fwrite(&uWork,1,1,fp);//00,00,01,20
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=1; fwrite(&uWork,1,1,fp); // Planes & BitCount=0x080001
uWork=0; fwrite(&uWork,1,1,fp);
uWork=8; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp); // Compression=0
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0x00; fwrite(&uWork,1,1,fp); // image size=720*288
uWork=0x2d; fwrite(&uWork,1,1,fp);//00,03,2a,00
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0x0c4; fwrite(&uWork,1,1,fp); // x pixels/m=3780
uWork=0x0e; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0x0c4; fwrite(&uWork,1,1,fp); // y pixels/m=3780
uWork=0x0e; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp); // color used=0
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp); // important color=0
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
uWork=0; fwrite(&uWork,1,1,fp);
for ( i=0;i<256;i++ )
{
uWork=i;
fwrite(&uWork,1,1,fp);
fwrite(&uWork,1,1,fp);
fwrite(&uWork,1,1,fp);
uWork=0;
fwrite(&uWork,1,1,fp);
}
for(j=95;j>=0;j--)
{
imgoffset=(unsigned long int)j*120+2;
imgoffset%=11520;
for ( i=0;i<120;i++,imgoffset++ )
{
uWork=y[imgoffset];
fwrite(&uWork,1,1,fp);
}
}
fclose(fp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -