哈哈,刚好前一段时间俺在琢磨模块化变成的时候,也是和LZ有一样的疑惑,但是后来经过高手的指点和自己的摸索,也有所感悟,在这里也介绍给LZ琢磨琢磨,同时也希望大家也点评点评哦!(欢迎大虾猛的拍砖)
对于数码管的刷新,我一般都是这么做的。首先先建立一个缓冲区,用来存放数码管要显示的数据
然后在定时器中设立一个标志位,譬如说10ms(当然这个时间,是需要自己调整的),然后隔10ms,刷新一次数码管的缓冲区。而数码管什么都不用管,只需要从缓冲区取出自己需要显示的内容就可以了。
当然,你的程序中如果有别的模块的话,譬如说led的闪烁等等这些,都需要用定时器设立标志位的方式,来进行刷新。否则别的模块必然会占用CPU过多的时间,而出现数码管刷新不够快而闪烁的问题啦
如果整个工程都是采取这种方式的话。数码管的刷新问题解决了,同时程序中别的模块也会很有序的依次执行,相互的影响也会大大的减小。
附代码(欢迎大虾拍砖哦!:))
#include"digi.h"
#include"timer0.h"
#include"mylib.h"
#include"led.h"
bit Digi_Flag_2Ms=0;
bit Digi_Flag_1S=0;
//uint counter = 0;
uchar Digi_Buffer[3]={0x5b,0x6d,0x3f}; //定义的缓冲区
uchar code Digi_SegCode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f };
void Digi_LoadValue(uint value)
{
Timer0_Stop();
// Led_1 = 0;
Digi_Buffer[0] = Digi_SegCode[value%10];
Digi_Buffer[1] = Digi_SegCode[(value/10)%10];
Digi_Buffer[2] = Digi_SegCode[value/100];
Timer0_Start();
}
void Digi_Display()
{
static uchar s = 0;
static uchar t = 0;
if(Digi_Flag_2Ms == 1)
{
Digi_Flag_2Ms = 0;
switch(s)
{
case 0:
{
P1 = Digi_Buffer[0];
Digi_W1 = 1;
Digi_W2 = 1;
Digi_W3 = 0;
}
break;
case 1:
{
P1 = Digi_Buffer[1];
Digi_W1 = 1;
Digi_W2 = 0;
Digi_W3 = 1;
}
break;
case 2:
{
P1 = Digi_Buffer[2];
Digi_W1 = 0;
Digi_W2 = 1;
Digi_W3 = 1;
// Led_2 = 0;
}
break;
}
s++;
t++;
if(s == 3)
{
s = 0;
}
if(t == 50)
{
t=0;
Digi_Flag_1S = 1;
}
}
}
void Digi_Run() //简单的数码管计数函数
{
static uint counter = 0;
if(Digi_Flag_1S == 1)
{
Timer0_Stop();
Digi_Flag_1S = 0;
counter ++;
Digi_LoadValue(counter);
if(counter == 999)
{
counter = 0;
Led_2 = 0;
}
Timer0_Start();
}
}
主函数:
void main()
{
Key_Init();
Led_Init();
Timer0_Init();
while(1)
{
Key_Do(); //按键的扫描
Led1_State_Change();
Led1_Process(); //led1的闪烁子函数
Led2_State_Change();
Led2_Process();
Digi_Run(); //更新缓冲区
Digi_Display(); //显示
}
}
|