wh8010jky 发表于 2012-7-24 20:57:07

再发键盘程序,希望得到高手评价!

   这是一个4*4 键盘程序,已调试通过。它没有完全按照状态机格式写,
请各位高手评价一下好与否。

   //---KeyBoard.c---//

#include "All.h"

uchar K_No=0xff;               //键号
uchar KeyNo=0xff;            //输出键号
uchar Temp=0xff;
uchar KeyValue=0xff;

bit Flag_KeyDown=0;
bit Flag_KeyUp=0;

    //=========监测按键========//

uchar KeyMonitor()            
{
    P1=0xf0;
    if(P1!=0xf0)
    {
      LowVoltageDeal();
    }
    else
    {
      HighVoltageDeal();
    }
    KeyNoOutput();

    return (KeyNo);       
}


    //=========低电平状态:确定键号=========//

void LowVoltageDeal()            
{
    if(Flag_KeyDown==0)            //首次检测到有键按下
    {
      Flag_KeyDown=1;            //标志:“按下”

      TR0=1;                        //开中断计时,去抖
      TimeCount=0;

      Temp=P1&0xf0;
      P1=0x0f;
      KeyValue=(P1&0x0f)|Temp;   //---键值---

      switch(KeyValue)                     //---求键号---
      {
            case 0xbe:K_No=0x00; break;
            case 0x77:K_No=0x01; break;
            case 0xb7:K_No=0x02; break;
            case 0xd7:K_No=0x03; break;
            case 0x7b:K_No=0x04; break;
            case 0xbb:K_No=0x05; break;
            case 0xdb:K_No=0x06; break;
            case 0x7d:K_No=0x07; break;
            case 0xbd:K_No=0x08; break;
            case 0xdd:K_No=0x09; break;
            case 0xe7:K_No=0x0a; break;
            case 0xeb:K_No=0x0b; break;
            case 0xed:K_No=0x0c; break;
            case 0xee:K_No=0x0d; break;
            default:K_No=0xff;
      }
    }            
}

      //=========高电平状态:去抖==========//

void HighVoltageDeal()
{
    if((TimeCount==20)&&(Flag_KeyUp==0))
    {
       /*按键“按下”状态去抖时间到,进入“抬起”状态监测*/

      TR0=1;                                  //重开中断,
       TimeCount=0;                         //重新计时,“抬起”状态去抖
      Flag_KeyUp=1;                     //标志 :“抬起”
    }
}

      //=========键号输出============//

voidKeyNoOutput()
{
      /*按键“抬起”状态去抖时间到,输出“键号”*/

    if((TimeCount==20)&&(Flag_KeyUp==1))      
    {
      TimeCount=0;
      Flag_KeyDown=0;
      Flag_KeyUp=0;
      KeyNo=K_No;                           
    }

      /*按键非"抬起"状态,输出非键号信息*/

    else                                       
    {
      KeyNo=0xff;                           
    }
}

sunliezhi 发表于 2012-7-24 22:08:41

首先声明,我不是高手,但我想发表一下我的看法:
1. 这种写法的结构不如状态机写法清晰;
2. 将定时器的开启放在按键程序中,该定时器成了按键程序专用资源,在定时器资源不多的情况下这是极大的浪费。定时器适宜多任务共享。

wh8010jky 发表于 2012-7-25 09:24:41

sunliezhi 发表于 2012-7-24 22:08 static/image/common/back.gif
首先声明,我不是高手,但我想发表一下我的看法:
1. 这种写法的结构不如状态机写法清晰;
2. 将定时器的开 ...

您的指点很好, 谢谢!!!

iicoyool 发表于 2012-7-25 14:55:26

sanliu85 发表于 2012-7-25 18:59:11

马克一下先

pubuntu 发表于 2012-7-27 21:30:30

我只能说这样写不好。。很浪费,而且效率不高。。http://blog.sina.com.cn/itangcle看下这个里面有一个键盘扫描的还不错

wh8010jky 发表于 2012-7-28 19:08:01

pubuntu 发表于 2012-7-27 21:30 static/image/common/back.gif
我只能说这样写不好。。很浪费,而且效率不高。。http://blog.sina.com.cn/itangcle看下这个里面有一个键盘 ...

谢谢评价!!!
页: [1]
查看完整版本: 再发键盘程序,希望得到高手评价!