|
分享一个超级简单的定时程序,几条语句完成多种定时,
在别人的汇编程序里看到的,觉得非常好用,
以芯海MCU为载体,可以移植到其它各种MCU,
u8 ext Task_Flag_Byte @0x41; //定义指定地址的变量,方便定义各种时间的定时标志位
sbit ext f_Task_8ms @0x41*8+0; //
sbit ext f_Task_16ms @0x41*8+1;
sbit ext f_Task_32ms @0x41*8+2;
sbit ext f_Task_64ms @0x41*8+3;
sbit ext f_Task_128ms @0x41*8+4;
sbit ext f_Task_256ms @0x41*8+5;
sbit ext f_Task_512ms @0x41*8+6;
sbit ext f_Task_1024ms @0x41*8+7;
//=======================================================
//下面这段代码写在中断服务函数里面,定时8ms,也可以由其它方法得到8ms
//=======================================================
Time_8ms_Count ++;
asm("movfw _Time_8ms_Count"); //先把8ms计数送到ACC
asm("xorwf _Time_Flag_Old,0"); //ACC与旧值异或,结果先暂时放到ACC
asm("xorwf _Time_Flag_Old,1"); //再将异或后放在ACC中的结果与旧值异或,更新到旧值
asm("iorwf _Time_Flag_Byte,1"); //此时的ACC还是上上条语句的结果,作为定时更新标志
// Time_Flag_Old ^= (Time_Flag_Old ^ Time_8ms_Count);
// Time_Flag_Byte |= (Time_Flag_Old ^ Time_8ms_Count); //这两条C语句等同于上面的4条汇编语句,
//=======================================================
//下面这段代码写主程序的大循环里面,也可以单独写成函数后在主大循环里面调用
//=======================================================
//更新标志前先关闭中断,防止在更新标志过程的同时在中断服务函数中也被更新,而出错
GIE = 0;
Task_Flag_Byte = Time_Flag_Byte; //更新任务定时标志
Time_Flag_Byte = 0; //清中断定时标志位
GIE = 1; //开中断
//=======================================================
//然后就可以这样调用定时的时间了,是不是很简单?
//=======================================================
if(f_Task_512ms) //可以这样用了
{
Uart_Send_Data();
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|