|
承接上一帖键盘处理,刚刚测试完按键的点动和快速加减处理,发给大家!思路觉得OK的别忘了点赞,更多的我想听到前辈们的意见!暂时调到哪就写到哪,虽不完整,但足以可以表述我对此问题的处理思路!
顺便提一下,复合键的处理也是一样,往程式里塞就可以了!
中心点: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[0]++;
if(disdat_A[0]>99){disdat_A[0]=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[0]--;
if(disdat_A[0]>99){disdat_A[0]=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[N])
{
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;
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|