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

📄 main.c

📁 适合初学者学习的UPSD的点阵LCD汉字显示
💻 C
字号:
/*
名称:main.c
日期:2005.01.12
作者:廖志凯
功能:解析由上位机(音频控制器)的命令(通过RS232),
		控制下位机(子控制板)动作。
		接收下位机的信息并发送给上位机
说明:程序使用RTX51实时多任务系统,
*/
#pragma large
#include	"main.h"
/*------------------------------------------------------------------------------*/
//定义变量
uchar xdata cAddress;						//自身地址
uchar xdata cDiplayId[2];
#define	MAX_NAME_ID	48
uchar code cNameId[MAX_NAME_ID][17]=
	{
		"主:  分局903   ",
		"主:  分局904   ",
		"主:  分局939   ",
		"主:  分局940   ",
		"主:  市局应急  ",
		"主: 分局常规01 ",
		"主: 分局常规02 ",
		"主: 分局常规04 ",
		"主:交警总队350M",
		"主:   市局01   ",
		"主:   市局04   ",
		"主:   黄浦01   ",
		"主:   黄浦02   ",
		"主:   特警01   ",
		"主:  黄浦指挥  ",
		"主:交警总队800M",
		"主:   空闲组   ",
		"主:   空闲组   ",
		"主:   空闲组   ",
		"主:   空闲组   ",
		"主:   空闲组   ",
		"主:   空闲组   ",
		"主:   空闲组   ",
		"主:   空闲组   ",
		"备:  分局903   ",
		"备:  分局904   ",
		"备:  分局905   ",
		"备:  分局939   ",
		"备:  分局940   ",
		"备: 分局常规01 ",
		"备: 分局常规02 ",
		"备: 分局常规04 ",
		"备: 市局应急01 ",
		"备:交警总队350M",
		"备:   市局01   ",
		"备:   市局02   ",
		"备:   市局03   ",
		"备:   市局04   ",
		"备:   市局05   ",
		"备:   黄浦01   ",
		"备:   黄浦02   ",
		"备:   特警01   ",
		"备:  黄浦指挥  ",
		"备: 黄浦应急组 ",
		"备:交警总队800M",
	};
/*===============================================================
功能:初始化
参数:
返回:
说明:获取电台号
===============================================================*/
void Init_System()
{
	uchar _buff[20];
	WDKEY = 0xAE;				//开看门狗
	IP = 0x00;
	XBYTE[CTA] = 0x00; 					//把PA设置成IO模式
	XBYTE[DCA] = 0x00;					//把PA设置成输入模式
	cAddress = XBYTE[DIA];				//读入PA值
	
	os_set_slice(ST10MS);
	Init_Serial();
	EN_RS485_RECV();
	//熄灭所以的灯
	LED_RUN = 1;					
	CALL_IN1_LED = 1;
	CALL_IN2_LED = 1;
	cDiplayId[0] = 0;
	cDiplayId[1] = 0;
	//AUDIO_C1 = TURN_ON;
	//AUDIO_C2 = TURN_ON;
	AUDIO_C1 = TURN_OFF;
	AUDIO_C2 = TURN_OFF;

	memset(_buff, 0x00, 20);
	memcpy(_buff, "监听设备", 8);
	Write_Debug_Info(_buff, strlen(_buff));
	memset(_buff, 0x00, 20);
	sprintf(_buff,"%s%bd-%bd","地址:",cAddress,cAddress+1);
	Write_Debug_Info(_buff, strlen(_buff));
	memset(_buff, 0x00, 20);
	sprintf(_buff,"%s;%s",__DATE__,__TIME__);
	Write_Debug_Info(_buff, strlen(_buff));

	os_wait2(K_TMO, T500MS);
	Init_Vfd_Display();
	Clear_Vfd_Display();

	Define_Vfd_Userwindow(1, 1, 4, 0, 140, 2);
	Select_Vfd_Window(1);
	Position_Vfd_Home();
	memset(_buff, 0x00, 20);
	sprintf(_buff,"%s%bd", "地址:", cAddress);
	Display_Vfd_Blending(_buff);
	os_wait2(K_TMO, T50MS);
	Define_Vfd_Userwindow(2, 1, 144, 0, 140, 2);
	Select_Vfd_Window(2);
	Position_Vfd_Home();
	memset(_buff, 0x00, 20);
	sprintf(_buff,"%s%bd", "地址:", cAddress+1);
	Display_Vfd_Blending(_buff);


 }

/*===============================================================
功能:判断上位机的命令是否正确,正确转发
参数:
返回:
说明:邮件的参数是接收数据长度
	只有一条协议
	FF 04 ID1 02 01 ID2 00
	ID1-指监听设备自身地址
	ID2-指要监听的电台号
===============================================================*/
void Command_Task(void) _task_ CMMD_TASK_ID
{
	uchar xdata _tmp, _ui;

	os_wait(K_TMO, T1S, 0x00);
	Set_Vfd_Brightless(1);
	
	while(1)
	{
		if( (cRecvBuffCnt != 0x00)  && (cRecvBuffPtr < RECV_GRUOP)  )
		{//缓冲区内有数据
			if( (cRecvBuff[cRecvBuffPtr][2] == cAddress) || (cRecvBuff[cRecvBuffPtr][2] == (cAddress+1)) )
			{//坐席设备号正确
				if(cRecvBuff[cRecvBuffPtr][3] == 2)
				{//命令类型正确
					if(cRecvBuff[cRecvBuffPtr][4] == 1)
					{//操作类型正确
						if( (cRecvBuff[cRecvBuffPtr][5] >= 1) &&(cRecvBuff[cRecvBuffPtr][5] <= MAX_NAME_ID) )
						{//电台号正确
							//计算和校	
							_tmp = cRecvBuff[cRecvBuffPtr][2];
							for(_ui=3;  _ui< cRecvBuff[cRecvBuffPtr][1]+2; _ui++)
							{
								_tmp += cRecvBuff[cRecvBuffPtr][_ui];
							}
							
							//if(_tmp == cRecvBuff[cRecvBuffPtr][_ui])
							{//和校正确
								if(cRecvBuff[cRecvBuffPtr][2] == cAddress)
								{
									Select_Vfd_Window(1);
									Position_Vfd_Home();
									cDiplayId[0] = cRecvBuff[cRecvBuffPtr][5]-1;
									Display_Vfd_Blending(cNameId[cDiplayId[0]]);
								}
								else if(cRecvBuff[cRecvBuffPtr][2] == (cAddress+1)) 
								{
									Select_Vfd_Window(2);
									Position_Vfd_Home();
									cDiplayId[1] = cRecvBuff[cRecvBuffPtr][5]-1;
									Display_Vfd_Blending(cNameId[cDiplayId[1]]);
								}
							}
						}
					}
				}
			}
			//清除已处理的数据
			memset(&cRecvBuff[cRecvBuffPtr][0],0x00,RECV_LENGTH);
			cRecvBuffPtr = (cRecvBuffPtr + 1) % RECV_GRUOP;
			cRecvBuffCnt --;
		}
		else
			os_wait(K_TMO, T10MS, 0x00);		
	}
	
}
/*===============================================================
功能:
参数:
返回:
说明:
===============================================================*/
void Led1_Delay_Task(void) _task_ LED1DELAY_TASK_ID
{
	CALL_IN1_LED = 0;
	AUDIO_C1 = TURN_ON;
	Set_Vfd_Brightless(8);
	os_wait2(K_TMO, T1S);
	AUDIO_C1 = TURN_OFF;
	os_wait2(K_TMO, T1S);
	os_wait2(K_TMO, T1S);
	os_wait2(K_TMO, T1S);
	CALL_IN1_LED = 1;
	AUDIO_C1 = TURN_OFF;
	Set_Vfd_Brightless(1);
	os_delete_task(LED1DELAY_TASK_ID);
}

