相信很多人最开始写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, // 0 1 2 3 4 5 6 7 8 9
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[dat];
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译码器位选(数码管位置选择的意思)的实现程序,代码最重要的如何封装,其他方式的位选也是一样的,不懂的可以留言哟! |