138动态数码管的封装扫描
相信很多人最开始写51单片机的138动态数码管的时候,采用的是传统循环扫描的那种方式。不得不说那种方式有很多缺点,不仅会使程序结构不清晰,代码也是相当麻烦。
这里作者给出了全新的代码实现方式。
动态数码管的头文件:
#ifndef _FLEXIBLE_DIG_H
#define _FLEXIBLE_DIG_H
#include <reg51.h>
void Dig_Dis_OneBit(unsigned char addr,unsigned char dat);
#endif
动态数码管的C文件:
#include <Flexible_Dig.h>
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;
unsigned char code duanma[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,// 0123456789
0xbf,0xff,0x7f}; // -不显示 .
void Dig_Dis_OneBit(unsigned char addr,unsigned char dat)
{
unsigned int i=400;
LSA=addr&0x01;
LSB=addr&0x02;
LSC=addr&0x04;
P0=~duanma;
while(i--);//消隐
}
主函数:
#include <reg51.h>
#include <Flexible_Dig.h>
void main(void)
{
while(1)
{
//显示5.546
Dig_Dis_OneBit(0,5);
Dig_Dis_OneBit(0,12);
Dig_Dis_OneBit(1,5);
Dig_Dis_OneBit(2,4);
Dig_Dis_OneBit(3,6);
}
}
以这样写出来的函数,在实现复杂的工程的时候代码结构会清晰很多,而且调用数码管的时候仅仅需要函数即可。这是138译码器位选(数码管位置选择的意思)的实现程序,代码最重要的如何封装,其他方式的位选也是一样的,不懂的可以留言哟! 这种显示放在主循环是不行的,必须放在定时中断里,主循环的实时性难以保证 ayb_ice 发表于 2019-11-20 13:07
这种显示放在主循环是不行的,必须放在定时中断里,主循环的实时性难以保证 ...
不管以何种方式显示,任务量一多,数码管都是需要放中断里面的。不是说我这种方式就不能放在主循环,上面例程我就是放主循环里面实现的,是所有的动态扫描显示在任务量多的情况下需要放在中断里面显示 不厉害 发表于 2019-11-20 21:11
不管以何种方式显示,任务量一多,数码管都是需要放中断里面的。不是说我这种方式就不能放在主循环,上面 ...
这与任务量没有必然关系,
我在主循环偶尔调用个延时200MS会怎样,任务量并不多,也只是偶尔调用而已,但结果显然是不能接受的 ayb_ice 发表于 2019-11-21 08:33
这与任务量没有必然关系,
我在主循环偶尔调用个延时200MS会怎样,任务量并不多,也只是偶尔调用而已,但 ...
我没表达清楚,我的意思就是任务的所占用时间长的情况下,都是需要中断的,200MS的任务时间已经很长了 看看
页:
[1]