![]() |
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腳三極管高電平輸出,其它段類似控制,需要把各顯示內容做一個真值表,顯示時把掃描顯示即可 |