1.設計思想
我第一次看到7個IO口控制7*n個燈的時候,我也是很懵,不應該是一個IO對應一個LED燈控制嗎,這么多燈,什么控制啊,而且還要顯示數字出來。相信很多剛從學校畢業出來的朋友如果遇到這樣的問題,一定也會很懵。那么我們就來聊聊這樣的一對多的LED控制如何實現。

首先在這里我給出這一種數碼管的其中一個原理圖,要想控制這一類的數碼管顯示數據,簡單的說就是控制LED燈的亮滅,同時又要讓數碼管顯示均勻,并且不出現閃屏。
接下來我來說說,像這樣的數碼管,我們應該如何寫程序,才能達到市場使用的要求。我們一定要清楚,像這樣的數碼管,我們必須要逐個進行掃描式顯示,并且時間不能少于1ms。
2.程序設計
Display.h
#ifndef __Display_H__ #define __Display_H__ #include "WS51F0030.h" #define LED1_OUT_H P01=1 #define LED1_OUT_L P01=0 #define LED1_SET_OUT P01F=0x02 #define LED1_SET_IN P01F=0x01 #define LED2_OUT_H P00=1 #define LED2_OUT_L P00=0 #define LED2_SET_OUT P00F=0x02 #define LED2_SET_IN P00F=0x01 #define LED3_OUT_H P10=1 #define LED3_OUT_L P10=0 #define LED3_SET_OUT P10F=0x02 #define LED3_SET_IN P10F=0x01 #define LED4_OUT_H P11=1 #define LED4_OUT_L P11=0 #define LED4_SET_OUT P11F=0x02 #define LED4_SET_IN P11F=0x01 #define LED5_OUT_H P12=1 #define LED5_OUT_L P12=0 #define LED5_SET_OUT P12F=0x02 #define LED5_SET_IN P12F=0x01 typedef struct { unsigned char A:1; unsigned char B:1; unsigned char C:1; unsigned char D:1; unsigned char E:1; unsigned char F:1; unsigned char G:1; unsigned char H:1; } OneBit; typedef union { OneBit OneBit; unsigned char Allbits; } Disshow; void Display_PIN(void); #endif
Display.c
#include "Display.h" Disshow Dis1,Dis2,Dis3; unsigned char Dis_ScanCnt=0; void Display_PIN(void) { LED1_SET_IN; LED2_SET_IN; LED3_SET_IN; LED4_SET_IN; LED5_SET_IN; if(Dis_ScanCnt>5)Dis_ScanCnt=0; Dis_ScanCnt++; switch(Dis_ScanCnt) { case 1: LED1_SET_OUT; LED1_OUT_L; if(Dis1.OneBit.F == 1) { LED2_SET_OUT; LED2_OUT_H; } if(Dis1.OneBit.A == 1) { LED3_SET_OUT; LED3_OUT_H; } if(Dis1.OneBit.B == 1) { LED4_SET_OUT; LED4_OUT_H; } if(Dis1.OneBit.G == 1) { LED5_SET_OUT; LED5_OUT_H; } break; case 2: LED2_SET_OUT; LED2_OUT_L; if(Dis2.OneBit.F == 1) { LED1_SET_OUT; LED1_OUT_H; } if(Dis2.OneBit.A == 1) { LED3_SET_OUT; LED3_OUT_H; } if(Dis2.OneBit.B == 1) { LED4_SET_OUT; LED4_OUT_H; } if(Dis2.OneBit.G == 1) { LED5_SET_OUT; LED5_OUT_H; } break; case 3: LED3_SET_OUT; LED3_OUT_L; if(Dis1.OneBit.C == 1) { LED4_SET_OUT; LED4_OUT_H; } if(Dis1.OneBit.D == 1) { LED2_SET_OUT; LED2_OUT_H; } if(Dis1.OneBit.E == 1) { LED1_SET_OUT; LED1_OUT_H; } if(Dis2.OneBit.E == 1) { LED5_SET_OUT; LED5_OUT_H; } break; case 4: LED4_SET_OUT; LED4_OUT_L; if(Dis2.OneBit.C == 1) { LED1_SET_OUT; LED1_OUT_H; } if(Dis2.OneBit.D == 1) { LED2_SET_OUT; LED2_OUT_H; } if(Dis3.OneBit.A == 1) { LED3_SET_OUT; LED3_OUT_H; } if(Dis3.OneBit.B == 1) { LED5_SET_OUT; LED5_OUT_H; } break; case 5: LED5_SET_OUT; LED5_OUT_L; if(Dis3.OneBit.C == 1) { LED1_SET_OUT; LED1_OUT_H; } if(Dis3.OneBit.D == 1) { LED2_SET_OUT; LED2_OUT_H; } if(Dis3.OneBit.E == 1) { LED3_SET_OUT; LED3_OUT_H; } if(Dis3.OneBit.F == 1) { LED4_SET_OUT; LED4_OUT_H; } break; } }
顯示數據真值表
unsigned char code Tab[11]= {0x3F,0x06,0x5b,0x4f,0x66,0x6D,0x7d,0x07,0x7f,0x6f,0x79};
顯示數據我們可直接對Dis1,Dis2,Dis3的Allbits 賦值即可。
如我想在數碼管1上顯示5,數碼管2上顯示2,數碼管3上顯示0。
Dis1.Allbits = Tab[5];
Dis2.Allbits = Tab[2];
Dis3.Allbits = Tab[0];
浙公網安備 33010602011771號