⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 artxdemo.c

📁 Keil UV3中自带操作系统ARTX的应用例程
💻 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 + -