/*===============================================================
功能:
参数:
返回:
说明:
===============================================================*/
void Led2_Delay_Task(void) _task_ LED2DELAY_TASK_ID
{
	CALL_IN2_LED = 0;
	AUDIO_C2 = TURN_ON;
	Set_Vfd_Brightless(8);
	os_wait2(K_TMO, T1S);
	AUDIO_C2 = TURN_OFF;
	os_wait2(K_TMO, T1S);
	os_wait2(K_TMO, T1S);
	os_wait2(K_TMO, T1S);
	CALL_IN2_LED = 1;
	AUDIO_C2 = TURN_OFF;
	Set_Vfd_Brightless(1);
	os_delete_task(LED2DELAY_TASK_ID);
}
/*===============================================================
功能:判断是否有音频
参数:
返回:
说明:
===============================================================*/
void Information_Task(void) _task_ INFO_TASK_ID
{
	static uchar cAudioCnt1 = 0,cAudioCnt2 = 0;
	static uchar cNoAudioCnt1 = 0,cNoAudioCnt2 = 0;
	
	os_wait(K_TMO, T1S, 0x00);
	
	while(1)
	{
		os_wait(K_TMO, T10MS, 0x00);	
		//判断第一通道
		if(!SPK_D1)
			cAudioCnt1++;
		else
			cNoAudioCnt1++;
		if(cNoAudioCnt1 > 40)
		{
			cAudioCnt1 = 0x00;
			cNoAudioCnt1 = 0x00;
		}
		if(cAudioCnt1 >= 1)
		{
			cAudioCnt1 = 0x00;
			cNoAudioCnt1 = 0x00;
			os_delete_task(LED1DELAY_TASK_ID);
			os_create_task(LED1DELAY_TASK_ID);
		}
		//判断第二通道
		if(!SPK_D2)
			cAudioCnt2++;
		else
			cNoAudioCnt2++;
		if(cNoAudioCnt2 > 40)
		{
			cAudioCnt2 = 0x00;
			cNoAudioCnt2 = 0x00;
		}
		if(cAudioCnt2 >= 1)
		{
			cAudioCnt2 = 0x00;
			cNoAudioCnt2 = 0x00;
			os_delete_task(LED2DELAY_TASK_ID);
			os_create_task(LED2DELAY_TASK_ID);
		}
	}
}
/*===============================================================
功能:复位CPU
参数:
返回:
说明:
===============================================================*/
void Restart_Cpu(void)
{
	WDKEY = 0xAE;
	WDRST = 0x01;
	while(1);
}
/*===============================================================
功能:完成定时操作
参数:
返回:
说明:10毫秒内判断一次I2C总线,若一秒中内有80次总线忙则
		复位总线
===============================================================*/
void Timer_Task(void) _task_ TIMER_TASK_ID
{
	static uchar xdata _ui = 0x00;
	
	while(1)
	{
		os_wait(K_TMO, T10MS, 0x00);
		WDRST = 0x00;					//喂狗
		_ui++;
		
		if(_ui >= 50)
		{
			LED_RUN ^= 1;
			_ui = 0x00;
		}
	}
}

/*===============================================================
功能:调用初始化函数并启动所有任务
参数:无
返回:无
说明:系统时间间隔为10ms
===============================================================*/
void Init_Task(void) _task_ INIT_TASK_ID
{
	Init_System();

	//os_create_task(SRECV_TASK_ID);
	//os_create_task(STRAN_TASK_ID);
	os_create_task(CMMD_TASK_ID);
	os_create_task(INFO_TASK_ID);
	os_create_task(TIMER_TASK_ID);
	os_create_task(DEBUG_TASK_ID);
	os_delete_task(INIT_TASK_ID);
}
/*===============================================================
功能:主函数,启动任务
参数:无
返回:无
说明:
===============================================================*/
void main(void)
{
	os_start_system(INIT_TASK_ID);
}
/*===============================================================
功能:
参数:
返回:
说明:
===============================================================*/

⌨️ 快捷键说明

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