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

📄 main.c

📁 ucos II操作系统的源代码。程序完整
💻 C
📖 第 1 页 / 共 2 页
字号:
		IO0CLR = 0X04 << 24;	//le 1
        IO1PIN = IO1PIN & 0XFFF0FFFF | (0x08 << 16);
        IO0SET = 0X04 << 24;
      
        IO0CLR = 0X08 << 24;	//le 2
        IO1PIN = IO1PIN & 0XFFF0FFFF | (0x08 << 16);
        IO0SET = 0X08 << 24;
        
	} else {
		flgs.state = 0;
		if (warn_info & 0x80){	//从跳频变成定频,恢复跳频前的频道
			fre_value = back.ffre;
			////CtrlOut(0x03);
			LedRefresh(0x03);
		}
		warn_info &= 0x7f;
	 }
}

/*********************************************************************************************************
** 函数名称: WarnInfo
** 功能描述: 告警信息采集及处理 P0.18:0.20--->tm,vswr,ld
** 输 入: 无        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年11月28日
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		
void WarnInfo(void){
	INT8U temp[5];
	INT16U wcrc;
	temp[0] = (IO0PIN & 0X001C0000) >> 18;
	temp[1] = (warn_info & 0x7f) ^ temp[0];
	if (temp[1] != 0x00 ){
		warn_info = warn_info & 0x80 | temp[0];
		if (temp[0] == 0x04) { 
			flgs.warn = 0;
			temp[2] = 0x40 | fre_value;
			
			pow_value = back.ppow;
			CtrlOut(0x0f);
			LedRefresh(0x0f);
		} else {
			flgs.warn = 1; 
			temp[2] = 0xc0 | fre_value;
			
			pow_value = 0x01;
			CtrlOut(0x0f);
			LedRefresh(0x0f);
		}			
			temp[0] = 0x01;
			temp[1] = 0x0b;
			wcrc = GetCRC16(temp, 3);
			temp[3] = (INT8U)((wcrc & 0xff00) >> 8);
			temp[4] = (INT8U)(wcrc & 0x00ff);
			OSMboxPost(SendMbox, (void *)temp);
    }
}
/*********************************************************************************************************
** 函数名称: InfoGather
** 功能描述: 告警,键盘信息采集
** 输 入: pdata        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		
void InfoGather(void *pdata){	
	pdata = pdata;

	while (1) {
		FreConverInfo();	//定频,跳频检测 P0.22
		WarnInfo();			//告警检测		
		KeyInfo();    		//键盘信息采集
	} 
}  		
 
/*********************************************************************************************************
** 函数名称: KeyInfo
** 功能描述: 键盘信息采集及处理
** 输 入: 无        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年11月27日
** 描 述: 增加防干扰措施,及调整按键时间
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		
void KeyInfo(void){
	INT8U ktemp[2] ;
	//INT32U ktemp3;
    if (!flgs.state){	//处于定频状态?
    	IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16); 
        IO1CLR = 0Xf0 << 16;
        IO1DIR = IO1DIR & 0xff0fffff | (0X30 << 16); 	//p1.20:21 are used as output port
    	IO1SET = 0X30 << 16;

		OSTimeDly(2);
		ktemp[0] = (IO1PIN & (0Xc0 << 16)) >> 16;
		
    	if ((ktemp[0] != 0XC0) && (ktemp[0] != 0X00)) {
    		IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16); 
        	IO1CLR = 0Xf0 << 16;
        	IO1DIR = IO1DIR & 0xff0fffff | (0X30 << 16); 	//p1.20:21 are used as output port
    		IO1SET = 0X30 << 16;
    		OSTimeDly(20);
    		ktemp[0] = (IO1PIN & (0Xc0 << 16)) >> 20;
    	
        	IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16); 
        	IO1CLR = 0Xf0 << 16;
        	IO1DIR = IO1DIR & 0xff0fffff | (0Xc0 << 16); 	//p1.20:21 are used as output port
    		IO1SET = 0Xc0 << 16;
    		OSTimeDly(10);
    		ktemp[0] |= (IO1PIN & (0X30 << 16)) >> 20;
    		
    		flgs.key = (ktemp[0] == 0X00) ? 1 : 0;	//防干扰
    		
    		#ifdef __DEBUG		//调试信息
			UART1Putch(ktemp[0]);
			UART1Putch(0XFF);
			#endif
			
    		while (!flgs.key ){
    			IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16); 
        		IO1CLR = 0Xf0 << 16;
        		IO1DIR = IO1DIR & 0xff0fffff | (0X30 << 16); 	//p1.20:21 are used as output port
    			IO1SET = 0X30 << 16;
    			OSTimeDly(10);
    			ktemp[1] = (IO1PIN & (0Xc0 << 16)) >> 20;
    	
        		IO1DIR = IO1DIR & 0xff0fffff | (0Xf0 << 16); 
        		IO1CLR = 0Xf0 << 16;
        		IO1DIR = IO1DIR & 0xff0fffff | (0Xc0 << 16); 	//p1.20:21 are used as output port
    			IO1SET = 0Xc0 << 16;
    			OSTimeDly(10);
    			ktemp[1] |= (IO1PIN & (0X30 << 16)) >> 20;
				
				#ifdef __DEBUG		//调试信息
				UART1Putch(ktemp[1]);
				UART1Putch(0X0F);
				#endif
    			   			
    			flgs.key = (ktemp[1] == ktemp[0]) ? 0:1 ;
    			KeyDecode(ktemp[0]);
    			
    			if (flgs.key) {
    				flgs.key = 0;
					break;
				  }
    		    else
    			{
    				OSTimeDly(20);	//100ms
    			}    			
    		}  
		} 
	}	
}	    	    		
/*********************************************************************************************************
** 函数名称: KeyDecode
** 功能描述: 键盘解码
** 输 入: key_value :采集到的键盘编码       
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		
void KeyDecode(INT8U key_value){
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif

    OS_ENTER_CRITICAL();
    switch (key_value){	
		case  0x09 : {	//fre up
    		flgs.fre = 1;
        	fre_value = (fre_value >= 0x29) ? 0x01 : (fre_value + 1);
			LedRefresh(0x03); 
			break;
			}
    	case  0x06 : {	//fre down
        	flgs.fre = 1;
        	fre_value = (fre_value <= 0x01) ? 0x29 : (fre_value - 1);
			LedRefresh(0x03);
			break;
			} 
    	case  0x0b : {
	    	flgs.test_change = 1;
	    	break;
			}
		case  0x05 : {	//pow up
    		if (!flgs.test && !flgs.warn) {      
         	  	flgs.pow=1;
            	pow_value = (pow_value >= 0x04) ? 0x01 : (pow_value + 1);
				LedRefresh(0x0f);
				}
			break;
		 	} 
    	case  0x0a : {	//pow down
            if (!flgs.test && !flgs.warn) {      
         	  	flgs.pow=1;
             	pow_value = (pow_value == 0x01) ? 0x04 : (pow_value - 1);
			 	LedRefresh(0x0f);
		 		}  
		 	break;
			}
		default: break;			
	}	
	OS_EXIT_CRITICAL();	
	if (flgs.key)
	{
		FrePowChange();
	}
} 
    		
/*********************************************************************************************************
** 函数名称: fre_pow_change
** 功能描述: 更新设备状态
** 输 入: 无        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人: 黄凯
** 日 期: 2006年12月08日
** 备  注:消除键盘误动作
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		      
void FrePowChange(void){
	INT8U temp[5],i;
	INT16U fcrc;

	if (flgs.fre){
		flgs.fre = 0;
		flgs.change = 1;
		
		back.ffre = fre_value;
		//CtrlOut(0x03);

		temp[0] = FreSaveAddr; 
		temp[1] = fre_value;
		temp[2] = (INT8U)I2cWrite(CAT1025, temp, 2);	//保存频率值

		temp[0] = 0x01;
		temp[1] = 0x0b;
		temp[2] = flgs.warn ? (0xc0 | fre_value) : (0x40 | fre_value);		
	}
	if (flgs.pow){
		flgs.pow = 0;
		flgs.change = 1;
		
		back.ppow = pow_value;
		CtrlOut(0x0f);

		temp[0] = PowSaveAddr; 
		temp[1] = pow_value;
		temp[2] = (INT8U)I2cWrite(CAT1025, temp, 2);	//保存功率值

		temp[0] = 0x01;
		temp[1] = 0x0b;
		temp[2] = pow_value;
	}								
	if (flgs.test_change){
		  flgs.test_change = 0;
		  flgs.change = 1;
		  
		  flgs.test = ~flgs.test;
      	  if (flgs.test){ 	//test
		  		test_value = 0xf1;
				test_on(); 
				pow_value = 0x01;
		  } else { 
				test_value = 0xf2;
				test_off();
				pow_value = back.ppow;
		  }		  
		  CtrlOut(0x0f);
		  LedRefresh(0x0f);
	
		  temp[0]=0x01;
		  temp[1]=0x0c;
		  temp[2]=test_value;	  								
    }
	if (flgs.change)
	{
		flgs.change = 0;
    	fcrc = GetCRC16(temp, 3);
		temp[3] = (INT8U)((fcrc & 0xff00) >> 8);
		temp[4] = (INT8U)(fcrc & 0x00ff);
		UART1Putch(0xb0);
		for (i=0; i<5; i++) UART1Putch(temp[i]);
		OSMboxPost(SendMbox, (void *)temp); 
	}			
}

/*********************************************************************************************************
** 函数名称: CtrlOut
** 功能描述: 输出控制字
** 输 入: 控制字类别        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		      
void CtrlOut(INT8U ctrl_no){
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif
    OS_ENTER_CRITICAL();
	if (ctrl_no == 0x03){   //fre
      	IO0PIN = IO0PIN & 0XFFFF00FF |(fre_value << 8); 
	}     
    if (ctrl_no == 0x0f){   //pow
      	IO0PIN = IO0PIN & 0XFFFCFFFF |((pow_value -1) << 16);
	}
    OS_EXIT_CRITICAL();    
}
/*********************************************************************************************************
** 函数名称: LedRefresh
** 功能描述: 更新8字管状态
** 输 入: 更新类别        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		      
void LedRefresh(INT8U fresh_no){

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif

    OS_ENTER_CRITICAL();  
  if (fresh_no == 0x03) {
  	  fre.h = fre_value /10;
	  fre.l = fre_value %10;

      IO0CLR = 0X04 << 24;	//le 1
      IO1PIN = IO1PIN & 0XFFF0FFFF | (fre.h << 16);
      IO0SET = 0X04 << 24;
      
      IO0CLR = 0X08 << 24;	//le 2
      IO1PIN = IO1PIN & 0XFFF0FFFF | (fre.l << 16);
      IO0SET = 0X08 << 24;
  }
  if (fresh_no == 0x0f) {      
      IO0CLR = 0X10 << 24;	//le 3
      IO1PIN = IO1PIN & 0XFFF0FFFF;
      IO0SET = 0X10 << 24;
      
      IO0CLR = 0X20 << 24;	//le 4     
      IO1PIN = IO1PIN & 0XFFF0FFFF | (pow_value << 16);
      IO0SET = 0X20 << 24;
   }
   OS_EXIT_CRITICAL();
}

/*********************************************************************************************************
** 函数名称: Eint3Exception
** 功能描述: 外部中断3服务程序
** 输 入: 无        
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/    		      
void Eint3Exception(void){	  
	  if(flgs.state){
		    OSSemPost(FreSem);
	  }
	  EXTINT      = 0X08;
	  VICVectAddr = 0 ;
	   
      }		
/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
**
** 作 者: 黄凯
** 日 期: 2006年11月10日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main (void){
    OSInit();

	OSTaskCreate(FreConversion, (void *)0, &FreConversionStk[TASK_STK_SIZE - 1], 2);
    OSTaskCreate(SendData, (void *)0, &SendDataStk[TASK_STK_SIZE - 1], 3);
    OSTaskCreate(ReceData, (void *)0, &ReceDataStk[2*TASK_STK_SIZE - 1], 4); 
    OSTaskCreate(Each10sComm, (void *)0, &Each10sCommStk[TASK_STK_SIZE - 1], 5);
    OSTaskCreate(InfoGather, (void *)0, &InfoGatherStk[TASK_STK_SIZE - 1], 6);
    OSStart();
    return 0;
}
	
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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