📄 main.c
字号:
/*************************************************************************************
** Copyright (c) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
** http:XXXXXXXXXXXXXXX
**文件名称:MAIN.C
**功能说明:LPC2142的大部分功能实验主函数,包括按键、中断,beep、流水灯、定时器、RTC、AD/DA、
UART、LCD。
**使用说明:
** 当前版本: 1.0
** 作 者: xxx
** 完成日期: 2007年xx月xx号
*************************************************************************************/
/************************************************************************************
引脚分布
P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7
TX0 RX0 CS1 K4 K3
P0.8 P0.9 P0.10 P0.11 P0.12 P0.13 P0.14 P0.15
TX1 RX1 RW SCL SDA K1 VRST K2
P0.16 P0.17 P0.18 P0.19 P0.20 P0.21 P0.22 P0.23
BEEP SCK1 MISO MOSI SSEL RS_COM RW VB
P0.24 P0.25 P0.26 P0.27 P0.28 P0.29 P0.30 P0.31
AOUT D+ D- A_IN1 A_IN2 CS2 ULED
LED引脚
L1---------L8
P1.16----P1.23
***********************************************************************************/
#include "config.h"
#include "stdlib.h"
#include "common.h"
#define TaskStkLengh 64 //Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK TaskStk [TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈
OS_STK TaskStk1 [TaskStkLengh]; //Define the Task1 stack 定义用户任务1的堆栈
OS_STK TaskStk2 [TaskStkLengh]; //Define the Task1 stack 定义用户任务2的堆栈
OS_STK TaskStk3 [TaskStkLengh]; //Define the Task1 stack 定义用户任务3的堆栈
OS_STK TaskStk4 [TaskStkLengh]; //Define the Task1 stack 定义用户任务4的堆栈
OS_STK TaskStk5 [TaskStkLengh]; //Define the Task1 stack 定义用户任务5的堆栈
OS_STK TaskStk6 [TaskStkLengh]; //Define the Task1 stack 定义用户任务6的堆栈
OS_EVENT *UartDataSem; //定义信号量
OS_EVENT *UartDataBox; //定义邮箱
OS_EVENT *UartDataQuee; //定义消息队列
void Task0(void *pdata); //Task0 任务0
void Task1(void *pdata); //Task1 任务1
void Task2(void *pdata); //Task1 任务2
void Task3(void *pdata); //Task1 任务3
void Task4(void *pdata); //Task1 任务4
void Task5(void *pdata); //Task1 任务5
void Task6(void *pdata); //Task1 任务6
RTCTIME NowTime; //定义当前时间
int main (void)
{ void *MessageStorage[10] ; //定义用于创建消息队列的数组指针
OSInit ();
//UartDataSem=OSSemCreate(0); //创建信号量
//UartDataBox=OSMboxCreate(0); //创建邮箱
UartDataQuee=OSQCreate(MessageStorage,10); //创建消息队列
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2); //创建任务0
OSStart ();
return 0;
}
/*********************************************************************************************************
** Task0 任务0
** 初始化目标板并创建其他任务
********************************************************************************************************/
void Task0 (void *pdata)
{
pdata = pdata;
TargetInit (); //初始化目标板
//创建其它任务
OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);
OSTaskCreate (Task2,(void *)0, &TaskStk2[TaskStkLengh - 1], 4);
OSTaskCreate (Task3,(void *)0, &TaskStk3[TaskStkLengh - 1], 5);
OSTaskCreate (Task4,(void *)0, &TaskStk4[TaskStkLengh - 1], 6);
OSTaskCreate (Task5,(void *)0, &TaskStk5[TaskStkLengh - 1], 8);
OSTaskCreate (Task6,(void *)0, &TaskStk6[TaskStkLengh - 1], 7);
while (1)
{
OSTimeDly(10);
}
}
/*********************************************************************************************************
** Task1 任务1
按键1激活输出周期100ms的流水灯
********************************************************************************************************/
void Task1 (void *pdata)
{ INT8U j=0;
pdata = pdata;
while (1)
{
OSTaskSuspend(3); //挂起本任务,由按键1激活
IO1PIN=~((1<<16)<<j); //输出流水灯
j++;
if(j==8) j=0;
OSTimeDlyHMSM(0,0,0,100);
}
}
/*********************************************************************************************************
** Task2 任务2
按键2激活输出周期流水灯,周期由AIN2控制
********************************************************************************************************/
void Task2 (void *pdata)
{
INT8U i=0;
INT16U AdData1;
INT16U AdData2;
pdata = pdata;
while(1)
{
OSTaskSuspend(4); //挂起本任务,由按键1激活
// AD_Start(1);
// AdData1=Get_ADData();
AD_Start(2);
AdData2=Get_ADData(); //采集AIN2的数据
if((AdData2<100)||(AdData2>1000))
AdData2=900;
IO1PIN=~((1<<16)<<i); //输出流水灯
i++;
if(i==8) i=0;
OSTimeDlyHMSM(0,0,0,AdData2);
}
}
/*********************************************************************************************************
** Task3 任务3
按键3激活采集温度(AIN1)电压(AIN2)数据 并通过消息队列发送给TASK6
********************************************************************************************************/
void Task3 (void *pdata)
{ INT8U err;
INT16U AdData1;
INT16U AdData2;
INT8U NowThermal;
INT16U NowVolt;
INT16U DataSend[9];
pdata = pdata;
while(1)
{
OSTaskSuspend(5);
AD_Start(1);
AdData1=Get_ADData();
AD_Start(2);
AdData2=Get_ADData();
//NowThermal=AdData1*100/1024; //实际的采样值
NowThermal=60; //软件模拟用假设值
//NowVolt=AdData1*3300/1024;
NowVolt=700;
NowTime=Get_RTCTime(); //获取当前时间
DataSend[0]= NowThermal;
DataSend[1]= NowVolt;
DataSend[2]= NowTime.year;
DataSend[3]= NowTime.mon;
DataSend[4]= NowTime.dom;
DataSend[5]= NowTime.dow;
DataSend[6]= NowTime.hour;
DataSend[7]= NowTime.min;
DataSend[8]= NowTime.sec;
//可以采用下面三种方法进行与TASK6的通讯
//err=OSSemPost(UartDataSem); //发送信号量
//err=OSMboxPost(UartDataBox,(void *)&NowThermal); //发送邮箱
err=OSQPost(UartDataQuee,(void *)DataSend); //发送消息队列
//OSTaskResume(4) ;
OSTimeDlyHMSM(0,0,0,100);
}
}
/*********************************************************************************************************
** Task4
按键4使系统进入掉电模式,按外部中断1恢复正常模式
********************************************************************************************************/
void Task4 (void *pdata)
{
pdata = pdata;
while(1)
{
OSTaskSuspend(6);
Power_Con();
PllVpb_Ini();
OSTimeDlyHMSM(0,0,0,100);
}
}
/*********************************************************************************************************
** Task2 任务2
获取按键
********************************************************************************************************/
void Task5 (void *pdata)
{ INT8U KeyNum;
INT8U LastKey;
pdata = pdata;
while (1)
{
KeyNum=Scan_Key(); //获取当前按键,只有按下的时候是键值,弹起来后键值为0
/******************************************************************
对键值的处理:没有建按下的时候键值按前一个键值处理,键4除外
********************************************************************/
if((LastKey!=NO_KEY)&&(KeyNum!=NO_KEY)) LastKey=KeyNum;
else if(KeyNum !=NO_KEY)
LastKey=KeyNum;
if (KeyNum== NO_KEY)
{
if (LastKey== KEY1)
KeyNum=KEY1;
if (LastKey== KEY2)
KeyNum=KEY2;
if (LastKey== KEY3)
KeyNum=KEY3;
if (LastKey== KEY4)
KeyNum=NO_KEY;
}
/**********************恢复各任务***********************************************/
switch(KeyNum)
{case KEY1: OSTaskResume(3); break;
case KEY2: OSTaskResume(4); break;
case KEY3: OSTaskResume(5); break;
case KEY4: OSTaskResume(6); break;
}
OSTimeDlyHMSM(0,0,0,10);
}
}
/*********************************************************************************************************
** Task6
串口发送某1时刻的温度,电压,由任务3触发
********************************************************************************************************/
void Task6 (void *pdata)
{ INT16U *msg;
INT8U err;
INT8U NowThermal;
INT16U NowVolt;
pdata = pdata;
while(1)
{
//OSTaskSuspend(4);
//OSSemPend(UartDataSem,0,&err); // 获取信号量(不能传送值,需要将NowThermal定义成外部全局变量
//msg=OSMboxPend(UartDataBox,0,&err); // 获取邮箱(每次只能传送一个值)
msg=OSQPend(UartDataQuee,0,&err); // 获取消息队列(一次传送所有数据)
NowThermal=msg[0];
NowVolt=msg[1];
NowTime.year=msg[2];
NowTime.mon=msg[3];
NowTime.dom=msg[4];
NowTime.dow=msg[5];
NowTime.hour=msg[6];
NowTime.min=msg[7];
NowTime.sec=msg[8];
Uart1_SendString("thermal:");
Uart1_SendByte(NumToChar(NowThermal/100));
Uart1_SendByte(NumToChar((NowThermal%100)/10));
Uart1_SendByte(NumToChar(NowThermal%10));
Uart1_SendByte('\n');
Uart1_SendString("Voltage:");
Uart1_SendByte(NumToChar(NowVolt/1000));
Uart1_SendByte(NumToChar((NowVolt%1000)/100));
Uart1_SendByte(NumToChar((NowVolt%100)/10));
Uart1_SendByte(NumToChar(NowVolt%10));
Uart1_SendByte('\n');
Uart1_SendString("year:");
Uart1_SendByte(NumToChar(NowTime.year/1000));
Uart1_SendByte(NumToChar((NowTime.year%1000)/100));
Uart1_SendByte(NumToChar((NowTime.year%100)/10));
Uart1_SendByte(NumToChar(NowTime.year%10));
Uart1_SendByte('\n');
Uart1_SendString("month:");
Uart1_SendByte(NumToChar(NowTime.mon/10));
Uart1_SendByte(NumToChar(NowTime.mon%10));
Uart1_SendByte('\n');
Uart1_SendString("date:");
Uart1_SendByte(NumToChar(NowTime.dom/10));
Uart1_SendByte(NumToChar(NowTime.dom%10));
Uart1_SendByte('\n');
Uart1_SendString("weekday:");
Uart1_SendByte(NumToChar(NowTime.dow));
Uart1_SendByte('\n');
Uart1_SendString("hour:");
Uart1_SendByte(NumToChar(NowTime.hour/10));
Uart1_SendByte(NumToChar(NowTime.hour%10));
Uart1_SendByte('\n');
Uart1_SendString("minute:");
Uart1_SendByte(NumToChar(NowTime.min/10));
Uart1_SendByte(NumToChar(NowTime.min%10));
Uart1_SendByte('\n');
Uart1_SendString("second:");
Uart1_SendByte(NumToChar(NowTime.sec/10));
Uart1_SendByte(NumToChar(NowTime.sec%10));
Uart1_SendByte('\n');
Uart1_SendByte('\n');
// OSTimeDlyHMSM(0,0,0,1000);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -