微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 换一种思维来控制多位数码管

换一种思维来控制多位数码管

时间:10-02 整理:3721RD 点击:

www.east027.com第一种思路写出的代码我用蓝色的字表示;第二种思路写出的代码用红色字的字表示;  1、我们知道,控制数码管是每一个学单片机的人都会的,在多位数码管中一般会用到动态显示,在显示图1中的数值(111aab)时多数人都会用下面这种这种典型方法编程。方法一:#include<reg52.h>#define uint unsigned int #define uchar unsigned charunsigned char code tabwe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};/*数码管位选编码,*/uchar code tabdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*共阴极数码管编码从0到F*/ void delay(uint z){    uint x,y;    for(x=z;x>0;x--)        for(y=110;y>0;y--);}void smg(){     P3=tabwe[0];         P0=tabdu[1];         delay(1);         P3=tabwe[1];         P0=tabdu[1];         delay(1);          P3=tabwe[2];         P0=tabdu[1];         delay(1);           P3=tabwe[3];         P0=tabdu[10];         delay(1);         P3=tabwe[4];         P0=tabdu[10];         delay(1);          P3=tabwe[5];         P0=tabdu[11];         delay(1); }void main() {        while(1)    {        smg();    }}    通过上面的例子我们可以很清晰的跟着程序走,感觉思路很有逻辑性、很容易理解,因此这种方法用的人最多。这种思路有自己的优点,但也有缺点,我会通过例子来论证。2、下面是另一种思维编写的程序,可能初学者以及C语言新手会看的很吃力,不过没关系,只要你学过或了解结构体,你一定可以看懂的。方法二:#include<reg52.h>typedef struct node{        unsigned char a;        unsigned char b;}smgcode;unsigned char code tabwe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};/*数码管位选编码,*/void delaysmg(unsigned int z){        unsigned int x,y;        for(x=0;x<z;x++)                for(y=40;y>0;y--);}smgcode code tab_smg[]={                                                ' ',0x00,                                                '0',0x3f,                                                '1',0x06,                                                '2',0x5b,                                                '3',0x4f,                                                '4',0x66,                                                          '5',0x6d,                                                '6',0x7d,                                                '7',0x07,                                                '8',0x7f,                                                '9',0x6f,                                                'a',0x77,                                                'b',0x7c,                                                'c',0x39,                                                'd',0x5e,                                                'e',0x79,                                                'f',0x71,                                                'A',0x77,                                                'B',0x7c,                                                'C',0x39,                                                'D',0x5e,                                                'E',0x79,                                                'F',0x71                                           };void smg(unsigned char *str){        unsigned char i,j;        for(i=0;i<6;i++)        {                for(j=0;j<22;j++)                        if(tab_smg[j].a==str)                                {                                                P3=tabwe;                                                                P0=tab_smg[j].b;                                                                        delaysmg(5);                        }        }}void main(){        while(1)                smg("111aab");} 初看 第二段程序可能会觉得晦涩难懂,乍一看还是第一种方法简单明了。既然写出了第二段程序必定会有它自己的优势,不信你继续往下看。细心点的人会发现第二段程序的主函数也只有两句,而且smg("111aab"); 很明了直观的告诉别人我要让数码管显示111aab。这是它其中的一个优势。可能就这样还不容易发现差别,当出现要轮流显示大量的没有规律的数字(包括a~f),第二段代码的优势就会很强大!我们在图1中是显示“111aab”。如果我们要每隔1s交换显示显示下面图二中的“15fc2d”和图1中的“111aab”,该如何?file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-29818.png我们继续讨论第一段和第二段程序实现这种要求的代码。第一段代码思路代码如下:#include<reg52.h>#define uint unsigned int #define uchar unsigned charunsigned char code tabwe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};/*数码管位选编码,*/uchar code tabdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                                                        0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*共阴极数码管编码从0到F*/ uchar t,temp;void delay(uint z){    uint x,y;    for(x=z;x>0;x--)        for(y=110;y>0;y--);}void smg1(){     P3=tabwe[0];         P0=tabdu[1];         delay(1);         P3=tabwe[1];         P0=tabdu[1];         delay(1);          P3=tabwe[2];         P0=tabdu[1];         delay(1);           P3=tabwe[3];         P0=tabdu[10];         delay(1);         P3=tabwe[4];         P0=tabdu[10];         delay(1);          P3=tabwe[5];         P0=tabdu[11];         delay(1); }void smg2(){         P3=tabwe[0];         P0=tabdu[1];         delay(1);         P3=tabwe[1];         P0=tabdu[5];         delay(1);          P3=tabwe[2];         P0=tabdu[15];         delay(1);           P3=tabwe[3];         P0=tabdu[12];         delay(1);         P3=tabwe[4];         P0=tabdu[2];         delay(1);          P3=tabwe[5];         P0=tabdu[13];         delay(1); } void main() {    TMOD=0x01;    TH0=(65536-50000)/256;    TL0=(65536-50000)%256;    EA=1;    ET0=1;    TR0=1;    while(1)    {        if(temp%2==0)            smg1();         else            smg2();     }}    void T0_SVR() interrupt 1{    TH0=(65536-50000)/256;    TL0=(65536-50000)%256;     t++;    if(t==20)    {        t=0;        temp++;    }}  我们可以发现在这段程序中我们又添加了smg2()这个显示函数,当有3组、4组甚至是更多组这样无规律的数要在数码管上轮流显示,那么无疑要写更多与之相匹配的显示函数,代码量将会更加繁多,再看看另一种思路写出来的效果是什么样的(见红色字):#include<reg52.h>typedef struct node{        unsigned char a;        unsigned char b;}smgcode;unsigned char code tabwe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};/*数码管位选编码,*/unsigned char t,temp;void delaysmg(unsigned int z){        unsigned int x,y;        for(x=0;x<z;x++)                for(y=40;y>0;y--);}smgcode code tab_smg[]={                                                ' ',0x00,                                                '0',0x3f,                                                '1',0x06,                                                '2',0x5b,                                                '3',0x4f,                                                '4',0x66,                                                          '5',0x6d,                                                '6',0x7d,                                                '7',0x07,                                                '8',0x7f,                                                '9',0x6f,                                                'a',0x77,                                                'b',0x7c,                                                'c',0x39,                                                'd',0x5e,                                                'e',0x79,                                                'f',0x71,                                                'A',0x77,                                                'B',0x7c,                                                'C',0x39,                                                'D',0x5e,                                                'E',0x79,                                                'F',0x71                                           };void smg(unsigned char *str){        unsigned char i,j;        for(i=0;i<6;i++)        {                for(j=0;j<22;j++)                        if(tab_smg[j].a==str)                                {                                                P3=tabwe;                                                                P0=tab_smg[j].b;                                                                        delaysmg(5);                        }        }}void main(){        TMOD=0x01;        TH0=(65536-50000)/256;        TL0=(65536-50000)%256;        EA=1;        ET0=1;        TR0=1;         while(1)        {            if(temp%2==0)                smg("111aab");             else                smg("15fc2d");         } }  void T0_SVR() interrupt 1{    TH0=(65536-50000)/256;    TL0=(65536-50000)%256;     t++;    if(t==20)    {        t=0;        temp++;    }}  相信大家看完了第二段代码会有所感想吧,在这种要交替显示很多组无规律数值时,其优势是无可挑剔的。但第二段代码在显示有规律变化的数值时,会比第一种思路复杂些。在编写不同用途的程序时我们可以挑合适的思路来编写程序,这里仅仅以数码管为例。在开发一个项目中,思路很重要,当然与你的经验有较大关系,经验多的工程师在开发一个项目中脑中会有好几种思路,在经验欠缺的初级程序员眼里很可能不知道如何下手,更谈不上思路和算法了。增加经验没有捷径,只有多动手多动脑才会慢慢积累,那么在开发项目时就会得心应手。在以后的项目开发中我们一定要用更简洁更方便的思路将程序简单化而使其功能不变。武汉东方智达科技有限公司     网址:www.east027.com    淘宝网:http://www.east027.taobao.com



Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top