⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cam_lg680.c

📁 这是监视器行业常见摄像头与球机通讯协议的C语言源代码
💻 C
字号:
/*
	Library for control sony camera
	V 1.00 build 2003.05.08
	support camera list:

	16X:
		DIS_660(232)
*/

// V1.01 build 2003.05.29 预置点操作关所有中断

#include <REG54.H>
#include <INTRINS.H>
#include "kernel.h"
#include "camera.h"
//#include "cam_func.h"

//发送或接收数据时关中断

#ifndef _CONFIG
	sfr WDTC = 0x8f;
	sbit ARXD = P1^2;
	sbit ATXD = P1^3;
#endif


//为9600波特率的摄像机使用
#ifdef FOCS_40M

void cam_bit_delays(void)
{

	register unsigned char j;

	for (j=0;j<110;j++);
	_nop_();_nop_();

	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
/*
#pragma asm

	PUSH 	07H			;2
	MOV		R7,#172		;2*172 = 342
	DJNZ 	R7,$		;2
	POP	 	07H			;2
	RET					;2

#pragma endasm
*/
}

void cam_bit_delayr(void)
{
	register unsigned char j;

	for (j=0;j<108;j++);
}

void half_bit_delay(void)
{
	register unsigned char j;

	for (j=0;j<60;j++);
}

#else

void cam_bit_delays(void)
{
	register unsigned char j;

	for (j=0;j<59;j++);
	_nop_();

	_nop_();_nop_();
	_nop_();_nop_();
	_nop_();_nop_();
}

void cam_bit_delayr(void)
{
	register unsigned char j;

	for (j=0;j<56;j++);
	_nop_();
}

void half_bit_delay(void)
{
	register unsigned char j;

	for (j=0;j<32;j++);
}

#endif

extern void cam_send_byte(unsigned char cam_data)
{
	register unsigned char i;
   /*
	cam_data = cam_data;
#pragma asm

		CLR ES
    	MOV R6,#09H
    	SETB C
    	CLR ATXD                	;1
    	NOP							;1
		NOP							;1
again_1:LCALL cam_bit_delays        ;2
        MOV A,R7            		;1
        RRC A               		;1
        MOV R7,A            		;1
        MOV ATXD,C         			;1
        DJNZ R6,again_1             ;2
        LCALL cam_bit_delays
        SETB ES
		RET

#pragma endasm
*/

//	EA = 0;
	ATXD = 0;							// 发送起始码
	_nop_();
	_nop_();
	_nop_();

	for (i=0;i<8;i++)
	{
		cam_bit_delays();
		cam_data >>= 1;
		ATXD = CY;
	}
	cam_bit_delays();
//	EA = 1;
	_nop_();_nop_();_nop_();_nop_();
	ATXD = 1;						// 发送结束码
	cam_bit_delays();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();
	_nop_();

}

extern unsigned char cam_receive_byte()
{
	unsigned int i = 0;
	unsigned char cam_data;

//	ES = 0;
	RESET;
	do
	{
		ARXD = 1;
		if (!ARXD)
		{
			half_bit_delay();
			ARXD = 1;
			if (!ARXD)
			{
				cam_data = 0;
				_nop_();_nop_();_nop_();
				_nop_();_nop_();_nop_();_nop_();
				for(i=0;i<8;i++)					// 开始移位接收数据
				{
					cam_bit_delayr();
					cam_data >>= 1;
					ARXD = 1;
					if (ARXD) cam_data |= 0x80;		//
				}
				half_bit_delay();
				goto sr_exit;
			}
		}
	}while ((++i) <10000);
sr_exit:
//	EA = 1;
	return cam_data;
}

#define ZOOM_POS	0x0022

bit icr_fg = 0;
bit icr_need_fg = 0;
bit icr_manu_fg = 0;
bit iris_manu_fg = 0;
unsigned char data cam_id;
unsigned char data cr[9];

void cam_send_command(unsigned char cam[])
{
	unsigned char cs;
	//EA = 0;
	cam_send_byte(cam[0]);
	cs = cam[0];
	cam_send_byte(cam[1]);
	cs += cam[1];
	cam_send_byte(cam[2]);
	cs += cam[2];
	cam_send_byte(cam[3]);
	cs += cam[3];
	cam_send_byte(cam_id);
	cs += cam_id;
	cam_send_byte(cs);
	//EA = 1;
}

extern void cam_zoom_focus_direct(void)
{
	cam_focus_manu();
	delay_xms(50);

	cr[0] = 0xc5;
	cr[1] = 0x49;
	cr[2] = (pre[5] & 0x0f) | 0x30;
	cr[3] = pre[6];
	cam_send_command(cr);
	delay_xms(50);

	cr[0] = 0xc5;
	cr[1] = 0x49;
	cr[2] = (pre[5] & 0x0f) | 0x30;
	cr[3] = pre[6];
	cam_send_command(cr);
	delay_xms(50);

	cr[1] = 0x4a;
	cr[2] = (pre[8] & 0x0f) | 0x30;
	cr[3] = pre[9];
	cam_send_command(cr);
	delay_xms(50);

	cr[1] = 0x4a;
	cr[2] = (pre[8] & 0x0f) | 0x30;
	cr[3] = pre[9];
	cam_send_command(cr);
	delay_xms(50);

	cr[1] = 0x4b;
	cr[2] = 3;
	cr[3] = pre[7];
	cam_send_command(cr);
	delay_xms(50);

	cr[1] = 0x4b;
	cr[2] = 3;
	cr[3] = pre[7];
	cam_send_command(cr);
	delay_xms(50);

	cr[1] = 0x4d;
	cr[2] = 3;
	cr[3] = 0;
	cam_send_command(cr);
	delay_xms(50);

	cr[1] = 0x4d;
	cr[2] = 3;
	cr[3] = 0;
	cam_send_command(cr);
	delay_xms(50);
}

unsigned char code cam_inq_zoom_pos_[] = {0xc5,0x36,0x00,0x00,0x00,0x00};
unsigned char code cam_inq_focu_pos_[] = {0xc5,0x37,0x00,0x00,0x00,0x00};

void cam_inq_zoom_pos(void)
{
	register unsigned char i,j = 30;

	cam_send_command(cam_inq_zoom_pos_);
	EA = 0;
	while ((j--) && (cam_receive_byte() != 0xc5));
	for (i=0;i<6;i++) cr[i] = cam_receive_byte();
	EA = 1;
}

void cam_inq_focu_pos(void)
{
	register unsigned char i,j = 30;

	cam_send_command(cam_inq_focu_pos_);
	EA = 0;
	while ((j--) && (cam_receive_byte() != 0xc5));
	for (i=0;i<5;i++) cr[i] = cam_receive_byte();
	EA = 1;
}

extern void cam_set_preset(void)
{
	EA = 0;
	cam_inq_zoom_pos();
	delay_xms(50);
	cam_inq_zoom_pos();
	pre[5] = cr[3];
  	pre[6] = cr[4];
	pre[7] = cr[5];
	delay_xms(50);

	cam_inq_focu_pos();
	delay_xms(50);
	cam_inq_focu_pos();
	pre[8] = cr[3];
	pre[9] = cr[4];
	delay_xms(50);
	EA = 1;
}

