📄 cam_dis660.c
字号:
/*
Library for control sony camera
V 1.00 build 2003.05.08
support camera list:
16X:
DIS_660(232)
*/
#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
#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;
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;
}
#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];
/*
unsigned char get_dis560(unsigned int ss)
{
if (ss < 0x0098)
return 1;
else if (ss < 0x00bd)
return 7;
else if (ss < 0x00e5)
return 10;
else if (ss < 0x0126)
return 12;
else
return 16;
}
*/
void cam_send_command(unsigned char cam[])
{
unsigned char cs;
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);
}
extern void cam_zoom_focus_direct(void)
{
unsigned int tt;
cam_focus_manu();
delay_xms(30);
cr[0] = 0xc5;
cr[1] = 0x49;
cr[2] = pre[5] & 0x1f;
cr[3] = pre[6];
cam_send_command(cr);
delay_xms(50);
cr[0] = 0xc5;
cr[1] = 0x49;
cr[2] = pre[5] & 0x1f;
cr[3] = pre[6];
cam_send_command(cr);
delay_xms(50);
cr[1] = 0x4a;
cr[2] = pre[8] & 0x1f;
cr[3] = pre[9];
cam_send_command(cr);
delay_xms(50);
cr[1] = 0x4a;
cr[2] = pre[8] & 0x1f;
cr[3] = pre[9];
cam_send_command(cr);
delay_xms(50);
cr[1] = 0x4b;
cr[2] = 0;
cr[3] = pre[7];
cam_send_command(cr);
delay_xms(50);
cr[1] = 0x4b;
cr[2] = 0;
cr[3] = pre[7];
cam_send_command(cr);
delay_xms(50);
cr[1] = 0x4d;
cr[2] = 0;
cr[3] = 0;
cam_send_command(cr);
delay_xms(50);
cr[1] = 0x4d;
cr[2] = 0;
cr[3] = 0;
cam_send_command(cr);
delay_xms(50);
if (pre[7])
set_curlimit(16);
else
{
tt = ((pre[5] << 8) | pre[6]);
//set_curlimit(get_dis560(tt));
set_curlimit((unsigned char)(tt>>5));
}
}
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_);
while ((j--) && (cam_receive_byte() != 0xc5));
for (i=0;i<6;i++) cr[i] = cam_receive_byte();
}
void cam_inq_focu_pos(void)
{
register unsigned char i,j = 30;
cam_send_command(cam_inq_focu_pos_);
while ((j--) && (cam_receive_byte() != 0xc5));
for (i=0;i<5;i++) cr[i] = cam_receive_byte();
}
extern void cam_set_preset(void)
{
cam_inq_focu_pos();
pre[8] = cr[3];
pre[9] = cr[4];
delay_xms(50);
cam_inq_zoom_pos();
pre[5] = cr[3];
pre[6] = cr[4];
pre[7] = cr[5];
}
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};
//maybe use
//unsigned char code cam_set_digi_[] = {0xc5,0x52,0x06,0x00,0x00,0x00};
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() {
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()
{
unsigned int idata tt;
unsigned char idata mm;
unsigned char i,j = 30;
cam_send_command(cam_zoom_stop_);
delay_xms(50);
//set_level_limit();
zoom_change_fg = 1;
zoom_wide_fg = 0;
zoom_tele_fg = 0;
//
if (!f_auto_fg) cam_focus_auto();
delay_xms(80);
//set_level_limit();
{
cam_send_command(cam_inq_zoom_pos_);
while (j--)
{
if (cam_receive_byte() != 0xc5) continue;
again: mm = cam_receive_byte();
if (mm != 0x36)
{
if (mm == 0xc5) goto again;
continue;
}
for (i=1;i<6;i++) cr[i] = cam_receive_byte();
break;
}
//if (cr[5])
// set_curlimit(16);
//else
{
tt = ((cr[3] << 8) | cr[4]);
mm = tt >> 5;
//set_curlimit(get_dis560(tt));
// set_curlimit((unsigned char)(tt>>5));
}
if (mm >= 13)
cur_limit = 3;
else if (mm > 6)
cur_limit = 16 - mm;
else
cur_limit = 10;
}
delay_xms(30);
}
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_);
}
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() {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_);}
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 = 30;
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];
}
extern void cam_icr_set(void)
{
}
extern void set_level_limit(void)
{
unsigned int idata tt;
unsigned char idata mm;
cam_inq_zoom_pos();
//if (cr[5])
// set_curlimit(16);
//else
{
tt = ((cr[3] << 8) | cr[4]);
mm = tt >> 5;
//set_curlimit(get_dis560(tt));
// set_curlimit((unsigned char)(tt>>5));
}
if (mm >= 13)
cur_limit = 3;
else if (mm > 6)
cur_limit = 16 - mm;
else
cur_limit = 10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -