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

📄 artx_key_demo.c

📁 LPC2142用演示ARTX的LED显示例程及KEY按键处理的演示程序.
💻 C
字号:
/*----------------------------------------------------------------------------
 *      A R T X   K e r n e l   E x a m p l e
 *----------------------------------------------------------------------------
 *      Name:    BLINKY.C
 *      Purpose: Advanced RTX example program
 *      Rev.:    V2.00 / 19-oct-2005
 *----------------------------------------------------------------------------
 *      This code is part of the ARTX-ARM kernel package of Keil Software.
 *      Copyright (c) 2004-2005 Keil Software. All rights reserved. 
 *---------------------------------------------------------------------------*/

#include <ARTX.h>
#include <LPC21xx.H>                    /* LPC21xx definitions               */


OS_TID t_GetKey;                        /* assigned task id of task: phase_a */
OS_TID t_clock;                         /* assigned task id of task: clock   */
OS_TID t_phaseA;
#define LED_A   0x100000
#define LED_B   0x200000
#define LED_C   0x040000
#define LED_D   0x080000
#define LED_CLK 0x800000


#define KEY1 13
#define KEY2 15
#define KEY3 7
#define KEY4 6


 void init_port(void)
 {

 //port initialized
 IODIR1=0x00FF0000;
 IODIR0=0x40600010;
 IOSET1 = 0x00FF0000; //ALL LED OFF

 }

unsigned char Scan_Key(void)
{
	unsigned int k;
	unsigned char key,i;

	i=0;
	key=0;

	k=IOPIN0;
	if((k&1<<KEY4)==0)key+=1;
	key=key<<1;
	if((k&1<<KEY3)==0)key+=1;
	key=key<<1;
	if((k&1<<KEY2)==0)key+=1;
	key=key<<1;
	if((k&1<<KEY1)==0)key+=1;
	switch(key)
	{
	case 0x00:
		i=0; 
		break;
	case 0x08:
		i=4; 
		break;
	
	case 0x04:
		i=3; 
		break;
	
	case 0x02:
		i=2; 
		break;
	
	case 0x01:
		i=1; 
		break;

	case 0x0F:	  //复合键
		i=0XF; 
		break;
	
	case 0x0E:
		i=0X0E; 
		break;
	default:
		i=0;
		break;
	}
	return i;
}
/*----------------------------------------------------------------------------
 *        Function 'signal_func' called from multiple tasks
 *---------------------------------------------------------------------------*/
void signal_func (OS_TID task)  {
  os_evt_set (0x0100, t_clock);          /* send event signal to clock task  */
  os_dly_wait (9);                      /* delay 50 clock ticks             */
//  os_evt_set (0x0100, t_clock);          /* send event signal to clock task  */
//  os_dly_wait (9);                      /* delay 50 clock ticks             */
  os_evt_set (0x0001, task);             /* send event to task 'task'        */
 // os_dly_wait (10);                      /* delay 50 clock ticks             */
}
/*----------------------------------------------------------------------------
 *        Task 1 'GetKey ': 
 *---------------------------------------------------------------------------*/
void phaseA (void) __task {
  for (;;) {
    os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
    IOCLR1 = LED_B;
    signal_func (t_GetKey);              /* call common signal function      */
    IOSET1 = LED_B;
  }
}
void GetKey (void) __task {
unsigned char i;
  for (;;) {
    os_evt_wait_and (0x0001, 0xffff);    /* wait for an event flag 0x0001    */
   	i=Scan_Key();
	if(i!=0)IOCLR1 = (0x00008000<<i);
 	signal_func(t_phaseA);
 	//os_dly_wait (100);
	if(i!=0)IOSET1 = (0x00008000<<i);
	//IOSET1 = 0x006f0000; //ALL LED OFF
  }
}

/*----------------------------------------------------------------------------
 *        Task 5 'clock': Signal Clock
 *---------------------------------------------------------------------------*/
void clock (void) __task {
  for (;;) {
   os_evt_wait_and (0x0100, 0xffff);    /* wait for an event flag 0x0100    */
    IOSET1 = LED_CLK;
    os_dly_wait (8);                     /* delay 8 clock ticks              */
    IOCLR1 = LED_CLK;

  }
}

/*----------------------------------------------------------------------------
 *        Task 6 'init': Initialize
 *---------------------------------------------------------------------------*/
void init (void) __task {

  IODIR1 = 0xFF0000;                     /* P1.16..23 defined as Outputs     */
  init_port();
  t_phaseA = os_tsk_create (phaseA, 0);  /* start task phaseB */
  t_GetKey = os_tsk_create (GetKey, 0);  /* start task phaseA                */

//  t_phaseC = os_tsk_create (phaseC, 0);  /* start task phaseC                */
//  t_phaseD = os_tsk_create (phaseD, 0);  /* start task phaseD                */
  t_clock  = os_tsk_create (clock, 0);   /* start task clock                 */
  os_evt_set (0x0001, t_phaseA);         /* send signal event to task phaseA */
  os_tsk_delete_self ();
}

/*----------------------------------------------------------------------------
 *        Main: Initialize and start ARTX Kernel
 *---------------------------------------------------------------------------*/
void main (void) {
  os_sys_init (init);                    /* Initialize ARTX and start init   */
}

/*----------------------------------------------------------------------------
 * end of file
 *---------------------------------------------------------------------------*/

⌨️ 快捷键说明

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