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