hd6305 menu

//********************************************************************************
//菜单选择
//********************************************************************************
int SelectMenu (char * menuString, int menuCount, int linePtr)
{
 int keych;
 typ_msg_word msg;

 if (linePtr >= menuCount)
  linePtr = 0;
 if (linePtr < 4)
 {
  DispMenu(menuString, menuCount, linePtr);
  if (menuCount > 4)
  {
   ClearArrowArea();
   PutArrowDownChar(120, 48);
  }
 }
 else
 {
  DispMenu((char *)(menuString + (linePtr - 3) * 16), menuCount - linePtr + 3, 3);
  ClearArrowArea();
  PutArrowUpChar(120, 0);
  if (menuCount - linePtr > 1)
   PutArrowDownChar(120, 48);
 }

 while(1)
 {
  msg.s_word = sys_msg(SM_GOTO_SLEEP);

  if (msg.bits.key_available)
  {
   keych = KEY_read();
   keych = Key_Utility[keych];
   switch(keych)
   {
    case KEY_AUX4:
     linePtr --;
     if (linePtr < 0) linePtr = menuCount - 1;
     if (linePtr < 4)
     {
      DispMenu(menuString, menuCount, linePtr);
      if (menuCount > 4)
      {
       ClearArrowArea();
       PutArrowDownChar(120, 48);
      }
     }
     else
     {
      DispMenu((char *)(menuString + (linePtr - 3) * 16), menuCount - linePtr + 3,

3);
      ClearArrowArea();
      PutArrowUpChar(120, 0);
      if (menuCount - linePtr > 1)
       PutArrowDownChar(120, 48);
     }
     break;
    case KEY_AUX3:
     linePtr ++;
     if (linePtr > menuCount - 1) linePtr = 0;
     if (linePtr < 4)
     {
      DispMenu(menuString, menuCount, linePtr);
      if (menuCount > 4)
      {
       ClearArrowArea();
       PutArrowDownChar(120, 48);
      }
     }
     else
     {
      DispMenu((char *)(menuString + (linePtr - 3) * 16), menuCount - linePtr + 3,

3);
      ClearArrowArea();
      PutArrowUpChar(120, 0);
      if (menuCount - linePtr > 1)
       PutArrowDownChar(120, 48);
     }
     break;
    case KEY_ENTER:
     return linePtr;
    case KEY_POWER:
     return -2;
    case KEY_CLR:
     return -1;
    case KEY_F1:
     return -11;
    case KEY_F2:
     return -12;
    case KEY_F3:
     return -13;
    default:
     if (keych > 0 && keych <= menuCount)
      return keych - 1;
     break;
   }
  }
 }
}

static void DispMenu (char * menuString, int lineCount, int linePtr)
{
 int q, x;

 clear_console();

 for (q = 0; q < 4; q ++)
 {
  if (q == linePtr)
   x = DISP_POSITION | DISP_REVERSE;
  else
   x = DISP_POSITION;

  if (q < lineCount)
   DispStr_CE(0, q * 2, menuString + q * 16, x);
 }
}

static void PutArrowDownChar(int x, int y)
{
 int m, n;

 for(m = 0; m < 4; m ++)
 {
  for(n = m; n < 7 - m ; n ++)
   put_pixel(x + n + 1, y + m + 11, 1, DISP_PUT_MODE_PUT);
 }
}
static void PutArrowUpChar(int x, int y)
{
 int m, n;

 for(m = 0; m < 4; m ++)
 {
  for(n = 4 - m; n < 5 + m ; n ++)
   put_pixel(x + n, y + m + 1, 1, DISP_PUT_MODE_PUT);
 }
}


static void ClearArrowArea(void)
{
 int m, n;

 for(m = 1; m < 8; m ++)
 {
  for(n = 0; n < 64 ; n ++)
   put_pixel(120 + m, n, 0, DISP_PUT_MODE_PUT);
 }
}

posted @ 2009-03-11 13:23  南守拥  阅读(250)  评论(0编辑  收藏  举报