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;
}
} 我的怎么上传不了图片{:mad:} {:mad:}
页:
[1]