📄 cnb-vp200.c
字号:
/*
Library for control c&b camera
V 1.00 build 2003.05.08
support camera list:
16X:
18X:
CNB-AP200
*/
#include <REG54.H>
#include <INTRINS.H>
#include <STRING.H>
#include "kernel.h"
#include "camera.h"
//#include "cam_func.h"
#include "config.h"
unsigned char code asc[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
unsigned char asc2hex(unsigned char asc)
{
return ((asc < 0x3a) ? (asc - 0x30) : (asc - 0x37));
}
unsigned char asc2hex2(unsigned char hi,lo)
{
return ((asc2hex(hi) << 4) | asc2hex(lo));
}
unsigned char hex2aschi(unsigned char hex)
{
return asc[(hex & 0xf0) >> 4];
}
unsigned char hex2asclo(unsigned char hex)
{
return asc[hex & 0x0f];
}
unsigned char data cam_id =0x00;
unsigned char data cr[9];
bit iris_manu_fg;
//发送或接收数据时关中断
#ifndef _CONFIG
//sfr WDTC = 0x8f;
sbit ARXD = P1^2;
sbit ATXD = P1^3;
#endif
//for 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++);
}
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;
}
bit bw_fg = 0;
bit icr_manu_fg = 0;
/*
void cam_send_command(unsigned char *p)
{
unsigned char cs;
cam_send_byte(*p);
cs = *p;
p++;
cam_send_byte(*p);
cs += *p;
p++;
cam_send_byte(*p);
cs += *p;
p++;
cam_send_byte(*p);
cs += *p;
p++;
cam_send_byte(*p);
cs += *p;
p++;
cam_send_byte(*p);
cs += *p;
p++;
cam_send_byte(*p);
cs += *p;
p++;
cam_send_byte(*p);
cs += *p;
p++;
cam_send_byte(*p);
cs += *p;
cam_send_byte(hex2aschi(cs));
cam_send_byte(hex2asclo(cs));
}
*/
void cam_send_command(unsigned char *p)
{
unsigned char *pp;
unsigned char cs = 0;
for(pp=p;pp<p+9;pp++)
{
cam_send_byte(*pp);
cs += *pp;
}
cam_send_byte(hex2aschi(cs));
cam_send_byte(hex2asclo(cs));
}
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)
{
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);
set_curlimit(((pre[5] << 8) | pre[6])/ 0x02e8);
}
//unsigned char code cam_inq_gain_pos_[] = {0x2a,0x30,0x30,0x37,0x33,0x30,0x30,0x30,0x30};
unsigned char code cam_power_on_[] = {0x2a,0x30,0x30,0x37,0x36,0x30,0x31,0x30,0x30};
unsigned char code cam_power_off_[] = {0x2a,0x30,0x30,0x37,0x36,0x30,0x30,0x30,0x30};
unsigned char code cam_zoom_stop_[] = {0x2a,0x30,0x30,0x37,0x35,0x30,0x39,0x30,0x30};
unsigned char code cam_zoom_tele_[] = {0x2a,0x30,0x30,0x37,0x35,0x30,0x32,0x30,0x30};
unsigned char code cam_zoom_wide_[] = {0x2a,0x30,0x30,0x37,0x35,0x30,0x34,0x30,0x30};
unsigned char code cam_d_zoom_on_[] = {0x2a,0x30,0x30,0x37,0x35,0x30,0x39,0x30,0x30};
unsigned char code cam_d_zoom_off_[] = {0x2a,0x30,0x30,0x37,0x35,0x30,0x39,0x30,0x30};
unsigned char code cam_focus_stop_[] = {0x2a,0x30,0x30,0x37,0x35,0x30,0x39,0x30,0x30};
unsigned char code cam_focus_far_[] = {0x2a,0x30,0x30,0x37,0x35,0x30,0x35,0x30,0x30};
unsigned char code cam_focus_near_[] = {0x2a,0x30,0x30,0x37,0x35,0x30,0x36,0x30,0x30};
unsigned char code cam_focus_auto_[] = {0x2a,0x30,0x30,0x34,0x45,0x30,0x30,0x30,0x30};
unsigned char code cam_focus_manu_[] = {0x2a,0x30,0x30,0x34,0x46,0x30,0x30,0x30,0x30};
unsigned char code cam_ae_auto_[] = {0x2a,0x30,0x30,0x38,0x31,0x30,0x30,0x30,0x30};
unsigned char code cam_ae_manu_[] = {0x2a,0x30,0x30,0x38,0x31,0x30,0x32,0x30,0x30};//{0x2a,0x30,0x30,0x37,0x35,0x32,0x44,0x30,0x30};
unsigned char code cam_set_iris_level_[]= {0x2a,0x30,0x30,0x38,0x41,0x31,0x30,0x30,0x30};
unsigned char code cam_iris_up_[] = {0x2a,0x30,0x30,0x37,0x35,0x32,0x45,0x30,0x30};
unsigned char code cam_iris_down_[] = {0x2a,0x30,0x30,0x37,0x35,0x32,0x46,0x30,0x30};
unsigned char code cam_wb_auto_[] = {0x2a,0x30,0x30,0x42,0x32,0x30,0x30,0x30,0x30};
unsigned char code cam_wb_manu_[] = {0x2a,0x30,0x30,0x42,0x32,0x30,0x34,0x30,0x30};
unsigned char code cam_backlight_on_[] = {0x2a,0x30,0x30,0x38,0x32,0x30,0x31,0x30,0x30};
unsigned char code cam_backlight_off_[] = {0x2a,0x30,0x30,0x38,0x32,0x30,0x30,0x30,0x30};
unsigned char code cam_freeze_on_[] = {0x2a,0x30,0x30,0x41,0x45,0x30,0x31,0x30,0x30};
unsigned char code cam_freeze_off_[] = {0x2a,0x30,0x30,0x41,0x45,0x30,0x30,0x30,0x30};
unsigned char code cam_picture_off_[] = {0x2a,0x30,0x30,0x42,0x30,0x30,0x31,0x30,0x30};
unsigned char code cam_picture_bw_[] = {0x2a,0x30,0x30,0x42,0x30,0x30,0x30,0x30,0x30};
unsigned char code cam_reverse_on_[] = {0x2a,0x30,0x30,0x37,0x42,0x30,0x31,0x30,0x30};
unsigned char code cam_reverse_off_[] = {0x2a,0x30,0x30,0x37,0x42,0x30,0x30,0x30,0x30};
unsigned char code cam_display_on_[] = {0x2a,0x30,0x30,0x37,0x41,0x30,0x30,0x30,0x30};
unsigned char code cam_display_off_[] = {0x2a,0x30,0x30,0x37,0x41,0x30,0x31,0x30,0x30};
unsigned char code cam_inq_zoom_pos_[] = {0x2a,0x30,0x30,0x43,0x30,0x30,0x30,0x30,0x30};
unsigned char code cam_inq_focus_pos_[] = {0x2a,0x30,0x30,0x43,0x31,0x30,0x30,0x30,0x30};
unsigned char cam_read_id_[] = {0x2a,0x30,0x30,0x37,0x33,0x30,0x30,0x30,0x30};
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(25);
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(25);
//set_level_limit();
cam_focus_auto();
}
extern void cam_focus_near() {
cam_focus_manu();
delay_xms(25);
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_iris_open() {cam_send_command(cam_iris_up_);}
//extern void cam_iris_close() {cam_send_command(cam_iris_down_);}
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_);}
extern void cam_icrshot_on() {
/*cam_send_command(cam_icrshot_on_);
#ifdef CAM_SONY_LP
if (!bw_fg)
{
delay_xms(20);
cam_send_command(cam_picture_bw_);
}
#endif
*/
}
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)
{
register unsigned char i,j = 30;
cam_send_command(cam_read_id_);
while ((j--) && (cam_receive_byte() != 0x2a));
for (i=0;i<3;i++) cr[i] = cam_receive_byte();
cam_id = asc2hex2(cr[1],cr[2]);
}
extern void cam_icr_set(void)
{}
//{
/*
cc_icr ++;
if (cc_icr != 0xffff) return;
if (manual_fg) return;
if (cont_fg) 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;
cam_inq_zoom_pos();
cam_inquiry_state();
zh = ((seq[42] << 4) & 0xf0) | (seq[43] & 0x0f);
zl = ((seq[44] << 4) & 0xf0) | (seq[45] & 0x0f);
set_curlimit(((zh << 8) | zl) / 0x02e8);
*/
}
extern void cam_set_preset(void)
{
cam_inq_zoom_pos(); // read zoom position
cam_inquiry_state();
pre[5] = ((seq[42] << 4) & 0xf0) | (seq[43] & 0x0f);
pre[6] = ((seq[44] << 4) & 0xf0) | (seq[45] & 0x0f);
//seq[5] = ((seq[42] << 4) & 0xf0) | (seq[43] & 0x0f);
//seq[6] = ((seq[44] << 4) & 0xf0) | (seq[45] & 0x0f);
delay_xms(20);
cam_inq_focus_pos(); // read focus position
cam_inquiry_state();
pre[7] = ((seq[42] << 4) & 0xf0) | (seq[43] & 0x0f);
pre[8] = ((seq[44] << 4) & 0xf0) | (seq[45] & 0x0f);
//seq[7] = ((seq[42] << 4) & 0xf0) | (seq[43] & 0x0f);
//seq[8] = ((seq[44] << 4) & 0xf0) | (seq[45] & 0x0f);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -