/****************************************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;
}