huozee
驱动巨牛
驱动巨牛
  • 注册日期2004-11-09
  • 最后登录2011-08-11
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望166点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2005-03-04 09:09
偶没学过链表,只是看过一点,至于用法,嘿嘿!。。。


你什么平台?
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2005-03-04 13:23
mcs51,你给个例程也行,向你学习啊!
l=z=l 我听说,灌水是使分数快速增长的有效方法
huozee
驱动巨牛
驱动巨牛
  • 注册日期2004-11-09
  • 最后登录2011-08-11
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望166点
  • 贡献值0点
  • 好评度58点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2005-03-04 16:49
mcs51,你给个例程也行,向你学习啊!


51那你的问题就更大了。。。

这么复杂的处理最好不要在中断里做。。。

中断里最多扫描一下键值。。。

剩下的工作都要在主程序里处理。。。
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2005-03-04 18:33
中断没用,平时键盘很少用的,用了中断主程序就不用查询了。处理键盘时,系统就只处理键盘。
l=z=l 我听说,灌水是使分数快速增长的有效方法
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2005-03-04 21:53
unsigned char tempin,tempout,temprun;
              
 
 
unsigned char Key_Value();
unsigned char Change_Value(unsigned char);
void Delay_1(unsigned int m);

void Run_Satus();

char * MainMenuTitle = \"主菜单\";
 
const char * MainMenuItems[] = {
    \"1.室内温度调整\",
    \"2.室外温度调整\",
    \"3.运行时间调整\",
    \"4.ESC    退出\",
};
 
TMenu MainMenu;
 
