📄 artxdemo.c
字号:
/*--------------------------------------------------------
ARTX水鸟LPC2131板实验笔记
HotPower@126.com 2006.1.15 03:18 于西安大雁塔村队部
---------------------------------------------------------*/
//#include <ARTX.h> /* ARTX kernel functions & defines */
#include <RTL.h> /* RTX kernel functions & defines */
//#include <LPC213x.H> // Philips Peripheral Registers
#include <LPC213xDEF.H> //ARM菜鸟HotPower创建定义文件(新版)
/*-----------------------------------------
LED数码字符定义
-------------------------------------------*/
//共阳极数码管(左移)
#define LedSegA 0x01
#define LedSegB 0x02
#define LedSegC 0x04
#define LedSegD 0x08
#define LedSegE 0x10
#define LedSegF 0x20
#define LedSegG 0x40
#define LedSegH 0x80
//
//共阳极数码管(右移)
/*
#define LedSegA 0x80
#define LedSegB 0x40
#define LedSegC 0x20
#define LedSegD 0x10
#define LedSegE 0x08
#define LedSegF 0x04
#define LedSegG 0x02
#define LedSegH 0x01
*/
//
#define LedChar0 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF )
#define LedChar1 ( LedSegB + LedSegC )
#define LedChar2 (LedSegA + LedSegB + LedSegD + LedSegE + LedSegG)
#define LedChar3 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegG)
#define LedChar4 ( LedSegB + LedSegC + LedSegF + LedSegG)
#define LedChar5 (LedSegA + LedSegC + LedSegD + LedSegF + LedSegG)
#define LedChar6 (LedSegA + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar7 (LedSegA + LedSegB + LedSegC )
#define LedChar8 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar9 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegF + LedSegG)
#define LedCharA (LedSegA + LedSegB + LedSegC + LedSegE + LedSegF + LedSegG)
#define LedCharB ( LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharC (LedSegA + LedSegD + LedSegE + LedSegF )
#define LedCharD ( LedSegB + LedSegC + LedSegD + LedSegE + LedSegG)
#define LedCharE (LedSegA + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharF (LedSegA + LedSegE + LedSegF + LedSegG)
#define RCLK P0_29
//#define SCK0 P0_28 //<LPC213xDEF.H>已定义
//#define MOSI0 P0_25 //<LPC213xDEF.H>已定义
#define BEEP P0_7// P0.7控制蜂鸣器,低电平蜂鸣
#define KEY1 P0_16//
#define KEY2 P0_17//
#define KEY3 P0_18//
#define KEY4 P0_19//
#define KEY5 P0_20//
#define KEY6 P0_21//
#define LED1 P1_18//
#define LED2 P1_19//
#define LED3 P1_20//
#define LED4 P1_21//
#define LED5 P1_22//
#define LED6 P1_23//
#define LED7 P1_24//
#define LED8 P1_25//
static const unsigned char LedTab[] =
{
~LedChar0,
~LedChar1,
~LedChar2,
~LedChar3,
~LedChar4,
~LedChar5,
~LedChar6,
~LedChar7,
~LedChar8,
~LedChar9,
~LedCharA,
~LedCharB,
~LedCharC,
~LedCharD,
~LedCharE,
~LedCharF
};
OS_TID Main_Task, Key_Task, Led_Task, Lednum_Task, Beep_Task;
void MainTask (void) __task;
void KeyTask (void) __task;
void LedTask (void) __task;
void LednumTask (void) __task;
void BeepTask (void) __task;
void SystemInit(void);
void KeyInit(void);
void LedInit(void);
void LednumInit(void);
void BeepInit(void);
void MSPI_Init(void);
unsigned char MSPI_SendData(unsigned char);
void LedDisplay(unsigned char);
void SystemInit(void) {
PINSEL->PIN_SEL0 = 0x00000000; // 设置管脚连接GPIO
PINSEL->PIN_SEL1 = 0x00000000; // 设置管脚连接GPIO
P0->IODIR = 0x00000000; // 设置P0口为输入
P1->IODIR = 0x00000000; // 设置P1口为输入
}
void KeyInit(void) {
}
void LedInit(void) {
P1->IODIR |= (1 << LED1) | // 设置LED1为输出
(1 << LED2) | // 设置LED2为输出
(1 << LED3) | // 设置LED3为输出
(1 << LED4) | // 设置LED4为输出
(1 << LED5) | // 设置LED5为输出
(1 << LED6) | // 设置LED6为输出
(1 << LED7) | // 设置LED7为输出
(1 << LED8); // 设置LED8为输出
P1->IOSET = (1 << LED1) | // 关闭LED1
(1 << LED2) | // 关闭LED2
(1 << LED3) | // 关闭LED3
(1 << LED4) | // 关闭LED4
(1 << LED5) | // 关闭LED5
(1 << LED6) | // 关闭LED6
(1 << LED7) | // 关闭LED7
(1 << LED8); // 关闭LED8
}
void LednumInit(void) {
MSPI_Init();
}
void MSPI_Init(void) {
PINSEL->PIN_SEL0 |= ((P0_4_SCK0 << P0_4_PINSEL) | (P0_5_MISO0 << P0_5_PINSEL) | (P0_6_MOSI0 << P0_6_PINSEL));
P0->IODIR |= (1 << RCLK); // 设置RCLK控制口为输出
P0->IOCLR = (1 << RCLK);
SPI->SPI_SPCCR = 0x52; // 设置SPI时钟分频
SPI->SPI_SPCR = (1 << CPHA) | // CPHA = 1, 数据在SCK 的第2个时钟沿采样
(1 << CPOL) | // CPOL = 1, SCK 为低有效
(1 << MSTR) | // MSTR = 1, SPI 处于主模式
(0 << LSBF) | // LSBF = 0, SPI 数据传输MSB (位7)在先
(0 << SPIE); // SPIE = 0, SPI 中断被禁止
}
unsigned char MSPI_SendData(unsigned char data) {
SPI->SPI_SPDR = data; //发送数据(相当于51的SBUF = DATA)
while(!(SPI->SPI_SPSR & (1 << SPIF))); // 等待SPIF置位,即等待数据发送完毕
return(SPI->SPI_SPDR);
}
void LedDisplay(unsigned char data) {
MSPI_SendData(LedTab[data & 0x0f]);
P0->IOSET = (1 << RCLK);
P0->IOCLR = (1 << RCLK);
}
void BeepInit(void) {
P0->IODIR |= (1 << BEEP);// 设置BEEP控制口为输出
P0->IOSET = (1 << BEEP);//关闭BEEP
}
void MainTask (void) __task {
SystemInit();
Key_Task = os_tsk_create (KeyTask, 100);//创建KeyTask任务及级别
Led_Task = os_tsk_create (LedTask, 100);//创建LedTask任务及级别
Lednum_Task = os_tsk_create (LednumTask, 100);//创建LednumTask任务及级别
Beep_Task = os_tsk_create (BeepTask, 100);//创建BeepTask任务及级别
os_tsk_delete_self ();//MainTask自毁
}
void KeyTask (void) __task {
KeyInit();
for (;;) {
if ((!(P0->IOPIN & (1 << KEY1))) && (P1->IOPIN & (1 << LED1))) {//有KEY1键压下且LED未亮
os_evt_set (0x0001, Led_Task);//
}
else if ((P0->IOPIN & (1 << KEY1)) && (!(P1->IOPIN & (1 << LED1)))) {//无KEY1键压下且LED在亮
os_evt_set (0x8001, Led_Task);//
}
if ((!(P0->IOPIN & (1 << KEY2))) && (P1->IOPIN & (1 << LED2))) {//有KEY2键压下且LED未亮
os_evt_set (0x0002, Led_Task);//
}
else if ((P0->IOPIN & (1 << KEY2)) && (!(P1->IOPIN & (1 << LED2)))){//无KEY2键压下且LED在亮
os_evt_set (0x8002, Led_Task);//
}
if ((!(P0->IOPIN & (1 << KEY3))) && (P1->IOPIN & (1 << LED3))) {//有KEY3键压下且LED未亮
os_evt_set (0x0003, Led_Task);//
}
else if ((P0->IOPIN & (1 << KEY3)) && (!(P1->IOPIN & (1 << LED3)))){//无KEY3键压下且LED在亮
os_evt_set (0x8003, Led_Task);//
}
if ((!(P0->IOPIN & (1 << KEY4))) && (P1->IOPIN & (1 << LED4))) {//有KEY4键压下且LED未亮
os_evt_set (0x0004, Led_Task);//
}
else if ((P0->IOPIN & (1 << KEY4)) && (!(P1->IOPIN & (1 << LED4)))){//无KEY4键压下且LED在亮
os_evt_set (0x8004, Led_Task);//
}
if ((!(P0->IOPIN & (1 << KEY5))) && (P1->IOPIN & (1 << LED5))) {//有KEY5键压下且LED未亮
os_evt_set (0x0005, Led_Task);//
}
else if ((P0->IOPIN & (1 << KEY5)) && (!(P1->IOPIN & (1 << LED5)))){//无KEY5键压下且LED在亮
os_evt_set (0x8005, Led_Task);//
}
if ((!(P0->IOPIN & (1 << KEY6))) && (P1->IOPIN & (1 << LED6))) {//有KEY6键压下且LED未亮
os_evt_set (0x0006, Led_Task);//
}
else if ((P0->IOPIN & (1 << KEY6)) && (!(P1->IOPIN & (1 << LED6)))){//无KEY6键压下且LED在亮
os_evt_set (0x8006, Led_Task);//
}
os_dly_wait (2);//延时20mS
}
}
void LedTask (void) __task {
OS_RESULT result;
unsigned int i;
LedInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001: P1->IOCLR = (1 << LED1);//点亮LED1
break;
case 0x0002: P1->IOCLR = (1 << LED2);//点亮LED2
break;
case 0x0003: P1->IOCLR = (1 << LED3);//点亮LED3
break;
case 0x0004: P1->IOCLR = (1 << LED4);//点亮LED4
break;
case 0x0005: P1->IOCLR = (1 << LED5);//点亮LED5
break;
case 0x0006: P1->IOCLR = (1 << LED6);//点亮LED6
break;
case 0x8001: P1->IOSET = (1 << LED1);//关掉LED1
break;
case 0x8002: P1->IOSET = (1 << LED2);//关掉LED2
break;
case 0x8003: P1->IOSET = (1 << LED3);//关掉LED3
break;
case 0x8004: P1->IOSET = (1 << LED4);//关掉LED4
break;
case 0x8005: P1->IOSET = (1 << LED5);//关掉LED5
break;
case 0x8006: P1->IOSET = (1 << LED6);//关掉LED6
break;
}
os_evt_set (i, Beep_Task);//开关BEEP
os_evt_set (i, Lednum_Task);//开关Lednum
}
os_dly_wait (2);//延时20mS
}
}
void LednumTask (void) __task {
OS_RESULT result;
unsigned int i;
LednumInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待LedTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001: LedDisplay(1);//显示数码'1'
break;
case 0x0002: LedDisplay(2);//显示数码'2'
break;
case 0x0003: LedDisplay(3);//显示数码'3'
break;
case 0x0004: LedDisplay(4);//显示数码'4'
break;
case 0x0005: LedDisplay(5);//显示数码'5'
break;
case 0x0006: LedDisplay(6);//显示数码'6'
break;
}
}
os_dly_wait (2);//延时20mS
}
}
void BeepTask (void) __task {
OS_RESULT result;
unsigned int i;
BeepInit();
for (;;) {
result = os_evt_wait_or(0xffff, 0xffff);//等待BeepTask任务事件发生
if(result == OS_R_EVT) {
i = os_evt_get();
switch(i) {
case 0x0001:
case 0x0002:
case 0x0003:
case 0x0004:
case 0x0005:
case 0x0006:
P0->IOCLR = (1 << BEEP);//打开BEEP
break;
case 0x8001:
case 0x8002:
case 0x8003:
case 0x8004:
case 0x8005:
case 0x8006:
P0->IOSET = (1 << BEEP);//关闭BEEP
break;
}
}
os_dly_wait (10);//延时100mS
}
}
int main (void) {
os_sys_init (MainTask);//启动ARTX,此函数并不返回main()
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -