我在这里用C++向大家展示一个实用的程序,如果你会C,相信C++对你来说不会很难。而且在我们平时的编程中,又要兼顾PCB,又要记住接线方法,是否会让你感到很棘手呢?经过我多年的编程经验,我把这个程序和大家分享,让大家领略到一些编程的技巧。这个程序需要将数码管的脚全部连接到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文件,输入以下内容,然后保存,通常我习惯把经常需要用到的库文件保存到c:inc\目录下,我把它保存为4led.h如果你很聪明的话,当然还可以更改以做出更优秀的作品。
/******************************************************************
函数说明:
void FOURLED::FOURLED(void); 构造函数
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的文件,里面是一个数组,定义了显示屏能够显示的字符。内容如下:
__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显示在你的显示屏上了,无论是共阴还是共阳的数码管都可以用,只要在mydef.h稍做改变即可.是否有点 Hello Word! 的感觉了呢?这是不是很简单呢?
把我刚才所说的内容消化一下,保存到某个文件夹里,以后你就可以轻松自如的在任何地方使用LED屏(数码管)了。