1481509156 发表于 2024-7-17 18:56 需要,楼主用的GPIOA这一组,是按组使用io的 |
很多情況下,一次點亮數個LED,只能專用,用途受限。 |
本帖最后由 coody_sz 于 2024-7-21 21:04 编辑 说显示有问题的朋友,可能没有编程驱动过。 大量的移动电源使用,不会有问题的。 楼主的这个比较好驱动,最简单的是5脚输出高电平,1~4脚输出低就能控制4个。 5脚输出高阻或低电平,则1~4脚轮流有一个输出高,其余3个要显示就输出低,不显示就高阻。 其实这是分时驱动共阴、共阳的接法,比如8个SEGMENT和8个COMMENT就可以驱动16个数码管,即16个IO驱动16个数码管,很常用的接法,一些MCU直接支持,比如STC8H4K64TL的24个IO就可以驱动32个数码管256段。 早几天我刚好买了一些无线话筒的显示模块,7个IO显示40段(最多可以42段)。 ![]() |
Mgc666 发表于 2019-8-27 18:52 大量的移动电源使用,不会有问题的,看我下面的驱动描述。 |
Mgc666 发表于 2019-8-27 18:44 大量的移动电源使用,不会有问题的,看我下面的驱动描述。 |
这个对单片机有要求。普通数码管,是一位一位的扫描;这个是一段一段的扫描,且只能有一段,其它脚要为高阻态。 |
每次只能有两个I0做输出,一个输出高,一个输出低,另外的不用全做高阻输入状态,这样其它不相关的LED就会不被点亮。 |
这个跟普通的4*8一样的驱动原理,4*8就是一次点亮一个8,而这种一次只是点亮一笔,即一个LED,利用快速扫瞄显出一个个8字。只要扫完一周的频率大于60HZ基本人眼就看不到闪烁了。 |
jjy1039 发表于 2024-7-2 16:02 没用过动态的,请教下,如果我用的IO脚不同的话,这个真值表需要变更吗? |
wangshouyun001 发表于 2020-10-30 17:15 u16 w1Tab[2]={0x0000,0x0480}; //第一位0,1 u16 w2Tab[10]={0x0936,0x0110,0x0925,0x0931,0x0113,0x0833,0x0837,0x0910,0x0937,0x0933};//第二位0-9 u16 w3Tab[10]={0xf240,0x5000,0xb208,0xd208,0x5048,0xc248,0xe248,0xd000,0xf248,0xd248}; //第三位0-9 u8 ywTab[16]={1,2,3,0,2,3,0,1,3,0,1,2,0,1,2,3};//移位 |
jacks888 发表于 2020-4-20 21:58 u16 w1Tab[2]={0x0000,0x0480}; u16 w2Tab[10]={0x0936,0x0110,0x0925,0x0931,0x0113,0x0833,0x0837,0x0910,0x0937,0x0933}; u16 w3Tab[10]={0xf240,0x5000,0xb208,0xd208,0x5048,0xc248,0xe248,0xd000,0xf248,0xd248}; u8 ywTab[16]={1,2,3,0,2,3,0,1,3,0,1,2,0,1,2,3}; 解释一下 |
jacks888 发表于 2020-4-20 21:58 很不错的分享,慢慢研究一下 |
来个精简版的 u16 w1Tab[2]={0x0000,0x0480}; u16 w2Tab[10]={0x0936,0x0110,0x0925,0x0931,0x0113,0x0833,0x0837,0x0910,0x0937,0x0933}; u16 w3Tab[10]={0xf240,0x5000,0xb208,0xd208,0x5048,0xc248,0xe248,0xd000,0xf248,0xd248}; u8 ywTab[16]={1,2,3,0,2,3,0,1,3,0,1,2,0,1,2,3}; u8 stp=0; void display(u8 dt) { u8 odt; u16 dm = w1Tab[dt/100]|w2Tab[(dt%100)/10]|w3Tab[dt%10]; if(stp>=16)stp=0; odt = 0x1f & (~((((dm&(0x0001<<(15-stp)))==(0x0001<<(15-stp)))?1:0)<<ywTab[stp])); GPIOA->BSRR =((((u32)(~odt))<<16)|(u32)(odt)); stp++; } |
asd.png (38.46 KB, 下载次数: 87)
C:\Users\sj\Desktop\asd.png u16 w1Tab[2]={0x0000,0x0480}; u16 w2Tab[10]={0x0936,0x0110,0x0925,0x0931,0x0113,0x0833,0x0837,0x0910,0x0937,0x0933}; u16 w3Tab[10]={0xf240,0x5000,0xb208,0xd208,0x5048,0xc248,0xe248,0xd000,0xf248,0xd248}; u8 ywTab[16]={1,2,3,0,2,3,0,1,3,0,1,2,0,1,2,3}; u8 stp=0; void display(u8 dt) { u8 odt; u16 dm = w1Tab[dt/100]|w2Tab[(dt%100)/10]|w3Tab[dt%10]; if(stp>=16)stp=0; odt = 0x1f & (~((((dm&(0x0001<<(15-stp)))==(0x0001<<(15-stp)))?1:0)<<ywTab[stp])); GPIOA->BSRR =((((u32)(~odt))<<16)|(u32)(odt)); stp++; } |
![]() ![]() |
可以咨询数码管的生产厂家 深圳市新亮点电子有限公司,有完整的驱动方案 |
Mgc666 发表于 2019-8-28 14:08 有没有C的的提示? |
天涯落客 发表于 2019-8-28 10:37 这汇编看得一头雾水 ![]() |
LcdDrive_init: movlw 00001011b andwf pt1en,1 ; movlw 00000000b ; andwf pt5en,1 clrf R_Temp1 clrf R_Temp2 movfw R_LcdDate_Ge call LcdData_Tab0 btfsc R_TimeFlag,B_FirstOnMode2 movlw FFH btfsc R_TimeFlag,B_Error_En movlw FFH movwf R_Temp1 movfw R_LcdDate_Shi call LcdData_Tab0 btfsc R_TimeFlag,B_FirstOnMode2 movlw FFH btfsc R_TimeFlag,B_Error_En movlw FFH movwf R_Temp2 btfss R_LcdDate_Bai,0 goto LcdDrive_Deal bsf R_Temp1,7 bsf R_Temp2,7 LcdDrive_Deal: movfw R_LcdCom_Cnt andlw 00001111b addpcw goto LcdDrive_Com1 ;1-2 seg - com goto LcdDrive_Com2 ;2-1 goto LcdDrive_Com3 ;1-3 goto LcdDrive_Com4 ;3-1 goto LcdDrive_Com5 ;1-4 goto LcdDrive_Com6 ;4-1 goto LcdDrive_Com7 ;5-1 goto LcdDrive_Com8 ;2-3 goto LcdDrive_Com9 ;3-2 goto LcdDrive_Com10 ;4-3 goto LcdDrive_Com11 ;4-2 goto LcdDrive_Com12 ;5-2 goto LcdDrive_Com13 ;5-3 goto LcdDrive_Com14 ;5-4 goto LcdDrive_Com15 ;3-4 goto LcdDrive_Com16 ;2-4 LcdDrive_Com1: btfss R_Temp1,6 return call Set_Seg1 call Set_Com2 return LcdDrive_Com2: btfss R_Temp1,5 return call Set_Seg2 call Set_Com1 return LcdDrive_Com3: btfss R_Temp1,4 return call Set_Seg1 call Set_Com3 return LcdDrive_Com4: btfss R_Temp1,3 return call Set_Seg3 call Set_Com1 return LcdDrive_Com5: btfss R_Temp1,2 return call Set_Seg1 call Set_Com4 return LcdDrive_Com6: btfss R_Temp1,1 return call Set_Seg4 call Set_Com1 return LcdDrive_Com7: btfss R_Temp1,0 return call Set_Seg5 call Set_Com1 return LcdDrive_Com8: btfss R_Temp2,6 return call Set_Seg2 call Set_Com3 return LcdDrive_Com9: btfss R_Temp2,5 return call Set_Seg3 call Set_Com2 return LcdDrive_Com10: btfss R_Temp2,4 return call Set_Seg4 call Set_Com3 return LcdDrive_Com11: btfss R_Temp2,3 return call Set_Seg4 call Set_Com2 return LcdDrive_Com12: btfss R_Temp2,2 return call Set_Seg5 call Set_Com2 return LcdDrive_Com13: btfss R_Temp2,1 return call Set_Seg5 call Set_Com3 return LcdDrive_Com14: btfss R_Temp2,0 return call Set_Seg5 call Set_Com4 return LcdDrive_Com15: btfss R_Temp2,7 return call Set_Seg3 call Set_Com4 return LcdDrive_Com16: btfss R_Temp1,7 return call Set_Seg2 call Set_Com4 return Set_Seg1: bsf PT_Seg1,P_Seg1 bsf PT_Seg1_En,P_Seg1 return Set_Seg2: bsf PT_Seg2,P_Seg2 bsf PT_Seg2_En,P_Seg2 return Set_Seg3: bsf PT_Seg3,P_Seg3 bsf PT_Seg3_En,P_Seg3 return Set_Seg4: bsf PT_Seg4,P_Seg4 bsf PT_Seg4_En,P_Seg4 return Set_Seg5: bsf PT_Seg5,P_Seg5 bsf PT_Seg5_En,P_Seg5 return Set_Com1: bcf PT_Com1,P_Com1 bsf PT_Com1En,P_Com1 return Set_Com2: bcf PT_Com2,P_Com2 bsf PT_Com2En,P_Com2 return Set_Com3: bcf PT_Com3,P_Com3 bsf PT_Com3En,P_Com3 return Set_Com4: bcf PT_Com4,P_Com4 bsf PT_Com4En,P_Com4 return LcdData_Tab0: andlw 0fh addpcw retlw 01111110B ;0 retlw 00110000B ;1 retlw 01101101B ;2 retlw 01111001B ;3 retlw 00110011B ;4 retlw 01011011B ;5 retlw 01011111B ;6 retlw 01110000B ;7 retlw 01111111B ;8 retlw 01111011B ;9 retlw 01111011B ;9 retlw 01111011B ;9 retlw 01111011B ;9 retlw 01111011B ;9 retlw 01111011B ;9 retlw 01111011B ;9 |
xianfajushi 发表于 2019-8-27 18:40 这个只用单片机的5个io口来控制而已1 2 3 4 5 对应的是5个io口,对应的数字是连接在一起的 |
共阳端1-5脚作为数码管位,用动态扫描,驱动可用三极管8550;1、2、3、4作为数码管段位 |
csmyldl 发表于 2019-8-27 18:33 就像要点亮3A 3B时候就出现问题 |
想法是这样,但是点亮数字的时候会被干扰到 |
16个段引脚看你要如何与蛋骗鸡连接,5个共同端并联即可,段各接限流电阻.用8个IO口驱动或使用16个IO口驱动设计起来就不一样. |
只需要5个三极管或类似5个3极管的IC,如ULN2003 74LS245等均可,假设三极管导通提供电源(高电平),截止时电压接近于0(低电平),关键是程序需采用扫描的方式编写,当1脚的三极管导通提供电源时,234脚要控制相应三极管为低电平,此时有3A 3C 3E三段能点亮,如果只需3A一段亮,需控制2脚三极管低电平输出 34脚三极管高电平输出,其它段类似控制,需要把各显示内容做一个真值表,显示时把扫描显示即可 |