unsigned char code cam_read_id_[]       = {0xc5,0xcc,0x00,0x00,0x00,0x00};
unsigned char code cam_power_on_[]	= {0xc5,0x3a,0x00,0x00,0x00,0x00};
unsigned char code cam_power_off_[]	= {0xc5,0x3e,0x00,0x00,0x00,0x00};
unsigned char code cam_zoom_stop_[]	= {0xc5,0x5f,0x0c,0x00,0x00,0x00};
unsigned char code cam_zoom_tele_[]	= {0xc5,0x5f,0x01,0x00,0x00,0x00};
unsigned char code cam_zoom_wide_[]	= {0xc5,0x5f,0x03,0x00,0x00,0x00};
unsigned char code cam_d_zoom_on_[]	= {0xc5,0xaa,0x6e,0x01,0x00,0x00};
unsigned char code cam_d_zoom_off_[]    = {0xc5,0xaa,0x6e,0x00,0x00,0x00};
unsigned char code cam_focus_stop_[]	= {0xc5,0x5f,0x0c,0x00,0x00,0x00};
unsigned char code cam_focus_far_[]	= {0xc5,0x5f,0x38,0x00,0x00,0x00};
unsigned char code cam_focus_near_[]	= {0xc5,0x5f,0x39,0x00,0x00,0x00};
unsigned char code cam_focus_auto_[]	= {0xc5,0xaa,0x73,0x00,0x00,0x00};
unsigned char code cam_focus_manu_[]	= {0xc5,0xaa,0x73,0x01,0x00,0x00};
unsigned char code cam_iris_up_[]	= {0xc5,0x5f,0x42,0x00,0x00,0x00};
unsigned char code cam_iris_down_[]	= {0xc5,0x5f,0x43,0x00,0x00,0x00};
unsigned char code cam_wb_auto_[]	= {0xc5,0xaa,0x65,0x00,0x00,0x00};
unsigned char code cam_wb_manu_[]	= {0xc5,0xaa,0x65,0x04,0x00,0x00};
unsigned char code cam_ae_auto_[] 	= {0xc5,0xaa,0x60,0x00,0x00,0x00};
unsigned char code cam_ae_manu_[]	= {0xc5,0xaa,0x60,0x02,0x00,0x00};
unsigned char code cam_backlight_on_[]  = {0xc5,0xaa,0x70,0x01,0x00,0x00};
unsigned char code cam_backlight_off_[] = {0xc5,0xaa,0x70,0x00,0x00,0x00};
unsigned char code cam_reverse_on_[]	= {0xc5,0xaa,0x7f,0x01,0x00,0x00};
unsigned char code cam_reverse_off_[]	= {0xc5,0xaa,0x7f,0x00,0x00,0x00};
unsigned char code cam_picture_off_[]	= {0xc5,0xaa,0x71,0x01,0x00,0x00};
unsigned char code cam_picture_bw_[]	= {0xc5,0xaa,0x71,0x00,0x00,0x00};

unsigned char code cam_display_on_[]	= {0xc5,0xaa,0x64,0x24,0x00,0x00};
unsigned char code cam_display_off_[]	= {0xc5,0xaa,0x64,0x00,0x00,0x00};
//unsigned char code cam_display_on_[]	= {0xc5,0xaa,0x63,0x01,0x00,0x00};
//unsigned char code cam_display_off_[]	= {0xc5,0xaa,0x63,0x00,0x00,0x00};
//maybe use
//unsigned char code cam_set_digi_[]    = {0xc5,0x52,0x06,0x00,0x00,0x00};

bit menu_fg = 0;

extern void cam_focus_auto()		{f_auto_fg = 1;cam_send_command(cam_focus_auto_);}
extern void cam_focus_manu()		{f_auto_fg = 0;cam_send_command(cam_focus_manu_);}
extern void cam_focus_far()		{
							if (!menu_fg)
							{
								cam_focus_manu();
								delay_xms(24);
							}
								cam_send_command(cam_focus_far_);
							}

extern void cam_zoom_wide()
{
	zoom_change_fg = 0;
	cam_send_command(cam_zoom_wide_);
	delay_xms(50);
}

extern void cam_zoom_tele()
{
	zoom_change_fg = 0;
	cam_send_command(cam_zoom_tele_);
	delay_xms(50);
}

extern void cam_zoom_stop()
{
	cam_send_command(cam_zoom_stop_);
	delay_xms(50);

	if (!menu_fg)
	{						//
	if (!f_auto_fg) cam_focus_auto();
	delay_xms(80);
	}
}

extern void cam_focus_near()		{
								if (!menu_fg)
								{
								cam_focus_manu();
								delay_xms(24);
								}
								cam_send_command(cam_focus_near_);

							}
extern void cam_focus_stop()		{
								cam_send_command(cam_focus_stop_);
							}

extern void cam_iris_open()		{cam_send_command(cam_iris_up_);delay_xms(12);cam_send_command(cam_zoom_stop_);}
extern void cam_iris_close()		{cam_send_command(cam_iris_down_);delay_xms(12);cam_send_command(cam_zoom_stop_);}
extern void cam_power_on()			{cam_send_command(cam_power_on_);}
extern void cam_power_off()		{cam_send_command(cam_power_off_);}
extern void cam_ae_auto() 			{iris_manu_fg = 0;cam_send_command(cam_ae_auto_);}
extern void cam_ae_manu()			{iris_manu_fg = 1;cam_send_command(cam_ae_manu_);}
extern void cam_freeze_on()		{}
extern void cam_freeze_off()		{}
extern void cam_backlight_on()		{cam_send_command(cam_backlight_on_);}
extern void cam_backlight_off()	{cam_send_command(cam_backlight_off_);}
extern void cam_reverse_on()		{cam_send_command(cam_reverse_on_);}
extern void cam_reverse_off()		{cam_send_command(cam_reverse_off_);}
extern void cam_display_on()		{menu_fg = 1;cam_send_command(cam_display_on_);}
extern void cam_display_off()		{menu_fg = 0;cam_send_command(cam_display_off_);}
extern void cam_d_zoom_on()		{cam_send_command(cam_d_zoom_on_);}
extern void cam_d_zoom_off()		{cam_send_command(cam_d_zoom_off_);}
extern void cam_icrshot_on()		{}
extern void cam_icrshot_off()		{}
extern void cam_wb_auto()			{cam_send_command(cam_wb_auto_);}
extern void cam_wb_manu()			{cam_send_command(cam_wb_manu_);}
extern void cam_picture_off()  	{cam_send_command(cam_picture_off_);}
extern void cam_picture_bw()   	{cam_send_command(cam_picture_bw_);}

extern void cam_get_id(void)
{
	register unsigned char i,j = 100,t = 30;

	delay_xms(200);
	while (t--)
	{

	cam_send_command(cam_read_id_);
	while ((j--) && (cam_receive_byte() != 0xc5));
	for (i=0;i<4;i++) cr[i] = cam_receive_byte();
	cam_id = cr[3];
	delay_xms(50);

	cam_send_command(cam_read_id_);
	while ((j--) && (cam_receive_byte() != 0xc5));
	for (i=0;i<4;i++) cr[i] = cam_receive_byte();
	if (cam_id == cr[3]) break;
	delay_xms(50);
	}

	cr[0] = 0xc5;
	cr[1] = 0x78;
	cr[2] = id;
	cr[3] = 0x00;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);

	cr[0] = 0xc5;
	cr[1] = 0x78;
	cr[2] = id;
	cr[3] = 0x00;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);

	cam_id = id;
	//cam_id = 0x01;
/*
	cr[0] = 0xc5;
	cr[1] = 0x78;
	cr[2] = cam_id;
	cr[3] = 0x00;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);
	cr[0] = 0xc5;
	cr[1] = 0x78;
	cr[2] = cam_id;
	cr[3] = 0x00;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);

	cr[0] = 0xc5;
	cr[1] = 0xaa;
	cr[2] = 0x6e;
	cr[3] = 0x01;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);

	cr[0] = 0xc5;
	cr[1] = 0xaa;
	cr[2] = 0x65;
	cr[3] = 0x00;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);

	cr[0] = 0xc5;
	cr[1] = 0xaa;
	cr[2] = 0x73;
	cr[3] = 0x00;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);

	cr[0] = 0xc5;
	cr[1] = 0xaa;
	cr[2] = 0x60;
	cr[3] = 0x00;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);

	cr[0] = 0xc5;
	cr[1] = 0xaa;
	cr[2] = 0x6a;
	cr[3] = 0x00;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);
	*/

	/*
	cr[0] = 0xc5;
	cr[1] = 0xaa;
	cr[2] = 0x96;
	cr[3] = 0x01;
	cr[4] = cam_id;
	cam_send_command(cr);
	delay_xms(50);
	*/
}


extern void cam_icr_set(void)
{
}

extern void set_level_limit(void)
{
	set_curlimit(1);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -