📄 cam_lg680.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 + -