5脚7段数码管对应图 -> 共阴 其实共阴共阳都一样 本文以共阴为目标
这是5个引脚对应的io口
cs1-5 -> pin1 -5 分别对应就好
一:
看引脚关系 得到
如图所示 5脚已经足够驱动2位7段数码管
这是杰理的输入输出与引脚宏定义
依照具体的单片机具体设计
如图所示 有1A - 1G 2A - 2G每个数码管有7段,有4个开关,我们一上面1 2 3 4为扫描基础 就当1个开关
有7段 或者8段 -> 可以用一字节进行 每一位bit控制1段数码管 控制7段有一位bit不用 具体哪一位看大小端 一位字节 用bit控制每一段 我们用共用体
如下
typedef union
{
unsigned char byte;
struct{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}Bits;
}ByteBit_Union;
/*数码管段显*/
extern ByteBit_Union DG1_Flag;
#define DG1_A DG1_Flag.Bits.bit0
#define DG1_B DG1_Flag.Bits.bit1
#define DG1_C DG1_Flag.Bits.bit2
#define DG1_D DG1_Flag.Bits.bit3
#define DG1_E DG1_Flag.Bits.bit4
#define DG1_F DG1_Flag.Bits.bit5
#define DG1_G DG1_Flag.Bits.bit6
extern ByteBit_Union DG2_Flag;
#define DG2_A DG2_Flag.Bits.bit0
#define DG2_B DG2_Flag.Bits.bit1
#define DG2_C DG2_Flag.Bits.bit2
#define DG2_D DG2_Flag.Bits.bit3
#define DG2_E DG2_Flag.Bits.bit4
#define DG2_F DG2_Flag.Bits.bit5
#define DG2_G DG2_Flag.Bits.bit6
这样每一段数码管都有了对应的bit位
接下来就是扫描函数的编写
1:将整体作为4个总开关,进行对联合体每一位扫描 进行打开对应的数码管
2:或者利用这个二位数组进行对应开关
3:如图 也是利用二维数组 进行扫描 一个数组拿来判断哪一位 另一个二维数组扫描
采用的是第一种 代码如下
static u8 led_scan_flag = 0;
//扫描函数
void Led_scan_deal(unsigned char byte1,unsigned char byte2)
{
DG1_Flag.byte = byte1;
DG2_Flag.byte = byte2;
//输入模式
CS_1_IN_OUT();
CS_2_IN_OUT();
CS_3_IN_OUT();
CS_4_IN_OUT();
CS_5_IN_OUT();
if(led_scan_flag == 0)
{
CS_1_OUT();
CS_1_L();
if(DG1_A)
{
CS_2_OUT();
CS_2_H();
}
if(DG1_B)
{
CS_3_OUT();
CS_3_H();
}
if(DG1_C)
{
CS_4_OUT();
CS_4_H();
}
if(DG1_D)
{
CS_5_OUT();
CS_5_H();
}
}
if(led_scan_flag == 1)
{
gpio_set_direction(HBS117_CS2, 0); // 输出方向
CS_2_L();
if(DG1_E)
{
CS_1_OUT();
CS_1_H();
}
if(DG1_F)
{
CS_3_OUT();
CS_3_H();
}
if(DG1_G)
{
CS_4_OUT();
CS_4_H();
}
if(DG2_A)
{
CS_5_OUT();
CS_5_H();
}
}
if(led_scan_flag == 2)
{
CS_3_OUT();
CS_3_L();
if(DG2_B)
{
CS_1_OUT();
CS_1_H();
}
if(DG2_C)
{
CS_2_OUT();
CS_2_H();
}
if(DG2_D)
{
CS_4_OUT();
CS_4_H();
}
if(DG2_E)
{
CS_5_OUT();
CS_5_H();
}
}
if(led_scan_flag == 3)
{
CS_4_OUT();
CS_4_L();
if(DG2_F)
{
CS_1_OUT();
CS_1_H();
}
if(DG2_G)
{
CS_2_OUT();
CS_2_H();
}
}
led_scan_flag++;
if(led_scan_flag >= 4)
led_scan_flag = 0;
}
它的单位16进制数
显示函数并不齐全 可按照实际需求进行编写
void led_deg_dis(u8 num1, u8 num2) //分别写
{
if(((num1 > 15) | (num1 < 0)) | ((num2 > 15) | (num2 < 0)))
return;
Led_scan_deal(led_table[num1],led_table[num2]);
}
void led_hex_dis(u16 num, BOOL flag) //16进制转换显示 flag 1 开启0-99 显示 0 16进制显示
{
if(num < 0 || num > 255 )
{
DG1_Flag.byte = 0xff;
DG2_Flag.byte = 0xff;
Led_scan_deal(DG1_Flag.byte,DG2_Flag.byte);
return;
}
if(flag && (num <= 100))
{
DG1_Flag.byte = led_table[num / 10];
DG2_Flag.byte = led_table[num % 10];
Led_scan_deal(DG1_Flag.byte,DG2_Flag.byte);
}else
{
DG1_Flag.byte = led_table[num / 16];
DG2_Flag.byte = led_table[num % 16];
Led_scan_deal(DG1_Flag.byte,DG2_Flag.byte);
}
}