资讯详情

基于AVR C++写的4位数码管驱动程序

我在这里用C++向大家展示一个实用的程序,如果你会C,相信C++对你来说不会很难。而且在我们平时的编程中,又要兼顾PCB,又要记住接线方法,是否会让你感到很棘手呢?经过我多年的编程经验,我把这个程序和大家分享,让大家领略到一些编程的技巧。这个程序需要将数码管的脚全部连接到的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() (se 0()) #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_ () (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 XT(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 数码管都可以用,只要在mydef.h稍做改变即可.是否有点 Hello Word! 的感觉了呢?这是不是很简单呢? 把我刚才所说的内容消化一下,保存到某个文件夹里,以后你就可以轻松自如的在任何地方使用LED屏(数码管)了。 -电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台