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);
}
}
![](http://www.cnblogs.com/images/cnblogs_com/nanshouyong326/90398/o_20080126(020).jpg)