📄 main.c
字号:
/*
*==================================================================================================
* 描述: HexOk + FreeRTOS, 10 个任务, 基本功能测试
* Version: v2008.02
* MCU & IC: LPC2131 ( + )
* Frequency: Fosc=20.000M, Fcclk=3*Fosc, Fpclk=0.75*Fosc
* Compiler: CodeSourcery gcc
* 版权信息: W&T Co, Ltd(2005-2008), flyyyying@126.com, 2008-02-17
*==================================================================================================
*/
#include <stdio.h>
#include "..\bsp\bsp.h"
#include "..\bsp\i2c.h"
#include "..\bsp\lpc213_4x.h"
#include "..\rtos\source\task.h"
unsigned int msg_uart0_rcv_data=0; //串口0接收中断之消息
unsigned int msg_read_I2C=0; //读取I2C参数之消息
unsigned short flag_BELL=0; //是否响铃之信号量
unsigned short xxx=1973; //4个8段管显示的数据
unsigned short grade=1; //铃响、DS3灯闪的速度级别, 由可调电阻调节
unsigned short ds2_ivl=10;
unsigned char ee_buf[8]={'L','P','C',};
void Task1_XXXX(void *pdata);
void Task2_LED2(void *pdata);
void Task3_LED3(void *pdata);
void Task4_KEYS(void *pdata);
void Task5_8SEG(void *pdata);
void Task6_BELL(void *pdata);
void Task7_TRN0(void *pdata);
void Task8_REC0(void *pdata);
void Task9_ADC0(void *pdata);
void TaskA_I2C0(void *pdata);
/*
*--------------------------------------------------------------------------------------------------
*--------------------------------------------------------------------------------------------------
*/
int main (void)
{
BSP_Init();
xTaskCreate(Task1_XXXX, (signed char *)"1", 32, NULL, 2, NULL);
xTaskCreate(Task2_LED2, (signed char *)"2", 32, NULL, 3, NULL);
xTaskCreate(Task3_LED3, (signed char *)"3", 32, NULL, 3, NULL);
xTaskCreate(Task4_KEYS, (signed char *)"4", 32, NULL, 4, NULL);
xTaskCreate(Task5_8SEG, (signed char *)"5", 32, NULL, 8, NULL);
xTaskCreate(Task6_BELL, (signed char *)"6", 32, NULL, 5, NULL);
xTaskCreate(Task7_TRN0, (signed char *)"7", 32, NULL, 6, NULL);
xTaskCreate(Task8_REC0, (signed char *)"8", 32, NULL, 7, NULL);
xTaskCreate(Task9_ADC0, (signed char *)"9", 32, NULL, 2, NULL);
xTaskCreate(TaskA_I2C0, (signed char *)"A", 32, NULL, 1, NULL);
vTaskStartScheduler();
return (0);
}
/*
*--------------------------------------------------------------------------------------------------
* 每 5 秒令4位8段管上的数字加 1
*--------------------------------------------------------------------------------------------------
*/
void Task1_XXXX(void *pdata)
{
(void)pdata;
while (1) {
xxx ++;
vTaskDelay(_5s);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 每秒闪1次DS2
*--------------------------------------------------------------------------------------------------
*/
void Task2_LED2(void *pdata)
{
(void)pdata;
while (1) {
TurnOnnDS2();
vTaskDelay(_50ms*ds2_ivl);
TurnOffDS2();
vTaskDelay(_50ms*ds2_ivl);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 依一定间隔闪DS3, 间隔与 ADC 采样的电压值等级平方成正比
*--------------------------------------------------------------------------------------------------
*/
void Task3_LED3(void *pdata)
{
unsigned short tmp;
(void)pdata;
while (1) {
tmp = grade*grade;
TurnOffDS3();
vTaskDelay(_2ms*tmp);
TurnOnnDS3();
vTaskDelay(_2ms*tmp);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 处理按键, 'F' 键开/关响铃, 0-9 键输入数字, A,E 保存设置值到EEROM
*--------------------------------------------------------------------------------------------------
*/
void Task4_KEYS(void *pdata)
{
unsigned long key;
(void)pdata;
while (1) {
key = key_scan();
if (key<10) { //0-9, 输入数字
xxx %=1000; xxx*=10;
xxx += (unsigned short)(key);
}
if (key==10) { //A, ds2闪烁间隔50ms
ee_buf[0] = 1;
I2C_WriteNByte(AT24C16, _1BYTE_SUBA, 0x05, ee_buf, 1);
}
/*if (key==11) { //B, ds2闪烁间隔250ms
ee_buf[0] = 5;
I2C_WriteNByte(AT24C16, _1BYTE_SUBA, 0x05, ee_buf, 1);
}*/
if (key==14) { //E, ds2闪烁间隔500ms
ee_buf[0] = 10;
I2C_WriteNByte(AT24C16, _1BYTE_SUBA, 0x05, ee_buf, 1);
}
if (key==15) { //F, 开/关铃响
flag_BELL = (flag_BELL)?0 :1;
}
vTaskDelay(_50ms);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 动态刷新4个8段数码管的显示
*--------------------------------------------------------------------------------------------------
*/
void Task5_8SEG(void *pdata)
{
(void)pdata;
while (1) {
DispNumber(xxx);
vTaskDelay(_2ms);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 依一定间隔响铃, 间隔与 ADC 采样的电压值等级平方成正比
*--------------------------------------------------------------------------------------------------
*/
void Task6_BELL(void *pdata)
{
unsigned short tmp;
(void)pdata;
while (1) {
if (flag_BELL) {
tmp = grade*grade;
TurnOnnBELL();
vTaskDelay(_2ms*tmp);
TurnOffBELL();
vTaskDelay(_2ms*tmp);
} else
vTaskDelay(_10ms);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 串口 0 每秒发送 xxx 值串
*--------------------------------------------------------------------------------------------------
*/
void Task7_TRN0(void *pdata)
{
unsigned char str[11]={0x35,0x36,0x37,0x0D,0x0A,0x00,};
unsigned short tmp;
(void)pdata;
str[4] = str[5] = ' ';
str[6] = str[7] = '.';
str[8] = str[9] = '.';
str[10] = 0;
while (1) {
tmp = xxx; str[0] = tmp/1000 + 0x30;
tmp %= 1000; str[1] = tmp/100 + 0x30;
tmp %= 100; str[2] = tmp/10 + 0x30;
tmp %= 10; str[3] = tmp + 0x30;
UART0_putstr(str);
vTaskDelay(_1000ms);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 串口 0 有数据接收到时, 后台须及时处理
*--------------------------------------------------------------------------------------------------
*/
void Task8_REC0(void *pdata)
{
unsigned char len, type, fifo3;
(void)pdata;
while (1) {
if (msg_uart0_rcv_data) {
msg_uart0_rcv_data = 0;
fifo3 = 0x00;
if (UART0RBUF[0]==0x0F) {
len = UART0RBUF[1];
type = UART0RBUF[2];
fifo3 = UART0RBUF[3];
//.....
}
if (fifo3==0x01) {flag_BELL=0; xxx=0;}
if (fifo3==0x02) {flag_BELL=1; xxx=2005;}
if (fifo3==0x03) {msg_read_I2C=1;}
}
vTaskDelay(_2ms);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 每 50ms 读取一次 ADC
*--------------------------------------------------------------------------------------------------
*/
void Task9_ADC0(void *pdata)
{
unsigned long tmp;
(void)pdata;
while (1) {
ADC0_read(&tmp);
grade = tmp/10 + 1;
vTaskDelay(_50ms);
}
}
/*
*--------------------------------------------------------------------------------------------------
* 若需读取 EEROM 中的设置值, 则读之
*--------------------------------------------------------------------------------------------------
*/
void TaskA_I2C0(void *pdata)
{
(void)pdata;
while (1) {
if (msg_read_I2C) {
msg_read_I2C = 0;
I2C_ReadNByte(AT24C16, _1BYTE_SUBA, 0x05, ee_buf, 1);
ds2_ivl = ee_buf[0];
}
vTaskDelay(_100ms);
}
}
/*=============================================<EOF>=============================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -