打印

求助键盘问题

[复制链接]
1079|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaolong008|  楼主 | 2010-9-16 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
借鉴了别人的键盘部分,发现其他都还可以,为什么我按清楚就不正确了
按了个 8 8 8,清掉一个8 显示8 8,再按其他的建 9,结果显示 8 9,按道理说该是显示 8 8 9才对,看了下这时显示的i的值是 1,不是2 ,肯定是删除时i这个变量变了,按照这个输的数字 三个数按完后i的值是3,按了删除 该是2 这样才会显示 8 8 9没看明白怎么就变了呢
void keyscan(void)
{

unsigned char temp;
unsigned char  result;   
   
keys=0;  
PORTC=0X7F;                 ////C7输出低电平,其他三位输出高电平 C7是列线
asm("nop");                 //插入一定延时,确保电平稳定
result=PORTC;               //读回C口高4位结果
result=result&0x0f;         //清除高4位
if(result!=0x0f)            //判断低4位是否为全1(全1代表没按键按下)
   {
     result=result|0x70;     //否,加上高4位0x70,做为按键扫描的结果
      switch(result)
      {
      
       case 0x77: keys=64;while((PORTC&0x0f)!=0x0f);break;//ent
      }
   }
else                        //是,改变高4位输出,重新判断是否有按键按下
   {
   PORTC=0Xbf;               //C6输出低电平,其他三位输出高电平 C6是列
   asm("nop");               //插入一定延时,确保电平稳定
   result=PORTC;             //读回C口结果
   result=result&0x0f;       //清除高4位
   if(result!=0x0f)          //判断低4位是否为全1(全1代表没按键按下)
     {
     result=result|0xb0;     //否,加上高4位0xb,做为按键扫描的结果
     switch(result)
      {
       case 0xb7: keys=16;LCD();while((PORTC&0x0f)!=0x0f);break;//set
       case 0xbe: keys=6;l_tmpdate1=6; displaydata[7-i]=6;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//6
       case 0xbd: keys=3;displaydata[7-i]=3;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//3
       case 0xbb: keys=9;displaydata[7-i]=9;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//9
      }
     
     }
   else                      //是,改变高4位输出,重新扫描
       {
       PORTC=0Xdf;           //C5输出低电平,其他三位输出高电平
       asm("nop");           //插入一定延时,确保电平稳定
       result=PORTC;         //读回C口高4位结果
       result=result&0x0f;   //清除高4位
       if(result!=0x0f)      //判断低4位是否为全1(全1代表没按键按下)
        {
        result=result|0xd0;  //否,加上高4位0x0d,做为按键扫描的结果
        switch(result)
          {
           case 0xde: keys=1;displaydata[7-i]=1;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//1
           case 0xdd: keys=2;displaydata[7-i]=2;i++;LCD();while((PORTC&0x0f)!=0x0f);break;
         //2

          case 0xdb: keys=4;displaydata[7-i]=4;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//4
          case 0xd7: keys=5;displaydata[7-i]=5;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//5
         }
        }
       else                  //是,改变高4位的输出,重新扫描
          {
          PORTC=0Xef;        //C4输出低电平,其他三位输出高电平
          asm("nop");        //插入一定延时,确保电平稳定
          result=PORTC;      //读回C口高4位结果
          result=result&0x0f;//清除高4位
          if(result!=0x0f)   //判断低四位是否为全1(全1代表没有按键按下)
            {
             result=result|0xe0;//否,加上高4位0x0e,做为按键扫描的结果
            switch(result)
                 {
                   case 0xe7: keys=32;i--;while((PORTC&0x0f)!=0x0f);break;//del 清除键
                   case 0xeb:keys=0;displaydata[7-i]=0;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//0
                   case 0xee: keys=7;displaydata[7-i]=7;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//7
                   case 0xed: keys=8;displaydata[7-i]=8;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//8
                 }
            }
          else               //是,全部按键扫描结束,
            {
             result=0xff;    //扫描结果为0xff,做为没有按键按下的标志
            }   
          }      
      }
   }
   result;
}
顺便弱弱的问下 连续按怎么实现的啊 这个没有这个功能撒
沙发
yewuyi| | 2010-9-16 17:34 | 只看该作者
1、求助帖首先不要搞出一大堆得错别字。
2、既然你有代码了,应该自己去分析找出问题。

使用特权

评论回复
板凳
lbbxhu04| | 2010-9-21 23:39 | 只看该作者
不是很懂,学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1

帖子

1

粉丝