A:
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i=0;i<Num;i++)
{
DataPort=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
Delay(200); // 扫描间隙延时,时间太长会闪烁,
//太短会造成重影
}
}
B:
void Display(unsigned char FirstBit,unsigned char Num)
{
static unsigned char i=0;
DataPort=0; //清空数据,防止有交替重影
LATCH1=1; //段锁存
LATCH1=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位码
LATCH2=1; //位锁存
LATCH2=0;
DataPort=TempData[i]; //取显示数据,段码
LATCH1=1; //段锁存
LATCH1=0;
i++;
if(i==Num) i=0;
}
因为网友只给了这两段代码,我们有些地方只能靠猜测,结合注释,我们可以确定这两段代码的目的是为了实现是显示。
void Display(unsigned char FirstBit,unsigned char Num)
函数的参数: FirstBit 显示数据的起始地址, Num 显示数据的长度。dofly_WeiMa是显示数据存储的缓冲区。DataPort 是数据端口,LATCH2 数据锁存,上跳沿有效。
每输出一个字符,需要隔200个延时再输出下一个字符。是为了防抖。
其实这两段的代码功能是一样的,只是消抖的方式不一样。
A段代码是一次任务的输出所有字符,每个字符输出间隔延时200个时间单位。
B段代码是每次执行输出一个字符,下一次执行再输出下一个字符。每次间隔时间就是主循环运行的时间。
A段代码执行需要一个相当长时间等待,在输出字符串期间是不能执行其他任务。如果时间比较长可能会造成内部看门狗复位、键盘响应滞后等等。整体效率比较低。
B代码的运行效果比较好,只要确保延时够就可以了。执行B代码不需要太长的独占处理器。