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

📄 main.c

📁 说明在程序里
💻 C
字号:
#include <reg52.h>
#define __MAIN_SOURCE__
#include "Timer.h"
#include "Interrupt.h"
#include "UART.h"
#include "X5045.h"

/**********************************************************************
模块名: 主程序
创建人: XX
日  期: 2002-11-14 
说  明:     

  
日期: 2002-11-14
修改:
说明: 版本定为1.02
	
	  
日期:
修改:
说明:
		
		  
日期:
修改:
说明:
			
**********************************************************************/


// 函数名称: MainInit()
// 函数说明: 主程序初始化程序
// 返回值  : void  : 无
void MainInit()
{
    X5045_Init();
	// 显示电源指示灯
    LED     =  FALSE;   
	// 获取设备地址
	bt_ADDR =  ADDR; 
	// 打开开门狗
	if(X5045_Read_Reg() !=  0x10)
		X5045_Write_Reg(0x10);
	Timer_Init();
	Timer0_Init();
	Timer1_Init(BAUD_9600);
	UART_Init();
	Interrupt_Init();
	// 允许向多画面发送数据,不向485总线发送
	WR232_Enable();
	// 禁止接收485总线的数据
    b_DiableRec = TRUE;
	// 初始化多画面分割器
    channelini();
    // 使多画面分割器处于live模式
    send232start();
    strcyp(live);
    multimodesend(); 
    send232end();
	// 允许接收485总线数据
    b_DiableRec = FALSE;
    RD485_Enable();
}





// 函数名称: multimodesend()
// 函数说明: 向多画面分割器发一条命令
// 返回值  : void  : 无
void  multimodesend()
{
    BYTE i;
    // 禁止串行中断
    ES     =  0;    
    WR232_Enable();       
    for(i =0;i <3; i++)
    {
		X5045_WatchDog();       
		SBUF   =  command[i];
		while(!TI);
		TI     =  FALSE;
    }
    // 允许串行中断    
    ES     =  1;    
}



// 函数名称: strcyp()
// 函数说明: 字符拷贝函数
// 返回值  : void  : 无
// 入口参数 BYTE *s 为源字符串的首地址
void strcyp(BYTE *s)
{
    BYTE i;
    for(i =0;i <3;i ++)
    {
		command[i] = *(s + i);
    }
} 



// 函数名称: selectch()
// 函数说明: 多画面分割器通道选择函数,把相应的
// 十进制数转换成一组ACSII值放入command数组
// 返回值  : void  : 无
// 入口参数 BYTE temp为十进制数
void selectch(BYTE temp)
{
	switch(temp)
    {
	case CHANNEL1:
		{
			strcyp(ch1);
		}
		break;
	case CHANNEL2:
		{
			strcyp(ch2);
		}
		break;
	case CHANNEL3:
		{
			strcyp(ch3);
		}
		break;
	case CHANNEL4:
		{
			strcyp(ch4);
		}
		break;
	case CHANNEL5:
		{
			strcyp(ch5);
		}
		break;
	case CHANNEL6:
		{
			strcyp(ch6);
		}
		break;
	case CHANNEL7:
		{
			strcyp(ch7);
		}
		break;
	case CHANNEL8:
		{
			strcyp(ch8);
		}
		break;
	case CHANNEL9:
		{
			strcyp(ch9);
		}
		break;
	case CHANNEL10:
		{
			strcyp(ch10);
		}
		break;
	case CHANNEL11:
		{
			strcyp(ch11);
		}
		break;
	case CHANNEL12:
		{
			strcyp(ch12);
		}
		break;
	case CHANNEL13:
		{
			strcyp(ch13);
		}
		break;
	case CHANNEL14:
		{
			strcyp(ch14);
		}
		break;
	case CHANNEL15:
		{
			strcyp(ch15);
		}
		break;
	case CHANNEL16:
		{
			strcyp(ch16);
		}
		break;
	}  
}


// 函数名称: multi4process()
// 函数说明: 发送4画面通道函数
// 返回值  : void  : 无
void multi4process()
{
	BYTE i;
	for(i =4;i <8;i ++)
	{
		Delay(Delay800MS);
		selectch(bt_ReceiveBuf[i]);
		multimodesend();
	}
}  


// 函数名称: multi9process()
// 函数说明: 发送9画面通道函数
// 返回值  : void  : 无
void multi9process()
{
    BYTE i;
    for(i =4;i <13;i ++)
    { 
		Delay(Delay800MS);
		// 选择相应的通道号
		selectch(bt_ReceiveBuf[i]);
		multimodesend();
    }
}  



// 函数名称: multi16process()
// 函数说明: 发送16画面通道函数
// 返回值  : void  : 无
void multi16process()
{
	BYTE i;
	for(i =4;i <20;i ++)
	{
		Delay(Delay800MS);
		// 选择相应的通道号
		selectch(bt_ReceiveBuf[i]);
		multimodesend();
	}
}  