void OnSelectMainMenu(int index)
{
            
    if (index < 0 || index >= sizeof(MainMenuItems) / sizeof(char *)) return;
 
    ClearScreen();
    switch (index) {
    case 0:
        TextOut(0, 1, \"室内调整开始 \");
        tempin=Change_Value(tempin);
        TextOut(0, 1, \"室内调整完毕\");
        Delay_1(300000);
        break;
    case 1:
       TextOut(0, 1, \"室外调整开始 \");
       tempout=Change_Value(tempout);
       TextOut(0, 1, \"室外调整完毕\");
        Delay_1(300000);
        break;
    case 2:
       TextOut(0, 1, \"运行时间调整开始\");
       tempout=Change_Value(temprun);
        TextOut(0, 1, \"运行时间完毕\");
         Delay_1(300000);
        break;
    case 3:
       break;
    }
    ClearScreen();
    
}
 
UINT OnMainMenuOk(void * arg)
{
    TMenu * pMenu = (TMenu *)arg;
    if (pMenu) OnSelectMainMenu(pMenu->Current);
    return 0;
}
 
UINT OnMainMenuCancel(void * arg)
{
    TMenu * pMenu = (TMenu *)arg;
    if (pMenu) {
        CloseMenu(pMenu);
    }
    return 0;
}
 
UINT OnMainMenuOtherKey(void * arg)
{
    TMenu * pMenu = (TMenu *)arg;
    char key;
 
    if (pMenu) {
        key = pMenu->EventArg;
        OnSelectMainMenu(key - \'1\');
        DrawMenu(pMenu);
    }
 
    return 0;
}
 
void InitMenu()
{
    InitializeMenu(&MainMenu, MainMenuTitle, MainMenuItems, sizeof
(MainMenuItems) / sizeof(char *));
    MainMenu.OnOk = OnMainMenuOk;
    MainMenu.OnOtherKey = OnMainMenuOtherKey;
    MainMenu.OnCancel = OnMainMenuCancel;
}
 
unsigned char Key_Value()
{
  unsigned char KeyTemp;
  KeyTemp=GetKey();
  switch(KeyTemp)
  {
      case(VK_ESCAPE):
          return(0);
          break;
      case(VK_ENTER):
          return(1);
          break;
      case(VK_UP):
          return(2);
          break;
      case(VK_DOWN):
          return(3);
          break;
          }
}
 
unsigned char Change_Value(unsigned char temp2)
{
   unsigned char temp3;
   temp3=temp2;
while((Key_Value()!=0)&&(Key_Value()!=1))
        {
        if(Key_Value()==2)temp3++;
        else if(Key_Value()==3)temp3--;
        ClearLine(1);
        TextOut(0, 1, \"调整状态%d\", temp3);
        }
        if(Key_Value()==1)return(temp3);
        else if(Key_Value()==0) return(temp2);
}
 
 
 void Delay_1(unsigned int m)
 {
   while(m--);
 }

void Run_Satus()
{
 ClearScreen();
 TextOut(0, 0, \"室内温度  %d\",tempin);
 TextOut(0, 1, \"室外温度  %d\",tempout);
 TextOut(0, 2, \"运行时间  %d\",temprun);
 TextOut(0, 3, \"ENTER 进入调整\");
}
void tmain()
{
     tempin=30;
     tempout=30;
     temprun=30;
    unsigned char key;
    InitMenu();
    while(1)
    {
    Run_Satus();
    key=GetKey();
    if(key==VK_ENTER)ShowMenu(&MainMenu);
}
}
l=z=l 我听说,灌水是使分数快速增长的有效方法
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2005-03-04 22:02
#define ubyte unsigned char
#define uint unsigned int
#define ulong unsigned long

ubyte kbCode;                   // 按键编码纪录
ubyte kbStatus;                 // 键盘当前状态,可以理解为菜单层次

// 按键的四种不同工作状态对应的函数指针对照表,每三字节对应一个按键
// 每一项包含三个字节,分别代表按键码,键盘状态,对应处理程序编号
// 本表对应于日常操作,不是修改状态
ubyte code TAB0[46]={
    0x11,0x00,0x01,             // 按键\'1\'      func1
    0x12,0x00,0x01,             // 按键\'2\'      func1
    0x14,0x00,0x01,             // 按键\'3\'      func1
    0x1a,0x00,0x01,             // 按键\'4\'      func1
    0x2a,0x00,0x01,             // 按键\'5\'      func1
    0x4a,0x00,0x01,             // 按键\'6\'      func1
    0x01,0x00,0x01,             // 按键\'7\'      func1
    0x02,0x00,0x01,             // 按键\'8\'      func1
    0x04,0x00,0x01,             // 按键\'9\'      func1
    0x10,0x00,0x01,             // 按键\'0\'      func1
    0x20,0x00,0x01,             // 按键\'.\'      func1
    0x08,0x00,0x02,             // 按键\'Clear\'  func2
    0x18,0x00,0x03,             // 按键\'U/D\'    func3
    0x8a,0x01,0x04,             // 按键\'shift\'  func4
    0x40,0x02,0x05,             // 按键\'last\'   func5
    0x00};                      // 本表结束标志

ubyte code TAB1[40]={
    0x12,0x03,0x06,             // 按键\'2\'      func6
    0x14,0x03,0x07,             // 按键\'3\'      func7
    0x2a,0x03,0x08,             // 按键\'5\'      func8
    0x4a,0x03,0x09,             // 按键\'6\'      func9
    0x01,0x03,0x12,             // 按键\'7\'      func18
    0x8a,0x03,0x14,             // 按键\'shift\'  func20
    0x11,0x01,0x0a,             // 按键\'1\'      func10
    0x1a,0x01,0x0b,             // 按键\'4\'      func11
    0x04,0x01,0x0c,             // 按键\'9\'      func12
    0x10,0x01,0x0d,             // 按键\'0\'      func13
    0x80,0x01,0x0e,             // 按键\'Enter\'  func14
    0x08,0x00,0x02,             // 按键\'Clear\'  func2
    0x20,0x03,0x13,             // 按键\'.\'      func19
    0x00};                      // 本表结束标志

ubyte code TAB2[7]={
    0x40,0x02,0x0f,             // 按键\'last\'   func15
    0x08,0x00,0x02,             // 按键\'Clear\'  func2
    0x00};                      // 本表结束标志

ubyte code TAB3[40]={
    0x11,0x03,0x10,             // 按键\'1\'      func16
    0x12,0x03,0x10,             // 按键\'2\'      func16
    0x14,0x03,0x10,             // 按键\'3\'      func16
    0x1a,0x03,0x10,             // 按键\'4\'      func16
    0x2a,0x03,0x10,             // 按键\'5\'      func16
    0x4a,0x03,0x10,             // 按键\'6\'      func16
    0x01,0x03,0x10,             // 按键\'7\'      func16
    0x02,0x03,0x10,             // 按键\'8\'      func16
    0x04,0x03,0x10,             // 按键\'9\'      func16
    0x10,0x03,0x10,             // 按键\'0\'      func16
    0x20,0x03,0x10,             // 按键\'.\'      func16
    0x08,0x00,0x02,             // 按键\'clear\'  func2
    0x80,0x01,0x11,             // 按键\'Enter\'  func17
    0x00};                      // 本表结束标志

ubyte code *TAB[4]={TAB0,TAB1,TAB2,TAB3};       // 总指针表

// 指针函数列表
code void(code *KeyProcTab[])()={
      NoKey,            /*0#  (00H)#*/
      func1,            /*1#  (01H)#*/
      func2,            /*2#  (02H)#*/
      func3,            /*3#  (03H)#*/
      func4,            /*4#  (04H)#*/
      func5,            /*5#  (05H)#*/
      func6,            /*6#  (06H)#*/
      func7,            /*7#  (07H)#*/
      func8,            /*8#  (08H)#*/
      func9,            /*9#  (09H)#*/
      func10,           /*10# (0AH)#*/
      func11,           /*11# (0BH)#*/
      func12,           /*12# (0CH)#*/
      func13,           /*13# (0DH)#*/
      func14,           /*14# (0EH)#*/
      func15,           /*15# (0FH)#*/
      func16,           /*16# (10H)#*/
      func17,           /*17# (11H)#*/
      func18,           /*18# (12H)#*/
      func19,           /*19# (13H)#*/
      func20            /*20# (14H)#*/
};

void NoKey()
{
    return;
}

void func0()
{
    ;
}
void func1()
{
    ;
}
....................
void func20()
{
    ;
}


//////////////////////////////////////////////////////////////////////
// 键盘监控,根据当前状态特征指向不同的指针表,并调用相应的函数     //
//////////////////////////////////////////////////////////////////////
void mon(ubyte key)
{
   ubyte code *data pTab;
   kbCode=key;
   pTab=*(TAB+kbStatus);                // 根据当前状态特征指向分指针表
   while(*pTab != key && *pTab != 0)    // 按照按键代码查表
   {
        pTab += 3;                          // 查表
   }
   if(*pTab!=0){
      pTab++;
      kbStatus=*pTab;                       // 取状态特征字节
      pTab++;                               // 指向执行函数
      (*KeyProcTab[*pTab])();               // 指针函数调用
   }
}




注释不好看不懂,慢慢来。转自小奇工作室。
l=z=l 我听说,灌水是使分数快速增长的有效方法
lzl
lzl
驱动大牛
驱动大牛
  • 注册日期2001-09-11
  • 最后登录2010-06-22
  • 粉丝1
  • 关注0
  • 积分127分
  • 威望48点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2005-03-04 23:53
谁有关于这种方法编成的原理,给点资料。
l=z=l 我听说,灌水是使分数快速增长的有效方法
ancn-wang
驱动中牛
驱动中牛
  • 注册日期2003-03-07
  • 最后登录2005-12-28
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
27楼#
发布于:2005-03-21 20:43
[quote]mcs51,你给个例程也行,向你学习啊!


51那你的问题就更大了。。。

这么复杂的处理最好不要在中断里做。。。

中断里最多扫描一下键值。。。

剩下的工作都要在主程序里处理。。。 [/quote]

这位大侠对这个主题评论得很对!
成功源自信心
上一页 下一页
游客

返回顶部