⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p_san650.c

📁 这是监视器行业常见的键盘与球机通讯协议的C语言源代码
💻 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 + -