📄 cam_sony2.c
字号:
/*
Library for control sony camera
V 1.00 build 2003.05.08
support camera list:
16X:
SONY450AP(TTL)
SONY450LP(TTL)
18X:
SONY480AP(TTL)
SONY480LP(TTL)
FCB-EX480BP(TTL)
*/
/*
#include <SST89x5x4.H>
//#include <REG54.H>
#include <INTRINS.H>
#include "kernel.h"
#include "camera.h"
#include "config.h"
//#include "cam_func.h"
*/
#include "config.h"
//#define CAM_SONY_LP
#ifndef _CONFIG
sfr WDTC = 0x8f;
sbit ARXD = P1^2;
sbit ATXD = P1^3;
#endif
#ifdef FOCS_40M
void cam_bit_delays(void)
{
register unsigned char j;
for (j=0;j<110;j++);
_nop_();_nop_();
}
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_();
}
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;
EA = 0;
ATXD = 0;
_nop_();
for (i=0;i<8;i++)
{
cam_bit_delays();
cam_data >>= 1;
ATXD = CY;
}
cam_bit_delays();
EA = 1;
ATXD = 1;
cam_bit_delays();
ATXD = 1;
cam_bit_delays();
cam_bit_delays();
}
extern unsigned char cam_receive_byte()
{
unsigned int i = 0;
unsigned char cam_data;
EA = 0;
//RESET;
reset_wdog();
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;
}
goto sr_exit;
}
}
}while ((++i) <10000);
sr_exit:
EA = 1;
return cam_data;
}
bit icr_fg = 0;
bit icr_need_fg = 0;
bit icr_manu_fg = 0;
bit iris_manu_fg = 0;
bit bw_fg = 0;
unsigned char idata cam_id;
unsigned int idata cc_icr = 0;
void cam_send_command(unsigned char *p)
{
while (*p != 0xff)
{
cam_send_byte(*p);
p++;
}
cam_send_byte(0xff);
}
void cam_inquiry_state(void)
{
register unsigned char i;
for (i=40;i<47;i++)
seq[i] = cam_receive_byte();
}
extern void cam_zoom_focus_direct(void)
{
#ifndef SPEED_LO
unsigned int tt;
#endif
cam_focus_manu();
delay_xms(30);
cam_send_byte(0x81); // CAM_ZoomFocus Direct
cam_send_byte(0x01);
cam_send_byte(0x04);
cam_send_byte(0x47);
cam_send_byte((pre[5] >> 4) & 0x0f);
cam_send_byte(pre[5] & 0x0f);
cam_send_byte((pre[6] >> 4) & 0x0f);
cam_send_byte(pre[6] & 0x0f);
cam_send_byte((pre[7] >> 4) & 0x0f);
cam_send_byte(pre[7] & 0x0f);
cam_send_byte((pre[8] >> 4) & 0x0f);
cam_send_byte(pre[8] & 0x0f);
cam_send_byte(0xff);
delay_xms(24);
#ifndef SPEED_LO
tt = ((pre[5] << 8) | pre[6]);
set_curlimit( tt / 0x02e8);
#endif
}
unsigned char code cam_power_on_[] = {0x81,0x01,0x04,0x00,0x02,0xff};
unsigned char code cam_power_off_[] = {0x81,0x01,0x04,0x00,0x03,0xff};
unsigned char code cam_zoom_stop_[] = {0x81,0x01,0x04,0x07,0x00,0xff};
unsigned char code cam_zoom_tele_[] = {0x81,0x01,0x04,0x07,0x27,0xff};
unsigned char code cam_zoom_wide_[] = {0x81,0x01,0x04,0x07,0x37,0xff};
unsigned char code cam_d_zoom_on_[] = {0x81,0x01,0x04,0x06,0x02,0xff};
unsigned char code cam_d_zoom_off_[] = {0x81,0x01,0x04,0x06,0x03,0xff};
unsigned char code cam_icrshot_auto_[] = {0x81,0x01,0x04,0x51,0x02,0xff};
unsigned char code cam_icrshot_on_[] = {0x81,0x01,0x04,0x01,0x02,0xff};
unsigned char code cam_icrshot_off_[] = {0x81,0x01,0x04,0x01,0x03,0xff};
unsigned char code cam_focus_stop_[] = {0x81,0x01,0x04,0x08,0x00,0xff};
unsigned char code cam_focus_far_[] = {0x81,0x01,0x04,0x08,0x02,0xff};
unsigned char code cam_focus_near_[] = {0x81,0x01,0x04,0x08,0x03,0xff};
unsigned char code cam_focus_auto_[] = {0x81,0x01,0x04,0x38,0x02,0xff};
unsigned char code cam_focus_manu_[] = {0x81,0x01,0x04,0x38,0x03,0xff};
unsigned char code cam_iris_up_[] = {0x81,0x01,0x04,0x0b,0x02,0xff};
unsigned char code cam_iris_down_[] = {0x81,0x01,0x04,0x0b,0x03,0xff};
unsigned char code cam_wb_auto_[] = {0x81,0x01,0x04,0x35,0x00,0xff};
unsigned char code cam_wb_manu_[] = {0x81,0x01,0x04,0x35,0x05,0xff};
unsigned char code cam_ae_auto_[] = {0x81,0x01,0x04,0x39,0x00,0xff};
unsigned char code cam_ae_manu_[] = {0x81,0x01,0x04,0x39,0x03,0xff};
unsigned char code cam_backlight_on_[] = {0x81,0x01,0x04,0x33,0x02,0xff};
unsigned char code cam_backlight_off_[] = {0x81,0x01,0x04,0x33,0x03,0xff};
unsigned char code cam_reverse_on_[] = {0x81,0x01,0x04,0x61,0x02,0xff};
unsigned char code cam_reverse_off_[] = {0x81,0x01,0x04,0x61,0x03,0xff};
unsigned char code cam_freeze_on_[] = {0x81,0x01,0x04,0x62,0x02,0xff};
unsigned char code cam_freeze_off_[] = {0x81,0x01,0x04,0x62,0x03,0xff};
unsigned char code cam_picture_off_[] = {0x81,0x01,0x04,0x63,0x00,0xff};
unsigned char code cam_picture_bw_[] = {0x81,0x01,0x04,0x63,0x04,0xff};
unsigned char code cam_display_on_[] = {0x81,0x01,0x04,0x15,0x02,0xff};
unsigned char code cam_display_off_[] = {0x81,0x01,0x04,0x15,0x03,0xff};
unsigned char code cam_inq_zoom_pos_[] = {0x81,0x09,0x04,0x47,0xff};
unsigned char code cam_inq_focus_pos_[] = {0x81,0x09,0x04,0x48,0xff};
unsigned char code cam_inq_gain_pos_[] = {0x81,0x09,0x04,0x4C,0xff};
#ifdef CLOSE_ASS
unsigned char code _cam_slowshutter_manu_[] = { 0x81,0x01,0x04,0x5a,0x03,0xff};
#endif
extern void cam_focus_auto() {f_auto_fg = 1;cam_send_command(cam_focus_auto_);}
/*
extern bit fast_focu;
extern void cam_focus_auto()
{
unsigned char code _cam_set_af_mode[] = {0x81,0x01,0x04,0x27,0x00,0x01,0x00,0x01,0xff};
unsigned char code _cam_af_mode[] = {0x81,0x01,0x04,0x57,0x01,0xff};
unsigned char code _cam_af_mode2[] = {0x81,0x01,0x04,0x57,0x00,0xff};
f_auto_fg = 1;
if (fast_focu)
{
cam_send_command(_cam_set_af_mode);
delay_xms(20);
cam_send_command(_cam_af_mode);
delay_xms(20);
}
else
{
cam_send_command(_cam_af_mode2);
delay_xms(20);
}
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() {
cam_focus_manu();
delay_xms(12);
cam_send_command(cam_focus_far_);
}
extern void cam_zoom_wide() {cam_send_command(cam_zoom_wide_);}
extern void cam_zoom_tele() {cam_send_command(cam_zoom_tele_);}
extern void cam_zoom_stop() {
cam_send_command(cam_zoom_stop_);
delay_xms(24);
#ifndef SPEED_LO
set_level_limit();
delay_xms(24);
#endif
cam_focus_auto();
}
extern void cam_focus_near() {
cam_focus_manu();
delay_xms(24);
cam_send_command(cam_focus_near_);
}
extern void cam_focus_stop() {
cam_send_command(cam_focus_stop_);
}
#ifdef CONTROL_IRIS
extern void cam_iris_open()
{
cam_ae_manu();
delay_xms(30);
cam_send_command(cam_iris_up_);
}
extern void cam_iris_close()
{
cam_ae_manu();
delay_xms(30);
cam_send_command(cam_iris_down_);
}
#else
extern void cam_iris_open() {cam_send_command(cam_iris_up_);}
extern void cam_iris_close() {cam_send_command(cam_iris_down_);}
#endif
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() {cam_send_command(cam_freeze_on_);}
extern void cam_freeze_off() {cam_send_command(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() {cam_send_command(cam_display_on_);}
extern void cam_display_off() {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_);
#ifdef CAM_SONY_LP
if (!bw_fg)
{
delay_xms(20);
cam_send_command(cam_picture_bw_);
}
#endif
}
extern void cam_icrshot_on() {cam_send_command(cam_icrshot_on_);}
extern void cam_icrshot_auto() {cam_send_command(cam_icrshot_auto_);}
extern void cam_reset2() {}
extern void cam_icrshot_off() {cam_send_command(cam_icrshot_off_);
#ifdef CAM_SONY_LP
if (!bw_fg)
{
delay_xms(20);
cam_send_command(cam_picture_off_);
}
#endif
}
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() {bw_fg = 0;cam_send_command(cam_picture_off_);}
extern void cam_picture_bw() {bw_fg = 1;cam_send_command(cam_picture_bw_);}
extern void cam_inq_zoom_pos() {cam_send_command(cam_inq_zoom_pos_);}
extern void cam_inq_focus_pos() {cam_send_command(cam_inq_focus_pos_);}
extern void cam_get_id(void)
{
cam_id = 1;
}
#ifdef CLOSE_ASS
extern void cam_slowshutter_manu(void)
{
cam_send_command(_cam_slowshutter_manu_);
delay_xms(100);
cam_send_command(_cam_slowshutter_manu_);
}
#endif
extern void cam_icr_set(void)
{
cc_icr ++;
if (cc_icr != 0xffff) return;
// if (manual_fg) return;
// if (cont_fg) return;
if (TR1 || TR0) return;
if (icr_manu_fg) return;
cam_send_command(cam_inq_gain_pos_);
cam_inquiry_state();
delay_xms(20);
if (seq[42] || seq[43] || seq[44]) goto icr_off;
if (seq[45] >= 0x06)
{
if (_testbit_(icr_need_fg))
{
cam_icrshot_on();
icr_fg = 1;
delay_xms(20);
cam_icrshot_on();
}
else if (!icr_fg)
icr_need_fg = 1;
}
else
{
icr_off:
icr_need_fg = 0;
if (_testbit_(icr_fg))
{
cam_icrshot_off();
delay_xms(20);
cam_icrshot_off();
}
}
}
extern void set_level_limit(void)
{
unsigned char zh,zl;
unsigned int tt;
//REN = 0;
cam_inq_zoom_pos();
cam_inquiry_state();
//REN = 1;
zh = ((seq[42] << 4) & 0xf0) | (seq[43] & 0x0f);
zl = ((seq[44] << 4) & 0xf0) | (seq[45] & 0x0f);
tt = ((zh << 8) | zl);
set_curlimit( tt / 0x04c2);//2E8
}
extern void cam_set_preset(void)
{
REN = 0;
cam_inq_zoom_pos(); // read zoom position
cam_inquiry_state();
REN = 1;
pre[5] = ((seq[42] << 4) & 0xf0) | (seq[43] & 0x0f);
pre[6] = ((seq[44] << 4) & 0xf0) | (seq[45] & 0x0f);
delay_xms(20);
REN = 0;
cam_inq_focus_pos(); // read focus position
cam_inquiry_state();
REN = 1;
pre[7] = ((seq[42] << 4) & 0xf0) | (seq[43] & 0x0f);
pre[8] = ((seq[44] << 4) & 0xf0) | (seq[45] & 0x0f);
}
extern void cam_re_reset(void)
{
}
extern void cam_menu_on()
{}
extern void cam_menu_off()
{}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -