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];