软件延时的误区
往往这些问题都是整个流程上附加的延时过多导致的。延时程序是比较直观明了的程序,但是也破坏单片机的整机性能,因为延时单片机处于全速运行状态。
我现在的脑海想起以前写的流程:初始化->显示->按键->其他功能->结束。
1.比如说显示,肉眼不可分辨是50HZ以上,所以说用4个数码管动态显示平均每个显示是5ms。按照以前的观点是这样写的 第一个数码管点亮->延时几毫秒、灭第一个、点亮第二个->...->延时、灭最后个、点亮第一个。 如果8个数码管的动态显示,岂不是得有 8 * 几毫秒的 延时。
2.还有个按键,按键得有个去除抖动,通常是软件延时,大约在20ms, 如果在加上显示的几十毫秒,那这延时是相当恐怖的。
3.其他功能函数也是有附带延时,特别是驱动程序,比如MAX7279读取操作都是需要一定延时,但是这种延时都是在us级别,对比与ms级别可以忽略。
笔者建议写程序,特别写到延时程序,考虑下你的延时得多久,如果是ms级别,考虑用定时器中断处理。
比如说显示程序。假如8个数码管动态显示。那么你就得考虑20ms内8个数码管刷新一次,那么意味着每个数码管显示时间为2.5ms。
那么程序如下:
volatile unsigned char time_2500_flag; //2.5ms标志
void TimerA(void) //定时器初始化
{
//初始化,配置为500us中断一次
}
#pragma interrupt_handler TimerA_ISR:NUM
void Timer1_ISR(void) //中断服务程序
{
static unsigned char cnt = 0;
//reload 重新赋值
if (++cnt > 5)
{
cnt = 0;
time_2500_flag = 1;
}
}
void Display(void)
{
;
}
void main(void)
{
//初始化
for (;;)
{
if (time_2500_flag == 1)
{
time_2500_flag = 0;
Display();
}
}
}
程序写到这里。
显示程序这里要做特别处理,执行一次显示程序,数码管依次点亮就OK。
软件延时误 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)