py-industry 发表于 2015-9-1 00:28:10

TM1629B 键盘点动和快速处理

承接上一帖键盘处理,刚刚测试完按键的点动和快速加减处理,发给大家!思路觉得OK的别忘了点赞,更多的我想听到前辈们的意见!暂时调到哪就写到哪,虽不完整,但足以可以表述我对此问题的处理思路!
顺便提一下,复合键的处理也是一样,往程式里塞就可以了!{:smile:}
中心点:1、尽量减少占用MCU的时间,让有限的时间来干正经的事情,后面的正事还多着需要时间去干!2、尽量要有条理性和共性。时间仓促!不要挑刺!只讲思路!

没看上一帖的请跳过此帖,先看上一帖的程式。

//TIMER0 initialize - prescale:1024
// WGM: Normal
// desired value: 10mSec
// actual value:9.984mSec (0.2%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0xB2; //set count
OCR0= 0x4E;//set compare
TCCR0 = 0x05; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF    //中断0,用于无需精密计时处理调用,很多地方的计时都需要它的帮忙,否则,就这几个时间中断应该远远不够用的//
void timer0_ovf_isr(void)
{
TCNT0 = 0xB2; //reload counter value
TCCR0 = 0x00;
if(key_count<500)
{
key_count++;
switch(key_count)
{
   case 3:
            key_count_1_flag=1;      //点动标志//
                        break;
   case 30:
            key_count_2_flag=1;       //长按标志 30MS/300MS/8M时钟 手感本人觉得OK//
                  break;                  //可按自己习惯调节数据 数据变化和手感OK为标准//
   default:
            if(key_count>100){key_count=900;}       //900的数字是我自己随便定义的,不用深究 只要大于if(key_count<500) 这个数就可以了//
                        break;                                        //if(key_count<500) 这数也不用深究,只要大于你要的时间就可以了 这里的程式是30这里只要大于30就OK了//        主要是表述思路//
}
}

TCCR0 = 0x05;
}


//------------------------------------------------------------------------------------------------------------//
if(key_get==1)
{
key_get=0;
switch(key_val)
   {
    case 2:
                   if(key_count==900){key_count=0;}      //启动T0计时开始//
                   if(key_count_1_flag|key_count_2_flag)   //1=点动加数据 2=长按快速加数据//
                  {
                     key_count_1_flag=0;
                       disdat_A++;
                       if(disdat_A>99){disdat_A=0;}
                     if(key_count_2_flag){key_count_2_flag=0;key_count=24;}
                       display_A();
             TM1629B_Write_A(Dis_Buf_A);
                        }
                   break;
    case 3:
             if(key_count==900){key_count=0;}
                   if(key_count_1_flag|key_count_2_flag)
                  {
                     key_count_1_flag=0;
                       disdat_A--;
                       if(disdat_A>99){disdat_A=99;}
                     if(key_count_2_flag){key_count_2_flag=0;key_count=24;}
                       display_A();
             TM1629B_Write_A(Dis_Buf_A);
                        }
                   break;
    case 4:
             
                   break;
        case 5:
             
                   break;
        case 6:
             
                   break;
        case 7:
             
                   break;
        case 8:
             
                   break;
        case 9:
             
                   break;
        case 10:
             
                   break;
        case 11:
             
                   break;
        case 12:
             
                   break;                                           
    case 13:
             
                   break;
    case 14:
             
                   break;
        case 15:
             
                   break;          
        case 16:
             
                   break;             
        case 17:
             
                   break;
    case 18:
             
                   break;
    case 19:
             
                   break;
        case 20:
             
                   break;
        case 21:
             
                   break;
        case 22:
             
                   break;
        case 23:
             
                   break;
        case 24:
             
                   break;
        case 25:
             
                   break;
        case 26:
             
                   break;
        case 27:
             
                   break;                                           
    case 28:
             
                   break;
    case 29:
             
                   break;
          
        default:
                   key_count=900;   
                   break;                             
                  
   }
}

以下程式 只看后面的关闭计时器 别的地方和上一帖无变化!无按键压下时需要关闭计时器的计数.

//键盘键值扫描//
void key_val_pro(void)
{
uint8 N,M;
SPI_Read_A(Key_A_buf);
for(N=0;N<4;N++)
{
switch(Key_A_buf)
{
   case 0x08:
            
                       switch(N)
                          {
                           case 0://sw2//
                                          key_val=2;    //键值//
                                          key_get=1;    //压键标志//
                                          break;
                           case 1://sw4//
                                key_val=4;   
                                          key_get=1;   
                                          break;
                           case 2://sw6//
                                key_val=6;   
                                          key_get=1;
                                          break;
                           case 3://sw8//
                                key_val=8;   
                                          key_get=1;
                                          break;
                           default:
                                //key_val=0;   
                                          //key_get=0;
                                          break;
                          }
             break;
   case 0x80:
             switch(N)
                          {
                           case 0:   //sw3//
                                key_val=3;   
                                          key_get=1;
                                          break;
                           case 1:   //sw5//
                                key_val=5;   
                                          key_get=1;
                                          break;
                           case 2:   //sw7//
                                key_val=7;   
                                          key_get=1;
                                          break;
                           case 3:   //sw9//
                                key_val=9;   
                                          key_get=1;
                                          break;
                           default:
                                //key_val=0;   
                                          //key_get=0;
                                          break;
                          }
             break;
   case 0x04:
             switch(N)
                          {
                           case 0:   //sw10//
                                key_val=10;   
                                          key_get=1;
                                          break;
                           case 1:   //sw12//
                                key_val=12;   
                                          key_get=1;
                                          break;
                           case 2://sw14//
                                key_val=14;   
                                          key_get=1;
                                          break;
                           case 3://sw16//
                                key_val=16;   
                                          key_get=1;
                                          break;
                           default:
                                //key_val=0;   
                                          //key_get=0;
                                          break;
                          }
             break;
   case 0x40:
             switch(N)
                          {
                           case 0:   //sw11//
                                key_val=11;   
                                          key_get=1;
                                          break;
                           case 1:   //sw13//
                                key_val=13;   
                                          key_get=1;
                                          break;
                           case 2:   //sw15//
                                key_val=15;   
                                          key_get=1;
                                          break;
                           case 3:   //sw17//
                                key_val=17;   
                                          key_get=1;
                                          break;
                           default:
                                //key_val=0;   
                                          //key_get=0;
                                       
                                          break;
                          }
             break;
   default:
             if(key_get!=1)
                          {
                           key_count=900;   //关闭计时器//
                          }
                       break;
}
}

py-industry 发表于 2015-9-1 00:36:23

我的怎么上传不了图片{:mad:} {:mad:}
页: [1]
查看完整版本: TM1629B 键盘点动和快速处理