打印

按键求教

[复制链接]
1405|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ql1007|  楼主 | 2010-8-20 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我按下键 结果所有的数都显示了。。。原意是按一个显示一个数 在按下 下个数显示。。。主程序循环查询。。为什么按一下结果都显示了呢 明明应该只有一个数显示啊 。。
void main(void)
{
port_init();
delay(65536);
flag2=EEpromRead(255);
if(flag2!=0x01)//如果上次是1 说明这次上电是睡眠状态
{EEpromWrite(255,0x01);}
else
{
EEpromWrite(255,0xff);
asm("nop");
asm("sleep");
asm("nop");
while(1);
}
LCDinit();
displaydata[0]=8;
displaydata[1]=8;
displaydata[2]=8;
displaydata[3]=8;
displaydata[4]=8;
displaydata[5]=8;
displaydata[6]=8;
displaydata[7]=8;
setLCDsegment();
//delay(65536);
//tmint();
j=0;
while(1)
{
keyboradscan();//按键查询
switch(result)
{
    case 0xeb: //假设0   第一个按键是第8个数码管
            
                         displaydata[7-j]=0;
                         setLCDsegment();
                          //j++;
                          
             break;   
             //这后面是送的显示
      case 0xde: //1
            
                         displaydata[7-j]=1;
                         setLCDsegment();
                        
                          
             break;   
       case 0xdd: //2
         
                         displaydata[7-j]=2;
                         setLCDsegment();
                        
                          
                    
             break;
       case 0xbd: //3
         
                         displaydata[7-j]=3;
                         setLCDsegment();
                        
                          
                    
             break;  
        case 0xdb: //4
         
                         displaydata[7-j]=4;
                         setLCDsegment();
                          
                          
                    
             break;  
        case 0xd7: //5
         
                         displaydata[7-j]=5;
                         setLCDsegment();
                          
                          
                    
             break;   
        case 0xbe: //6
         
                         displaydata[7-j]=6;
                         setLCDsegment();
                          
                          
                    
             break;      
      
       case 0xee: //7
         
                         displaydata[7-j]=7;
                         setLCDsegment();
                          
                          
                    
             break;
      case 0xed: //8
         
                         displaydata[7-j]=8;
                         setLCDsegment();
                          
                          
                    
             break;
}
j++;
if(j==8)
{
j=0;
}
}
}

void keyboradscan(void)
{
unsigned char key_a=3000,i=1;
    //while(key_a--);      //先消抖;         
  
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,做为按键扫描的结果
   }
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,做为按键扫描的结果
     }
   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,做为按键扫描的结果
        }
       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,做为按键扫描的结果
            }
          else               //是,全部按键扫描结束,没有按键按下,置无按键按下标志位
            {
             result=0xff;    //扫描结果为0xff,做为没有按键按下的标志
            }   
          }      
      }
   }
  //return;
}
沙发
alamo2009| | 2010-8-23 18:15 | 只看该作者
你没有判断按键释放,你按一下,单片机都不知循环查询了多少次呢!

使用特权

评论回复
板凳
alamo2009| | 2010-8-23 18:19 | 只看该作者
主循环下加一句
keyboradscan();//按键查询
while(result!=0xff);//按键释放

使用特权

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

本版积分规则

35

主题

122

帖子

0

粉丝