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

📄 main.c

📁 基于LPC2134的在ucos2操作系统下的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                  {
                    arr[0]=8;
                    OSQPost(ReMsgQeue,(void*)arr);
                  }
                  if(key==4)
                  {
                    arr[0]=4;
                    dangqian++;
	                if(dangqian==4)dangqian=0;
	                OSQPost(ReMsgQeue,(void*)arr);
                   
                  }
          
          
          
                break;
          case   4:
                 if(key==3)
                  {
                   OS_ENTER_CRITICAL();
                   zhouqi=Dispnum[0]*1000+Dispnum[1]*100+Dispnum[2]*10+Dispnum[3];
                   dianshu=Dispnum1[0]*100+Dispnum1[1]*10+Dispnum1[2]; 
                   OS_EXIT_CRITICAL();
                   cond[0]=zhouqi;
                   cond[1]=dianshu;
                   //if((zhouqi%10)==0)
                     OSTaskCreate (TaskDelaySamp,(void *)cond, &TaskDelaySampStk[TaskStkLengh - 1], 6);	//创建延时采样任务
                   //if((zhouqi%10)!=0)
                    //OSTaskCreate (TaskIntSamp,(void *)cond, &TaskIntSampStk[TaskStkLengh - 1], 5);	//创建定时采样任务	 
                  }
                
                  if(key==4)
                  {
                    arr[0]=4;
                    dangqian++;
	                if(dangqian==4)dangqian=0;
	                OSQPost(ReMsgQeue,(void*)arr);
                   
                  }
                  
                break;
           
          
          }
        
	         
		OSTimeDly(2);
	}
}




/*********************************************************************************************************
**                            Task0 任务0
** 功能:使用ZLG/GUI,在屏幕上同时显示多个"Hello ZLG/GUI!"字符串
********************************************************************************************************/
void TaskDisp(void *pdata)
{  
     uint8   i,err,Index=0,xiougai=0,clr=0,dangqian=0,x=0,y;
     uint8   coord=0,coord1=7;          //显示x的坐标为0
     uint8   *pt;
    
     uint8   shuz=0;  
	 pdata = pdata;
	 
	 Dispnum[0]=0;
	 Dispnum[1]=1;
	 Dispnum[2]=0;
	 Dispnum[3]=0;
	 
	 Dispnum1[0]=1;
	 Dispnum1[1]=0;
	 Dispnum1[2]=0;
	 
	 
    
	 GUI_LoadPic1(0,0,*(num+Dispnum[0]),5,8);
	 for(i=1;i<4;i++)  
        GUI_LoadPic(5*i,0,*(num+Dispnum[i]),5,8);
                
                
     for(i=0;i<3;i++)
        GUI_LoadPic(5*i+30,0,*(num+Dispnum1[i]),5,8);
              
              
	 GUI_LoadPic1(0,45,*(hanzi+0),24,14);
	 for(i=1;i<4;i++)
         GUI_LoadPic(32*i,45,*(hanzi+i),24,14); 

	
	while (1)
	{  
	   pt=(uint8*)OSQPend(ReMsgQeue,0,&err);              //等待一条短消息 
	   
	   switch(pt[0])
	   {
	     case  1:
	           Dispnum[coord]=pt[1];
	           break;
	     case  2:
	           coord++;
	           if(coord==4)coord=0;
	           
	           break;
	     case  3:
	           if(pt[1])
	              coord=0;
	           else
	              coord=7;
	           
	           break;
	     case  4:
	           dangqian++;
	           if(dangqian==4)dangqian=0;
	           break;
	     case  5:
	           Dispnum1[coord1]=pt[1];
	           break;
	     case  6:
	           coord1++;
	           if(coord1==4)coord1=0;
	           
	           break;
	     case  7:
	           if(pt[1])
	              coord1=0;
	           else
	              coord1=7;
	           
	           break;
	     case  8:
	           clr=1;
	           break;
	     case  9:
	          
	           if(pt[1]==0xff)
	              x=0;
	           else
	            {
	              y=pt[1];
	 
	              GUI_Point(x,y,1);                 
                  x++;
                }
               
	           break;
	     default:
	           break;
	   }
	   
       if(!clr)
         {
           
         
            for(i=0;i<4;i++)
              {
               
                if(i==coord)
                  GUI_LoadPic1(5*i,0,*(num+Dispnum[i]),5,8);
                else
                  GUI_LoadPic(5*i,0,*(num+Dispnum[i]),5,8);
              }
            for(i=0;i<4;i++)
              {
                if(i==dangqian)
                   GUI_LoadPic1(32*i,45,*(hanzi+i),24,14); 
                else
                   GUI_LoadPic(32*i,45,*(hanzi+i),24,14); 
              }
            for(i=0;i<3;i++)
              {
               
                if(i==coord1)
                  GUI_LoadPic1(5*i+30,0,*(num+Dispnum1[i]),5,8);
                else
                  GUI_LoadPic(5*i+30,0,*(num+Dispnum1[i]),5,8);
              }
        }
        
        
      else
         {
             GUI_ClearSCR();
             clr=0;
         }
    
    }
    
}  
/*********************************************************************************************************
**                               DelaySamp采样任务优先级为6
********************************************************************************************************/
void TaskDelaySamp(void *pdata)
 {
     uint8  samp[4],err;
     uint32 ADC_Data,i;
     uint16 zhouqi,dianshu,*pt;
     pt=(uint16*)pdata;
     zhouqi=pt[0];
     dianshu=pt[1];
     samp[0]= 9;
     samp[1]= 0xff;
     OSQPost(ReMsgQeue,(void*)samp);
     OSTimeDly(1);
     OSMutexPend(sem,0,&err);
     IO0CLR=LED1|LED2|LED3;                             // 采样开始
     for(i=1;i<dianshu;i++)
	    {
	                  
          ADC_Data = ADDR;		                        // 读取ADC结果,并清除DONE标志位
          ADCR|=(1 << 24);	
          while((ADDR&0x80000000)==0);               
          ADCR|=(1 << 24);	           			
          while ((ADDR & 0x80000000) == 0);
          ADC_Data = ADDR;
          ADC_Data = (ADC_Data >> 6) & 0x3ff;
          ADC_Data = ADC_Data *2480/1024;
          ADC_Data = 62-ADC_Data*62/2480;
          samp1[i] = (uint8)ADC_Data;
          samp[1]   =  samp1[i];
          OSQPost(ReMsgQeue,(void*)samp);
          OSTimeDly(zhouqi/10);  
        }
     OSMutexPost(sem);               
     IO0SET=LED1|LED2|LED3;       //结束采样                   
     OSTaskDel(OS_PRIO_SELF);
 }               
                    
void  show(uint32  *a,uint32 n)
{  
   uint16  i;
   GUI_ClearSCR();
   for(i=0;i<n;i++)
      { 
        GUI_Point(i,a[i],1); 
      }        
}                           
 /*********************************************************************************************************
**                               IntSamp采样任务优先级为6
********************************************************************************************************/
void TaskIntSamp(void *pdata)
 {
   
               
     uint8  samp[4],err;
     uint16 zhouqi,dianshu,*pt,i;
     uint32  Temp;
     pt=(uint16*)pdata;
     zhouqi=pt[0];
     dianshu=pt[1];
     
     //OSMutexPend(sem,0,&err);
     samp1[0]=dianshu;
     samp[0]= 9;
     samp[1]= 0xff;
     OSQPost(ReMsgQeue,(void*)samp);
     OSTimeDly(1);
     
     /*进行T1定时器模块的设置*/
     T1IR   = 0xffffffff;                                // 复位中断源
	 T1TC   = 0;			                             // 定时器设置为0
	 T1TCR  = 0x01;	  	                                 // 使能定时器										
	 T1PR   = 0;			                             // 时钟不分频											
	 T1MCR  = 0x03;		                                 // 设置T0MR0匹配后复位T0TC,并产生中断标志				
	 T1MR0  = zhouqi*(Fpclk/1000);	                                 // 设定定时时间	
	 
	 VICIntSelect=0;
     Temp=ADDR;
     IO0CLR=LED1|LED2|LED3; // 采样开始
     MyMbox=OSMboxCreate((void *)0);
     
     VICIntEnable=1<<5;	 
     for(i=1;i<dianshu+1;i++)
     {
       samp1[i]=*(uint16*)OSMboxPend(MyMbox,0,&err);
       samp[1]=(uint8)samp1[i];
       OSQPost(ReMsgQeue,(void*)samp);
     }
     OSMboxDel(MyMbox,OS_DEL_ALWAYS,&err);               // 不管有没有等待邮箱的消息,立即删除邮箱
     //OSMutexPost(sem); 
     VICIntEnClr=1<<5;              
     IO0SET=LED1|LED2|LED3;                              // 结束采样                 
     OSTaskDel(OS_PRIO_SELF);       
 }               
                        
                        
  void  Timer1_Exception(void)

{  
   static   uint32   ADC_Data;
   OS_ENTER_CRITICAL();                   // 关中断
   T1IR=0x01;                             // 清除中断源
   VICVectAddr=0;                         // 通知中断控制器中断结束
   ADC_Data = ADDR;		                  // 读取ADC结果,并清除DONE标志位
   ADCR|=(1 << 24);	
   while((ADDR&0x80000000)==0);               
   ADCR|=(1 << 24);	           			
   while ((ADDR & 0x80000000) == 0);
   ADC_Data = ADDR;
   ADC_Data = (ADC_Data >> 6) & 0x3ff;
   ADC_Data =ADC_Data *2480/1024;
   ADC_Data =62-ADC_Data*62/2480;
   OS_EXIT_CRITICAL();                   //开中断
   OSMboxPost(MyMbox,(void*)&ADC_Data);
  
}
     
   
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

⌨️ 快捷键说明

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