带uCOS-II的LPC2131-ADC采样-1602显示

/****************************************Copyright (c)**************************************************
uCOS-II下的ADC采样-1602显示
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"


#define TaskStkLengh 64 //定义用户任务的堆栈长度
extern  void Write(char del);
extern  void Enable(uint32 del);


uint32 ADC_Data,ADC_Data1,ADC_Data2; 
 
 
 
OS_STK Task0Stk [TaskStkLengh]; // 定义用户任务的堆栈15
OS_STK Task1Stk [TaskStkLengh];
void Task0(void *pdata); //Task0 任务0
void Task1(void *pdata); //Task0 任务0
        int main (void)
{
OSInit ();
OSTaskCreate (Task1,(void *)0, &Task1Stk[TaskStkLengh - 1], 2);
OSTaskCreate (Task0,(void *)0, &Task0Stk[TaskStkLengh - 1], 3);
OSStart ();
return 0;
}
/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

void Task0 (void *pdata)
{
pdata = pdata;
TargetInit ();
PINSEL1=(PINSEL1&0x0fffffff)|(1<<28); // P0.30连接到AD0.3
ADCR = (1 << 3) |    // SEL=8,选择通道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) | // START=1,直接启动ADC转换
(0 << 27); // 直接启动ADC转换时,此位无效
ADC_Data = ADDR; // 读取ADC结果,并清除DONE标志位
while (1)
{   OS_ENTER_CRITICAL();                //关中断
ADCR |= 1 << 24; // 进行第一次转换
while ((ADDR & 0x80000000) == 0); // 等待转换结束
ADC_Data1 = ADDR;
ADCR |= 1 << 24; // 再次启动转换
while ((ADDR & 0x80000000) == 0); // 等待转换结束
ADC_Data2 = ADDR; // 读取ADC结果
ADC_Data =( ADC_Data1+ADC_Data2)/2;
ADC_Data = (ADC_Data >> 6) & 0x3ff;
ADC_Data=ADC_Data*3300;
ADC_Data=ADC_Data/1024;

OS_EXIT_CRITICAL();
OSTimeDly(2);
}

}


/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

void Task1 (void *pdata)
{
pdata = pdata;
   
    Init();
while (1)
{
     OS_ENTER_CRITICAL();         //关中断-避免同时处理全局变量
     Enable(0x00000800);
     Write(0x30+(ADC_Data/1000));
     Write(0x30+(ADC_Data%1000/100));
     Write(0x30+(ADC_Data%100/10));
     Write(0x30+(ADC_Data%10));  
     OS_EXIT_CRITICAL();          //开中断
     OSTimeDly(1); 
    }
}


   
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

//以下是1602.c

 #include "config.h"                      //1602 D0-D7接P0.4-P0.11
 #define rs 1<<12                        //设数据/命令选择为P0.12
 #define rw 1<<13                     //设数据/命令选择为P0.13
 #define e 1<<15                     //设数据/命令选择为P0.14
 #define uchar unsigned char
 #define uint unsigned int
 int Display_String(uchar hang,uchar lie,char *p);

/********************************************************************
 * 名称 : delay()
 * 功能 : 延时
 * 输入 : 无
 * 输出 : 无
 ***********************************************************************/
void Delay (uint32 dly)
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<820; i++);
}


 /********************************************************************
 * 名称 : Enable(uchar del)
 * 功能 : 1602命令函数
 * 输入 : 输入的命令值
 * 输出 : 无
 ***********************************************************************/
 void Enable(uint32 del) 
 {
 IO0PIN=IO0PIN&0xfffff00f|del; //写命令
 Delay(5);
 IO0CLR=rs;
 IO0CLR=rw;
 IO0CLR=e;
 IO0SET=e;
 Delay(5);
 }
 /********************************************************************
 * 名称 : Init()
 * 功能 : 1602初始化
 * 输入 : 无
 * 输出 : 无
 ***********************************************************************/
 int Init() ////初始化
 {
 PINSEL0=0X00000000; //设端口位GPIO功能   
 IO0DIR=0xffffffff; //设端口位输出功能 
 IO0SET=0xffffffff; //初始化端口 
 Enable(0x00000380);
 Delay(15);
 Enable(0x00000380);
 Delay(5);
 Enable(0x00000380);
 Delay(5);
 Enable(0x00000380);
 Enable(0x00000080);
 Enable(0x00000010);
 Enable(0x00000060);
 Enable(0x000000c0);
 return(0);
 }
 /********************************************************************
 * 名称 : Write(uchar del)
 * 功能 : 1602写数据函数
 * 输入 : 需要写入1602的数据
 * 输出 : 无
 ***********************************************************************/
 void Write(char del) 
 {
 IO0PIN=del*16+(IO0PIN&0xfffff00f); //写数据

 Delay(5);
 IO0SET=rs;
 IO0CLR=rw; 
 IO0CLR=e;
 Delay(5);
 IO0SET=e;
 Delay(5);      
 }
 /********************************************************************
 * 名称 : Display_Char()
 * 功能 : 显示单个字符函数
 * 输入 : hang显示的行数,lie显示的列数,sign显示的内容
 * 输出 : 无
 ***********************************************************************/
 int Display_Char(uchar hang,uchar lie,char sign)
 {    
 uint32 a;
 if(hang==1) a=0x00000800; 
 if(hang==2) a=0x00000c00;
 a=a+lie*16-1;
 Enable(a);
 Write(sign);      
 IO0PIN=IO0PIN&0xfffff00f|0x00000010;    
 return 0;
 }
 /********************************************************************
 * 名称 : Display_String()
 * 功能 : 显示字符串函数
 * 输入 : hang显示的行数,lie显示的列数,*p显示的内容
 * 输出 : 无
 ***********************************************************************/
 int Display_String(uchar hang,uchar lie,char *p)
 {    
 uint32 a;
 if(hang==1) a=0x00000800; 
 if(hang==2) a=0x00000c00;
 a=a+lie*16-1;
 Enable(a);
 while(1)
 {
 if(*p=='\0') break;
 Write(*p);
 p++;
 }      
 IO0PIN=IO0PIN&0xfffff00f|0x00000010;    
 return 0;
 }

 

posted @ 2013-03-08 22:26  顶顶顶顶  阅读(205)  评论(0)    收藏  举报