// 函数名称: multisetprocess()
// 函数说明: 发送多画面通道函数
// 返回值  : void  : 无
void multisetprocess()
{
	switch(bt_ModeNum)
	{
	case OnePicture:
		{   // 发送单画面串口波特率改为1200bps
			send232start();
			// 切换到单画面
			strcyp(full);
			multimodesend();
			// 发select命令
			strcyp(select); 
			multimodesend();
			// 延时800MS
			Delay(Delay800MS);
			// 选定要在单画面显示的视频通道
			selectch(bt_ReceiveBuf[4]); 
			multimodesend();
			send232end(); 
		} 
		break;
	case TwoPicture:
		{
			// 画中画
			send232start();
			// 切换到画中画模式
			strcyp(pipup);
			multimodesend();
			strcyp(select);
			multimodesend();
			Delay(Delay800MS);
			// 送画中画背景画面的视频通道
			selectch(bt_ReceiveBuf[5]); 
			multimodesend();
			Delay(Delay800MS);
            // 送画中画子画面的视频通道
			selectch(bt_ReceiveBuf[4]);
			multimodesend();    
			send232end();
		}
		break;
	case FourPicture:
		{  
			// 四画面
			send232start();
			// 切换到四画面模式
			strcyp(down22);
			multimodesend();
			strcyp(down22);
			multimodesend();
			strcyp(select);
			multimodesend();
			// 送给相应的画面相应的视频通道
			multi4process();
			send232end();
		}
		break;
	case NinePicture:
		{
			// 九画面
			send232start();
			// 切换到九画面模式
			strcyp(left33);
			multimodesend();
			strcyp(left33);
			multimodesend();
			strcyp(select);
			multimodesend();
			// 送给相应的画面相应的视频通道
			multi9process();
			send232end();
		}
		break;
	case SixteenPicture:
		{
			// 16画面
			send232start();  
            // 切换到九画面模式
			strcyp(right44);
			multimodesend();
			strcyp(right44);
			multimodesend();
			strcyp(select);
			multimodesend();
			// 送给相应的画面相应的视频通道
			multi16process();
			send232end();
		}
		break;
	}
}


// 函数名称: onedrawini()
// 函数说明: 单画面初始化函数
// 返回值  : void  : 无
void onedrawini()
{
	// 单画面模式号
	bt_ModeNum   =  OnePicture; 
	// 在单画面显示视频通道1
	bt_ReceiveBuf[4] = 1; 
	multisetprocess();
}


// 函数名称: twodrawini()
// 函数说明: 画中画画面初始化函数
// 返回值  : void  : 无
void twodrawini()
{
	// 画中画模式号
	bt_ModeNum   = TwoPicture;  
	// 在画中画前景画面显示视频通道1
	// 子画面显示视频通道2
	bt_ReceiveBuf[4] = 1;
	bt_ReceiveBuf[5] = 2;
	multisetprocess();
	
}


// 函数名称: fourdrawini()
// 函数说明: 四画面画面初始化函数
// 返回值  : void  : 无
void fourdrawini()
{
	BYTE i;
	// 四画面模式号     
	bt_ModeNum  = FourPicture;      
	for(i =0; i < 4;i ++)
	{  
		// 依此送相应画面的视频通道号
		bt_ReceiveBuf[4 + i] = i + 1; 
	}
	multisetprocess();
}


// 函数名称: ninedrawini()
// 函数说明: 九画面画面初始化函数
// 返回值  : void  : 无
void ninedrawini()
{
	BYTE i;
	// 九画面的模式号    
	bt_ModeNum  = NinePicture;       
	for(i =0; i < 9;i ++) 
	{
		// 依此送相应画面的视频通道号
		bt_ReceiveBuf[4 + i] = i + 1; 
	}
	multisetprocess();
}


// 函数名称: sixtdrawini()
// 函数说明: 16画面画面初始化函数
// 返回值  : void  : 无
void sixtdrawini()
{
    BYTE i;
    // 16画面模式号  
    bt_ModeNum  = SixteenPicture;           
    for(i =0; i < 16;i ++)
    {
		// 依此送相应画面的视频通道号
		bt_ReceiveBuf[4 + i] = i + 1; 
    }
    multisetprocess();
}


// 函数名称: channelini()
// 函数说明: 多画面画面初始化函数
// 返回值  : void  : 无
void channelini()
{
	// 延时4秒,在矩阵和多画面一同开机时
	// 给4秒时间留给多画面分割器自身初始化
	Delay(Delay4S);
	// 调用画中画初始化
	twodrawini(); 
	Delay(Delay800MS);
	// 调用九画面初始化
	ninedrawini(); 
	Delay(Delay800MS);
	// 调用单画面初始化
	onedrawini();
	Delay(Delay800MS);
	// 调用16画面初始化
	sixtdrawini();
	Delay(Delay800MS);
	// 调用4画面初始化
	fourdrawini();  
	
}



