定时器初始化之后,无法更改其值?
1:
假设按下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,不要管定时器现在的情况是怎么样,因为实现效果就是给人看的,只要观察到的表象符合要求就可以,编程的事情,往往就是这么山重水复疑无路,柳暗花明又一村。虽然不清楚是否影响定时的精度,但这种转换角度思考问题的思路确实是一针见血。
定时器初始 相关文章:
- ARM9 S3C2440—中断和定时器的初始化配置(11-28)
- 51单片机系列连载6—定时器初始化补充(11-27)
- 单片机定时器初始化不能用负号“-(1000/256)“写法(11-24)
- avr定时器T0,T1,T2初始化配置及其说明(11-18)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)