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

📄 main.c

📁 基于LPC2134的在ucos2操作系统下的源代码
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"


#define   LED1         1<<21
#define   LED2         1<<22
#define   LED3         1<<23

#define   BEEP         1<<25

#define   KEY_OK1      0
#define	  KEY_LEFT     1
#define	  KEY_RIGHT    2
#define	  KEY_OK       3

#define    IO_KEY1    (1<<16)
#define    IO_KEY2    (1<<17)
#define    IO_KEY3    (1<<18)
#define    IO_KEY4    (1<<19)
#define    IO_KEYALL  (IO_KEY1|IO_KEY2|IO_KEY3|IO_KEY4)

uint16    Samp[100];                     //保存采样结果的数组液晶上显示的点

#define	TaskStkLengh	256              //定义用户任务0的堆栈长度
 

OS_STK	TaskKeyStk [TaskStkLengh];	     //定义用户任务按键任务的堆栈
OS_STK	TaskDispStk [TaskStkLengh];	     //定义用户任务LED显示任务的堆栈


void 	TaskKey(void *pdata);		     //声明按键任务优先级为2
void 	TaskDisp(void *pdata);		     //声明蜂鸣器任务优先级为3
uint8   keyin	(void);

OS_EVENT     *ReMsgQeue;                 //定义消息队列指针
void         *MsgQeueTb[10];             //定义消息指针数组队列长度为10

OS_MEM       *PartitionPt;               //定义内存分区指针
uint8        Partition[10][100];         //定义内存分区的尺寸:每块100字节,共10块

uint8 keyin	(void)
{
     uint32  i;
     uint32  io_dat;
     uint8   key;
     if((IO1PIN&IO_KEYALL)!=IO_KEYALL)
      {
        OSTimeDly(2);
        io_dat=IO1PIN;
        if((io_dat&IO_KEYALL)!=IO_KEYALL)
        { 
         if((io_dat&IO_KEY1)==0)key=KEY_OK1;
         if((io_dat&IO_KEY2)==0)key=KEY_LEFT;
         if((io_dat&IO_KEY3)==0)key=KEY_RIGHT; 
         if((io_dat&IO_KEY4)==0)key=KEY_OK;
         for(i=0;i<100000000;i++)
         {
           if((IO1PIN&IO_KEYALL)==IO_KEYALL) break;
         }
         return(key);
        }
      }
      return(4);
}

int main (void)
{
    GUI_Initialize();         // 初始化LCM
    GUI_SetColor(1, 0);       // 设置前景色和背景色
	OSInit (); 
	OSTaskCreate (TaskKey,(void *)0, &TaskKeyStk[TaskStkLengh - 1], 5);	 //创建LED任务    
    																											
	OSStart (); 
	return 0;															
}

void  Timer1_Exception(void)

{  
   while(1);
}

    
/*********************************************************************************************************
                                    TaskKey 任务Key 优先级为2

********************************************************************************************************/
void TaskKey	(void *pdata)
{   
    uint8  key,i,err,*pt,*pt0;
    uint32 ADC_Data;
	pdata = pdata;
	TargetInit (); 
	PINSEL1 = 1<<28 ;                           //设置P0.30连接到AD0.3同时将其它的口设为GPIO口
    PINSEL2 = 0x00000000;                       //设置四个按键的口线为输入状态p1.16~p1.19
    IO1DIR  = 0x00000000;
    
    /*进行ADC模块设置 */                      
	ADCR = 
	        (1 << 3)                        |   // 选择通道3
	        ((Fpclk / 1000000 - 1) << 8)	|	// CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
			(0 << 16)						|	// BURST=0,软件控制转换操作
			(0 << 17)						|	// CLKS=0, 使用11clock转换
			(1 << 21)						|  	// PDN=1,正常工作模式
			(0 << 22)						|  	// TEST1:0=00,正常工作模式
			(1 << 24)                       |
			(0 << 27);						 	// 直接启动ADC转换时,此位无效
			
				
	IO0DIR  = IO0DIR|LED1|LED2|LED3|BEEP;       //设置IO0DIR|LED1|LED2|LED3|BEEP为输出口
    IO0SET  = LED1|LED2|LED3|BEEP;              //初始化蜂鸣器不响,LED不亮	
    
    ReMsgQeue=OSQCreate(&MsgQeueTb[0],10);      //创建消息队列,长度为10条信息
                                                //每条信息的内容为10个内存块的首地址
                                                
                                                
    PartitionPt=OSMemCreate(Partition,10,100,&err);//创建内存分区用于保存消息
    
    OSTaskCreate (TaskDisp,(void *)0, &TaskDispStk[TaskStkLengh - 1], 6);	                //创建显示任务 	
				   		
	while (1)
	{  
	    key=keyin();
	    switch(key)
	      {
	         case   KEY_OK1:
	                
	                IO0CLR=BEEP;
	                OSTimeDly(2);
	                IO0SET=BEEP;
	                
	                pt=OSMemGet(PartitionPt,&err);            //申请一个内存块
	                pt0=pt;
	                IO0CLR=LED1|LED2|LED3;                    //LED灯亮开始采样数据
	                
	                for(i=0;i<100;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;
                       *pt=(uint8)ADC_Data;
                       pt++;
                       //OSTimeDly(OS_TICKS_PER_SEC/50);      //每秒钟采样50次
                    }
                    
                    IO0SET=LED1|LED2|LED3;                    //LED灯灭结束采样数据                      
                    
                    
                    OSQPost(ReMsgQeue,(void*)pt0);            //将采样数据的存放地址放入消息队列  
	        
	           break;
	         case   KEY_LEFT:
	      
	               
	         
	         
	           break;
	         case   KEY_RIGHT:
	         
	         
	         
	         
	           break;
	        
	         case   KEY_OK:
	         
	         
	         
	         
	          break;
	          
	        default:
              break;
          }
	         
		OSTimeDly(2);
	}
}
/*********************************************************************************************************
**                                          TaskDisp任务Disp
********************************************************************************************************/

void 	TaskDisp(void *pdata)	
{
   uint8  err,i,*pt,*pt0;
   pdata=pdata;
   while(1)
   {
      pt=(uint8*)OSQPend(ReMsgQeue,0,&err);   //获取消息指针
      GUI_ClearSCR();                         //清屏
      pt0=pt;                                 //备份消息指针
      for(i=0;i<100;i++)
      {
         GUI_Point(i,*pt,1);                  //一个数据画一个点
         pt++;
         OSTimeDly(OS_TICKS_PER_SEC/25);
      }
      OSMemPut(PartitionPt,pt0);              //释放消息所占用的内存块
  }
}













⌨️ 快捷键说明

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