我在這里用C++向大家展示一個實用的程序,如果你會C,相信C++對你來說不會很難。而且在我們平時的編程中,又要兼顧PCB,又要記住接線方法,是否會讓你感到很棘手呢?經(jīng)過我多年的編程經(jīng)驗,我把這個程序和大家分享,讓大家領略到一些編程的技巧。這個程序需要將數(shù)碼管的腳全部連接到MCU的IO上,可以任意連接.
首先我們需要定義一個mydef.h保存在你的工作目錄下,輸入以下內容,當然是由您自己的喜歡而定義,但是請記住需要對號入座。
#define seLED_QW() (clPB0())
#define seLED_BW() (clPB0())
#define seLED_SW() (clPB0())
#define seLED_GW() (clPB0())
#define clLED_QW() (sePB0())
#define clLED_BW() (sePB0())
#define clLED_SW() (sePB0())
#define clLED_GW() (sePB0())
#define seLED_DQW() (seDB0())
#define seLED_DBW() (seDB0())
#define seLED_DSW() (seDB0())
#define seLED_DGW() (seDB0())
#define seLED_PA() (sePB0())
#define seLED_PB() (sePB0())
#define seLED_PC() (sePB0())
#define seLED_PD() (sePB0())
#define seLED_PE() (sePB0())
#define seLED_PF() (sePB0())
#define seLED_PG() (sePB0())
#define seLED_PH() (sePB0())
#define seLED_DA() (seDB0())
#define seLED_DB() (seDB0())
#define seLED_DC() (seDB0())
#define seLED_DD() (seDB0())
#define seLED_DE() (seDB0())
#define seLED_DF() (seDB0())
#define seLED_DG() (seDB0())
#define seLED_DH() (seDB0())
#define clLED_PA() (clPB0())
#define clLED_PB() (clPB0())
#define clLED_PC() (clPB0())
#define clLED_PD() (clPB0())
#define clLED_PE() (clPB0())
#define clLED_PF() (clPB0())
#define clLED_PG() (clPB0())
#define clLED_PH() (clPB0())
以上大家應該看得明白吧,就是讓編譯器知道LED屏的腳位和最低級的動作。
接下來大家再寫一個.h文件,輸入以下內容,然后保存,通常我習慣把經(jīng)常需要用到的庫文件保存到c:inc\目錄下,我把它保存為4led.h如果你很聰明的話,當然還可以更改以做出更優(yōu)秀的作品。
/******************************************************************
函數(shù)說明:
void FOURLED::FOURLED(void); 構造函數(shù)
void FOUR_LED::DrawText(const char *p,char x=0); 將字符串顯示到x位置上
void FOUR_LED::char TEXT(const char *p,unsigned char speed=0); 將字符串按speed定義的速度流動顯示
char FOUR_LED::out(); 輸出程序,在main里需要定時調用本程序以刷新LED,返回值:0正在刷新,1:結束。
char FOUR_LED::setBRI(char i)// 顯示屏亮度調整, 0-50 越高亮度越高,越低亮度越低,但是刷新率也會降低(造成閃爍)
**********************************************************************/
#include "c:\inc\asciitab.h"
[B ]class FOUR_LED
{
private:
unsigned char bri,i,start,timer;
public:
unsigned char sbuffer[4];
void DrawText(const char *p,char x=0)
{
while(*p||x<4)
{
if(p[0]==0)
{
sbuffer[x]=0;
}
else if(p[0]=='.')
{
sbuffer[x]=ASCIItab[*p];
p++;
}
else if(p[1]!='.')
{
sbuffer[x]=ASCIItab[*p];
p++;
}
else
{
sbuffer[x]=ASCIItab[*p]|0x80;
p+=2;
}
x++;
}
}
char TEXT(const char *p,unsigned char speed=0)
{
if(speed==0)
{
DrawText(p);
}
else
{
if(start<4)
{
sbuffer[0]=sbuffer[1]=sbuffer[2]=sbuffer[3]=0;
DrawText(p,4-start);
}
else
{
DrawText(p+start-4);
if(p[start-1]==0)
{
start=0;
return 1;
}
}
if(timer<0xFF)
timer++;
else
{
timer=speed;
start++;
}
}
return 0;
}
char out()
{
char x;
clLED_GW();// 黑屏
clLED_SW();
clLED_BW();
clLED_QW();
if(i<=3)
{
x=sbuffer[i ];
if(x&0x01)// 輸出A~G
{
seLED_PA();
}
else
{
clLED_PA();
}
if(x&0x02)
{
seLED_PB();
}
else
{
clLED_PB();
}
if(x&0x04)
{
seLED_PC();
}
else
{
clLED_PC();
}
if(x&0x08)
{
seLED_PD();
}
else
{
clLED_PD();
}
if(x&0x10)
{
seLED_PE();
}
else
{
clLED_PE();
}
if(x&0x20)
{
seLED_PF();
}
else
{
clLED_PF();
}
if(x&0x40)
{
seLED_PG();
}
else
{
clLED_PG();
}
if(x&0x80)
{
seLED_PH();
}
else
{
clLED_PH();
}
}
switch(i)// 置位相應的總控制位(GW~QW)
{
case 0:seLED_QW();break;
case 1:seLED_BW();break;
case 2:seLED_SW();break;
case 3:seLED_GW();break;
}
if(i<3)
i++;
else
{
if(bri)
{
if(i<bri)
i++;
else
i=0;
}
else
i=0;
}
return 0;
}
void setBRI(char i)// 0-50 越高亮度越高
{
bri=50-i;
}
FOUR_LED()
{
i=0;
start=0;
timer=0xFF;
bri=0;
seLED_DA();
seLED_DB();
seLED_DC();
seLED_DD();
seLED_DE();
seLED_DF();
seLED_DG();
seLED_DH();
seLED_DQW();
seLED_DBW();
seLED_DSW();
seLED_DGW();
}
};
這個程序里面包含了一個叫asciitab.h的文件,里面是一個數(shù)組,定義了顯示屏能夠顯示的字符。內容如下:
__flash unsigned char ASCIItab[150]=
{//0 1 2 3 4 5 6 7 8 9
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//0
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//1
0x00,0x00,0x00,0x00,0x03,0x18,0x0c,0x18,0x00,0x00,//2
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,//3
0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x3f,0x06,//4
0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x00,//5
0x00,0x48,0x00,0x00,0x00,0x77,0x7c,0x39,0x5e,0x79,//6
0x71,0x3d,0x76,0x06,0x1e,0x00,0x38,0x00,0x37,0x3f,//7
0x73,0x67,0x50,0x6d,0x78,0x3e,0x3e,0x00,0x00,0x6e,//8
0x00,0x39,0x00,0x0f,0x23,0x08,0x00,0x77,0x7c,0x39,//9
0x5e,0x79,0x71,0x3d,0x76,0x06,0x1e,0x00,0x38,0x00,//10
0x54,0x5c,0x73,0x67,0x50,0x6d,0x78,0x1c,0x00,0x00,//11
0x00,0x6e,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,//12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //14
};
到了這里,你就可以在你的主程序里面打上這么一句:
#include "io.h"
#include "mydef.h"
#include "c:\inc\4led.h"
FOUR_LED led;
int main()
{
led.TEXT("3.141");
while(1)
{
led.out();
}
}
程序就能夠將3.141顯示在你的顯示屏上了,無論是共陰還是共陽的數(shù)碼管都可以用,只要在mydef.h稍做改變即可.是否有點 Hello Word! 的感覺了呢?這是不是很簡單呢?
把我剛才所說的內容消化一下,保存到某個文件夾里,以后你就可以輕松自如的在任何地方使用LED屏(數(shù)碼管)了。