昨日有同学问我有一个关于单片机的功用怎么完成:
1:
假定按下KEY1,发动30S倒数
途中按下KEY2,跳去履行其他函数,30S倒数撤销
2:
按下KEY1,发动30S倒数
途中按下KEY2,跳去其他函数履行一起,不影响30S倒数
假定按下KEY1,发动30S倒数
途中按下KEY2,跳去履行其他函数,30S倒数撤销
2:
按下KEY1,发动30S倒数
途中按下KEY2,跳去其他函数履行一起,不影响30S倒数
进过问询,归于要求1,而且运用矩阵键盘。
风趣的是,我认为要求2更简单完成,成果要求2一下就做到了,可是要求1想了好久,问题在于:按下KEY2履行其他程序后,按下KEY1不是从头进行倒数。我总想着是否可以把守时器从头赋值,试过了修正各个相关寄存器,十分奇怪的是,初始化之后,守时器值好像就无法更改?上网查了查,查不到相关的疑问。
可是就在一会儿,答案一闪而过,终究程序如下(省去了大部分程序和变量的界说等):
void main()
{
init();//守时中止的相关初始化
while(1)
{
keyscan();
if (1 == keynum)
{
disp();//数码管显现倒计时状况
LED = 1;
keyscan();
}
if (2 == keynum)
{
LED = 0;
keyscan();
time = 30;//便是这一句,完成了了从头倒计时
}
}
void tim1(void) interrupt 1
{
TH0 = (65535-62484)/256;
TL0 = (65535-62484)%6;
timer++; //由于守时器无法完成一秒守时,用一个变量完成
if (timer >= 16)
{
timer = 0;
time–;
if( time <= 0)
time = 30; //用于时刻显现
}
}
解决问题的办法,便是把显现的数字从头赋值为30,不要管守时器现在的状况是怎么样,由于完成作用便是给人看的,只需观察到的表象符合要求就可以,编程的工作,往往便是这么山重水复疑无路,柳暗花明又一村。尽管不清楚是否影响守时的精度,但这种转化视点思考问题的思路确实是言必有中。