// 函数名称: videoswitch()
// 函数说明: 转发给矩阵切换模块矩阵视频通道切换命令函数
// 返回值  : void  : 无
void videoswitch()
{  
	// 输入通道范围为0~31,输出通道号为0~15
	BYTE i;
	bt_SendBuf[0] = STX;
	bt_BCC        = STX;
	// 送入矩阵切换模块地址0xaa
	bt_SendBuf[1] = 0xaa; 
	bt_BCC       ^= 0xaa;
	// 输入通道号(上面传送为1~32)为了和接收模块匹配,数值减1
	bt_SendBuf[2] = GetInputCh(bt_ReceiveBuf) - 1;
	bt_BCC       ^= bt_SendBuf[2];
	// 输出通道号(上面传送为1~16)为了和接收模块匹配,数值减1
	bt_SendBuf[3] = GetOutputCh(bt_ReceiveBuf) - 1;
	bt_BCC       ^= bt_SendBuf[3];
	bt_SendBuf[4] = ETX;
	bt_BCC       ^= ETX;
	// 送校验字节
	bt_SendBuf[5] = bt_BCC;  
	// 向切换模块转发数据
	UART_SendDgm_to232(bt_SendBuf,6);
	// 置等待ACK标志位,如果从切换模块接收到ACK就清b_WaitACK标志位
	b_WaitACK = TRUE;
	for(i =0;i <255;i ++)
	{
		// 做一个for循环的超时,如果在这段时间结束收不到
		// 切换模块的应答ACK的话就强行跳出本循环
		X5045_WatchDog();
		if(!b_WaitACK)
		{   
			// 如果在这段循环还没结束就收
			// 到切换模块发过来的ACK就跳出本循环
			break;
		}
	}
	// 波特率调为9600
	SCON    = 0xf0; 
	// 如果是超时跳出循环的b_WaitACK标志位没有清掉就清标志位
	if(b_WaitACK == TRUE)
	{
		b_WaitACK  = FALSE;
	}
} 



// 函数名称: multimodeprocess()
// 函数说明: 多画面模式切换函数
// 返回值  : void  : 无
void multimodeprocess()
{
    // 把从485接收到的模式号给bt_ModeNum
	bt_ModeNum   =  GetDrawMode(bt_ReceiveBuf); 
    switch(bt_ModeNum)
    {
	case OnePicture:
		{   // 单画面模式
			if(bt_OldNum != OnePicture)
			{ 
				// 由于单画面模式是一个单画面和ZOOM复用模式,所以只能发一次
				// 如果上一次的模式号是单画面则本次命令不执行
				send232start();  
				// 切换到单画面
				strcyp(full);      
				multimodesend();
				send232end();
			}
		}
		break;
	case TwoPicture:
		{   
			// 画中画模式
			if(bt_OldNum != TwoPicture)
			{
				// 由于画中画是一个复用模式,所以只能发一次
				// 如果上一次的模式号是画中画则本次命令不执行
				send232start();
				// 切换到画中画
				strcyp(pipup);
				multimodesend();
				send232end();
			}
		}
		break;
	case FourPicture:
		{   
			// 四画面模式
			send232start(); 
			// 切换到四画面
			strcyp(down22);
			multimodesend();
			strcyp(down22);
			multimodesend();
			strcyp(select);
			multimodesend();
            send232end();
		}
		break;
	case NinePicture:
		{
			// 九画面模式
			send232start(); 
			// 切换到九画面
			strcyp(left33);
			multimodesend();
			strcyp(left33);
			multimodesend();
			send232end();
		}
		break;
	case SixteenPicture:
		{
			// 16画面模式
			send232start(); 
			// 切换到16画面
			strcyp(right44);
			multimodesend();
			strcyp(right44);
			multimodesend();
			send232end();
		}
		break;
	}
	// 把当前模式号存入bt_OldNum作为下一次比较的标准
	bt_OldNum   =  bt_ModeNum; 
}



// 函数名称: multimodeprocess()
// 函数说明: 多画面模式切换函数
// 返回值  : void  : 无
void process()
{
	switch(GetComm(bt_ReceiveBuf))
	{
	case VCHANELSET:
		{
			// 视频通道切换命令
			videoswitch();
		}
		break;
	case MULTIMODESET:
		{
			// 多画面模式设置命令
			multimodeprocess();
		}
		break; 
	case MULTIIMAGSET:
		{
			// 多画面模式通道设置命令
			multisetprocess();
		}
		break;
		
    }
    // 收到命令并且完成后向485发一个ACK应答,允许发下一条命令
    SendByte(ACK);
	// 允许接收485总线的数据
	RD485_Enable();
}


// 函数名称: main
// 函数说明: 主程序
// 返回值  : void : 无
void main()
{
   	MainInit();
   	while(1)
   	{
		X5045_WatchDog();
		// 如果从485总线上接收到一条正确报文就进入这里处理
		if(b_RecData)
		{
			b_RecData  =  FALSE;
			process();
		}
		if(b_RecTestChar)
		{ 
			// 如果从485总线上接收到测试字符,就向切换模块转发
			// 由切换模块控制闪灯
			b_RecTestChar = FALSE;
			SendByteTo232(TestChar);
		}
   	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -