📄 p_san650.c
字号:
#include <REG54.H>
#include <INTRINS.H>
#include "protocol.h"
#include "kernel.h"
#include "config.h"
#define STX 0x02
#define ETX 0x03
unsigned char bdata tmp_fg;
sbit fifteen_fg = tmp_fg^0;
sbit iris_fg = tmp_fg^1;
sbit pre_fg = tmp_fg^2;
unsigned char data dir1_fg;
//unsigned char bdata dir1_fg;
/*
sbit left1_fg = dir1_fg ^ 2;
sbit right1_fg = dir1_fg ^ 1;
sbit up1_fg = dir1_fg ^ 3;
sbit down1_fg = dir1_fg ^ 4;
sbit left1_up_fg = dir1_fg ^ 4;
sbit left1_down_fg = dir1_fg ^ 5;
sbit right1_up_fg = dir1_fg ^ 6;
sbit right1_down_fg = dir1_fg ^ 7;
*/
unsigned char data comm1,comm2,comm3;
unsigned char data base_addr,hi_addr,lo_addr;
unsigned char data hi_pre,lo_pre;
bit power_fg = 0;
unsigned char data rc = 0;
unsigned char data rd;
/* 返回值为1则不当做预置点功能,返回值为0则是预置点功能 */
/* 用设置预置点的方法来实现附加功能*/
extern bit do_set_addon(unsigned char no)
{
switch (no)
{
case F_SCAN_START:
case F_SCAN_END:
case F_SEQ_SET:
no = no;
return 0;
case F_CAM_RESET: //camera reset
addon_fg = 1;
seq[10] = A_RESET;
seq[11] = ON;
return 1;
case F_BLC_OFF: //背光补偿关
addon_fg = 1;
seq[10] = A_BLC;
seq[11] = OFF;
return 1;
case F_ZERO_OFF: //低照度关
addon_fg = 1;
seq[10] = A_ZERO;
seq[11] = OFF;
return 1;
case F_MENU_OFF: //diaplay off
disp_off_fg = 1;
return 1;
case F_DIGI_OFF:
addon_fg = 1; //camera digital off
seq[10] = A_DIGI;
seq[11] = OFF;
return 1;
case F_FOCU_MANU:
addon_fg = 1;
seq[10] = A_FOCU; //聚焦手动
seq[11] = MANU;
return 1;
case F_IRIS_MANU: // 光圈手动
addon_fg = 1;
seq[10] = A_IRIS;
seq[11] = MANU;
return 1;
case F_WB_MANU: // 白平衡手动
addon_fg = 1;
seq[10] = A_WB;
seq[11] = MANU;
return 1;
case F_BLACK: //黑白模式
addon_fg = 1;
seq[10] = A_BLACK;
seq[11] = OFF;
return 1;
case F_FREEZE_OFF: //图象冻结解除
addon_fg = 1;
seq[10] = A_FRZE;
seq[11] = OFF;
return 1;
case F_MIRRO_OFF: //镜像解除
addon_fg = 1;
seq[10] = A_MIRR;
seq[11] = OFF;
return 1;
default:
no = no;
return 0;
}
}
/* 用调用预置点的方法来实现附加功能*/
extern bit do_call_addon(unsigned char no)
{
switch (no)
{
case F_SCAN_RUN:
run_swing_fg = 1;
seq[17] = F_SCAN_START; //start point
seq[18] = F_SCAN_END; //end point
return 1;
case F_SCAN_STOP:
run_swing_fg = 0;
return 1;
case F_SEQ_RUN:
run_seq2_fg = 1; //运行轨迹标志,调用第一至第十六个预置点
return 1;
case F_CAM_POWER:
power_fg = !power_fg;
power_on_fg = power_fg;
power_off_fg = !power_fg;
return 1;
case F_BLC_ON: //背光补偿开
addon_fg = 1;
seq[10] = A_BLC;
seq[11] = ON;
return 1;
case F_ZERO_ON: //低照度开
addon_fg = 1;
seq[10] = A_ZERO;
seq[11] = ON;
return 1;
case F_MENU_ON: //屏显开
disp_on_fg = 1;
return 1;
case F_DIGI_ON: //数字变倍开
addon_fg = 1;
seq[10] = A_DIGI;
seq[11] = ON;
return 1;
case F_FOCU_AUTO:
addon_fg = 1;
seq[10] = A_FOCU; //聚焦自动
seq[11] = AUTO;
return 1;
case F_IRIS_AUTO: // 光圈自动
addon_fg = 1;
seq[10] = A_IRIS;
seq[11] = AUTO;
return 1;
case F_WB_AUTO: // 白平衡自动
addon_fg = 1;
seq[10] = A_WB;
seq[11] = AUTO;
return 1;
case F_COLOR: //黑白模式
addon_fg = 1;
seq[10] = A_BLACK;
seq[11] = ON;
return 1;
case F_FREEZE_ON: //图象冻结
addon_fg = 1;
seq[10] = A_ZERO;
seq[11] = ON;
return 1;
case F_MIRRO_ON: //镜像开
addon_fg = 1;
seq[10] = A_MIRR;
seq[11] = ON;
return 1;
default:
no = no;
return 0;
}
}
//初始化串行口
extern void init_serial(void)
{
PCON = 0x00;SCON = 0x50; //电源和串行口工作方式设置波特率不倍增
TH2 = 0xff; RCAP2H = 0xff;
#ifdef FOCS_40M
TL2 = 0x7d; RCAP2L = 0x7d;
#else
TL2 = 0xb8; RCAP2L = 0xb8;
#endif
T2CON = 0x34;
}
//串行口中断服务程序
void serial_int(void) interrupt 4 using 1 // 串行口中断有高优先级,使用寄存器组1
{
ES = 0;
if (_testbit_(RI))
{
rd = SBUF;
rc ++;
switch (rc)
{
case 1:
if (rd != STX) rc = 0;
dir1_fg = 0;
tmp_fg = 0;
break;
case 2:
if (rd != 'A') rc = 0;
break;
case 3:
base_addr = (rd - 0x44)*100;
break;
case 4:
hi_addr = rd - 0x30;
if (hi_addr >= 10) rc = 0;
break;
case 5:
lo_addr = rd - 0x30;
if (lo_addr < 10)
{
lo_addr += hi_addr*10;
lo_addr += base_addr;
if (lo_addr != id) rc = 0;
}
else
rc = 0;
break;
case 6:
if (rd == 'S')
pre_fg = 1;
else if (rd != ';')
rc = 0;
break;
case 7:
if (pre_fg)
{
if (rd != 'P') rc = 0;
}
else if (rd != 'G')
rc = 0;
break;
case 8:
if (pre_fg)
hi_pre = (rd - 0x30)*16;
else if (rd != 'C')
rc = 0;
break;
case 9:
if (pre_fg)
{
lo_pre = (rd - 0x30);
seq[15] = hi_pre + lo_pre;
seq[15] ++;
set_pre_fg = 1;
//while(1);
rc = 0;
}
else if (rd == 'F')
{
fifteen_fg = 1;
}
else if (rd != '7')
rc = 0;
break;
/* case 10:
if (rd != ':') rc = 0;
break;*/
case 11:
if (rd == '2')
{
iris_fg = 0;
}
else if (rd == '0')
{
iris_fg = 1;
}
else
{
iris_fg = 0;
rc = 0;
}
break;
/* case 12:
if (rd != '0') rc = 0;
break;
case 13:
if (rd != '2') rc = 0;
break;*/
case 14:
if (rd != '1') rc = 0;
break;
case 15:
comm1 = rd;
break;
case 16:
comm2 = rd;
break;
case 17:
comm3 = rd;
if (_testbit_(fifteen_fg))
{
if (comm1 == '3')
{
if (comm2 == '6')
{
switch(comm3)
{
case '8':
//left1_fg = 1;
dir1_fg = 4;
break;
case '9':
//left1_up_fg = 1;
dir1_fg = 12;
break;
case 'A':
//up1_fg = 1;
dir1_fg = 8;
break;
case 'B':
//right1_up_fg = 1;
dir1_fg = 10;
break;
case 'C':
//right1_fg = 1;
dir1_fg = 2;
break;
case 'D':
//right1_down_fg = 1;
dir1_fg = 18;
break;
case 'E':
//down1_fg = 1;
dir1_fg = 16;
break;
case 'F':
//left1_down_fg = 1;
dir1_fg = 20;
break;
default:
rc = 0;
break;
}
break;
} // end if comm2 = 6
} // end if comm1 = 3
else if (comm1 == '4')
{
if ((comm2 == '0') && (comm3 == '0'))
rc = 17;
else
rc = 0;
break;
}
} // end fifteen_fg
rc = 0;
if (_testbit_(iris_fg))
{
if (comm1 != '0') break;
if (comm2 != '0') break;
if (comm3 == '2')
iris_open_fg = 1;
else if (comm3 == '3')
iris_close_fg = 1;
break;
}
else
{
if (comm1 == '2')
{
if (comm2 == '2')
{
switch (comm3)
{
case '4':
zoom_stop_fg = 1;
focu_stop_fg = 1;
break;
case '8':
zoom_tele_fg = 1;
break;
case 'C':
zoom_wide_fg = 1;
break;
case 'A':
focu_far_fg = 1;
break;
case 'E':
focu_near_fg = 1;
break;
}
}
}
else
{
cont_fg = 1;
seq[12] = 0;
}
}
break;
case 10:
case 18:
if (rd != ':') rc = 0;
break;
/* case 19:
if (rd != '2')
rc = 0;
else
rc ++;
break;*/
case 12:
case 20:
if (rd != '0') rc = 0;
break;
case 13:
case 19:
case 21:
case 22:
if (rd != '2') rc = 0;
break;
case 23:
hi_pre = rd - 0x30;
break;
case 24:
lo_pre = rd - 0x30;
break;
case 25:
if (rd == '0')
{
if (dir1_fg)
{
cont_fg = 1;
run_seq2_fg = 0;
run_swing_fg = 0;
run_seq_fg = 0;
seq[12] = dir1_fg;
seq[13] = (hi_pre + 1)*8;
seq[14] = (lo_pre + 1)*8;
}
else
{
seq[15] = hi_pre*16 + lo_pre;
seq[15] ++;
call_pre_fg = 1;
//while(1);
}
}
default:
rc = 0;
break;
}
}
ES = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -