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

📄 main.c

📁 ADC Demo Source for LPC214X. 这是214X的ADC的应用例程
💻 C
📖 第 1 页 / 共 2 页
字号:
//    _delay_loop_(1);
  }	
  return 0;
}



void SystemInit(void) {
  PINSEL0 = 0x00000000;		// 设置管脚连接GPIO
  PINSEL1 = 0x00000000;		// 设置管脚连接GPIO
  IODIR0  = 0x00000000;		// 设置P0口为输入
  IODIR1  = 0x00000000;		// 设置P1口为输入
}

void KeyInit(void) {
  IODIR0 &= ~((1 << KEY1) |	// 设置KEY1为输入	
              (1 << KEY3) |	// 设置KEY3为输入  
              (1 << KEY5) |	// 设置KEY5为输入  
              (1 << KEY6));	// 设置KEY6为输入  
}

void LedInit(void) {
  IODIR1 |= (1 << LED1) |	// 设置LED1为输出	
            (1 << LED2)	|	// 设置LED2为输出  
            (1 << LED3)	|	// 设置LED3为输出  
            (1 << LED4)	|	// 设置LED4为输出  
            (1 << LED5)	|	// 设置LED5为输出  
            (1 << LED6)	|	// 设置LED6为输出  
            (1 << LED7)	|	// 设置LED7为输出  
            (1 << LED8);  	// 设置LED8为输出  
  IOSET1  = (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) {  
  PINSEL0 |= ((P0_4_SCK0 << P0_4_PINSEL) | (P0_5_MISO0 << P0_5_PINSEL) | (P0_6_MOSI0 << P0_6_PINSEL));
  IODIR0  |= (1 << RCLK);		// 设置RCLK控制口为输出	
  IOCLR0   = (1 << RCLK);
  S0SPCCR = 0x52;		            // 设置SPI时钟分频
  S0SPCR  = (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) {
  S0SPDR = data;                        //发送数据(相当于51的SBUF = DATA)
  while(!(S0SPSR & (1 << SPIF)));		// 等待SPIF置位,即等待数据发送完毕
  return(S0SPDR);
}

void LedDisplay(unsigned char data) {
  MSPI_SendData(LedTab[data & 0x0f]);
  IOSET0 = (1 << RCLK);
  IOCLR0 = (1 << RCLK);
}


void BeepInit(void) {
//  IODIR0 |= (1 << BEEP);// 设置BEEP控制口为输出	
  IO0SET  = (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任务及级别
  Lcd_Task = os_tsk_create (LcdTask, 100);//创建LcdTask任务及级别
  Adc_Task = os_tsk_create (AdcTask, 100);//创建AdcTask任务及级别
  os_tsk_delete_self ();//MainTask自毁
}

void LcdTask (void) __task {
  LcdInit();
  for (;;) {
    LcdDisplayBuffers();// 将缓冲区的内容操作硬件
  }
}
void KeyTask (void) __task {
  KeyInit();
  for (;;) {
    if ((!(IOPIN0 & (1 << KEY1))) && (IOPIN1 & (1 << LED1))) {//有KEY1键压下且LED未亮
      os_evt_set (0x0001, Led_Task);//
      os_evt_set (0x0001, Adc_Task);//
//  SetLcdDisplayPos(0, 0);//汉字定位到上行左端
//  LcdDisplayString("汉字显示演示1212");
	}
	else if ((IOPIN0 & (1 << KEY1)) && (!(IOPIN1 & (1 << LED1)))) {//无KEY1键压下且LED在亮
      os_evt_set (0x8001, Led_Task);//
//  SetLcdDisplayPos(0, 0);//汉字定位到上行左端
//  LcdDisplayString("汉字显示演示    ");
	}
    if ((!(IOPIN0 & (1 << KEY3))) && (IOPIN1 & (1 << LED3))) {//有KEY3键压下且LED未亮
      os_evt_set (0x0003, Led_Task);//
      os_evt_set (0x0003, Adc_Task);//
//  SetLcdDisplayPos(1, 0);//汉字定位到上行左端
//  LcdDisplayString("汉字显示演示3434");
	}
	else if ((IOPIN0 & (1 << KEY3)) && (!(IOPIN1 & (1 << LED3)))){//无KEY3键压下且LED在亮
      os_evt_set (0x8003, Led_Task);//
//  SetLcdDisplayPos(1, 0);//汉字定位到上行左端
//  LcdDisplayString("汉字显示演示    ");
	}
    if ((!(IOPIN0 & (1 << KEY5))) && (IOPIN1 & (1 << LED5))) {//有KEY5键压下且LED未亮
      os_evt_set (0x0005, Led_Task);//
//  SetLcdDisplayPos(2, 0);//汉字定位到上行左端
//  LcdDisplayString("汉字显示演示5656");
	}
	else if ((IOPIN0 & (1 << KEY5)) && (!(IOPIN1 & (1 << LED5)))){//无KEY5键压下且LED在亮
      os_evt_set (0x8005, Led_Task);//
//  SetLcdDisplayPos(2, 0);//汉字定位到上行左端
//  LcdDisplayString("汉字显示演示    ");
	}
    if ((!(IOPIN0 & (1 << KEY6))) && (IOPIN1 & (1 << LED6))) {//有KEY6键压下且LED未亮
      os_evt_set (0x0006, Led_Task);//
//  SetLcdDisplayPos(3, 0);//汉字定位到上行左端
//  LcdDisplayString("汉字显示演示7878");
	}
	else if ((IOPIN0 & (1 << KEY6)) && (!(IOPIN1 & (1 << LED6)))){//无KEY6键压下且LED在亮
      os_evt_set (0x8006, Led_Task);//
//  SetLcdDisplayPos(3, 0);//汉字定位到上行左端
//  LcdDisplayString("汉字显示演示    ");
	}
    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:  IOCLR1 = (1 << LED1);//点亮LED1
		              break;
	    case 0x0002:  IOCLR1 = (1 << LED2);//点亮LED2
		              break;
	    case 0x0003:  IOCLR1 = (1 << LED3);//点亮LED3
		              break;
	    case 0x0004:  IOCLR1 = (1 << LED4);//点亮LED4
		              break;
	    case 0x0005:  IOCLR1 = (1 << LED5);//点亮LED5
		              break;
	    case 0x0006:  IOCLR1 = (1 << LED6);//点亮LED6
		              break;

	    case 0x8001:  IOSET1 = (1 << LED1);//关掉LED1
		              break;
	    case 0x8002:  IOSET1 = (1 << LED2);//关掉LED2
		              break;
	    case 0x8003:  IOSET1 = (1 << LED3);//关掉LED3
		              break;
	    case 0x8004:  IOSET1 = (1 << LED4);//关掉LED4
		              break;
	    case 0x8005:  IOSET1 = (1 << LED5);//关掉LED5
		              break;
	    case 0x8006:  IOSET1 = (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:  
		              IOCLR0 = (1 << BEEP);//打开BEEP
                      os_dly_wait (50);//延时500mS
		              IOSET0 = (1 << BEEP);//关闭BEEP
		              break;
	    case 0x8001:  
	    case 0x8002:  
	    case 0x8003:  
	    case 0x8004:  
	    case 0x8005:  
	    case 0x8006:  
		              IOSET0 = (1 << BEEP);//关闭BEEP
		              break;
      }
	}
    os_dly_wait (10);//延时100mS

  }
}

void AdcTask (void) __task {
OS_RESULT result;
unsigned int i;	
uint32 AdcVal;
unsigned char str[17];
  AdcInit();
  for (;;) {
    result = os_evt_wait_or(0xffff, 0xffff);//等待BeepTask任务事件发生
	if(result == OS_R_EVT) {
	  i = os_evt_get();
	  switch(i) {
	    case 0x0001://  
		     AdcVal = GetAdcVal(1);//
			 sprintf(str, "Adc1=%04X %1d.%03dV", AdcVal, AdcVal / 1000, AdcVal % 1000);
  SetLcdDisplayPos(0, 0);//汉字定位到上行左端
  LcdDisplayString(str);
			 break;
	    case 0x0002:  
			 break;
	    case 0x0003://显示 "Adc3=05DD 1.501V" 或 "Adc3=05DB 1.499V"
		     AdcVal = GetAdcVal(3);//
			 sprintf(str, "Adc3=%04X %1d.%03dV", AdcVal, AdcVal / 1000, AdcVal % 1000);
  SetLcdDisplayPos(1, 0);//汉字定位到上行左端
  LcdDisplayString(str);
			 break;
	    case 0x0004:  
	    case 0x0005://  
	    case 0x0006://  
		              break;
	    case 0x8001:  
	    case 0x8002:  
	    case 0x8003:  
	    case 0x8004:  
	    case 0x8005:  
	    case 0x8006:  
		              break;
      }
	}
    os_dly_wait (1);//延时10mS
  }
}

void main (void) {
  if (SystemRamTest != 0x55aa55aa) {
    SystemInit();
    SystemRamTest = 0x55aa55aa;
  }
  else {
    SystemRamTest = 0x55aa55aa;
  }
  os_sys_init (MainTask);//启动ARTX,此函数并不返回main()
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -