tag 标签: 5线

相关博文
  • 热度 2
    2025-5-7 15:06
    352 次阅读|
    3 个评论
    二位半 5线数码管的驱动方法
    二位半 5线数码管的驱动方法 这个2位半的7段数码管只用5个管脚驱动。如果用常规的7段+共阳/阴则需要用10个管脚。 如果把每个段看成独立的灯。5个管脚来点亮,任选其中一个作为COM端时,另外4条线可以单独各控制一个灯。所以实际上最多能驱动5*4 = 20个段。但是这里会有一个小问题。如果想点亮B1,可以让第3条线(P3)置高,P4 置低,其它阳极连P3的灯对应阴极P2 P1都应置高,此时会发现C1也会点亮。实际操作时,可以把COM端线P3设置为PP输出,其它线为OD输出。就可以单独控制了。 实际的驱动程序如下: 先定义一个二维数组描述数码管段与管脚对应关系 const uint8_t DotDecode = { /* 3 4 B1 2 4 C1 2 3 A2 3 2 B2 4 3 C2 4 2 D2 5 2 E2 5 3 F2 5 4 G2 1 2 A3 2 1 B3 1 3 C3 3 1 D3 1 4 E3 4 1 F3 5 1 G3*/ {3, 4},{2, 4},{2, 3},{3, 2},{4, 3},{4, 2},{5, 2},{5, 3}, {5, 4},{1, 2},{2, 1},{1, 3},{3, 1},{1, 4},{4, 1},{5, 1} }; 定义段与要显示的数据译码 const uint8_t SEGMENT_CODES 7); temp16 |= SEGMENT_CODES ; } else if(temp = 10){ temp16 |= (SEGMENT_CODES 7); temp16 |= SEGMENT_CODES ; } else temp16 |= SEGMENT_CODES ; vram = temp16; } else vram = 0; } 下面是对操作引脚的定义,为方便编程序,定义一个端口指针数组和一个引脚号数组,然后就可以定引脚设置PP OD 置高置低操作了。 GPIO_TypeDef *drvport = {DRV1_GPIO_Port,DRV2_GPIO_Port,DRV3_GPIO_Port,DRV4_GPIO_Port,DRV5_GPIO_Port}; uint16_t drvpin = {DRV1_Pin,DRV2_Pin,DRV3_Pin,DRV4_Pin,DRV5_Pin}; #define setpp(i) drvport -OTYPER = ~drvpin #define setod(i) drvport -OTYPER |= drvpin #define drivehi(i) drvport -ODR |= drvpin #define drivelo(i) drvport -ODR = ~drvpin 编写一个刷新显示的程序,需要每1ms执行一次。每次选取一条线作为COM端。扫描点阵矩阵,如果单元1中与COM相同,并且vram的对应位是1,则将单元2对应的引脚置低。 其它引脚置高。最后设置COM引脚为PP,其它为OD。就能刷新显示数据了。 void DisplayDigtal(){ //1ms 刷新显示一次 static uint8_t com = 1; uint8_t drv = 0xFF; // 存储 驱动线需要输出的状态 if(vram == 0){ for(uint8_t i = 5;i0;i--) drivelo(i); return; } for(uint8_t i = 0;i16;i++){ if(DotDecode ==com){ if((vram (1(15-i))) != 0) // 对应位不为0 drv = ~(1DotDecode ); } } for(uint8_t i = 5;i0;i--){ setod(i); if((drv (1i)) == 0) drivelo(i); else drivehi(i); } setpp(com); com = (com 5)? com+1:1; } 另外增加一个快速灭显示的函数,就是把所有引脚置为OD输出。 void TurnoffDigital(void){ setod(1); setod(2); setod(3); setod(4); setod(5); } 使用时,调用RefreashVram函数,将需要显示的数据转化为vram中的点。就能显示出来。 下面是动态显示数据的实例。