数码管显示模板

来源:互联网 发布:c语言strcpy函数实现 编辑:程序博客网 时间:2024/05/21 11:35

一:数码管介绍

数码管其实就是8个发光二极管构成8个段,把所有负极接一起称为共阴,同理有共阳数码管。

通过对非公共端的单独操作可实现点亮具体某一段,从而实现数字或字符的显示。


上图中a为共阴,b为共阳

多位数码管是将每位数码管的公共端引出作为位选引脚,将不同位的同一段接在一起,最终形成的引脚有8个段引脚和n个位引脚(n为数码管位数)

假设段为x坐标,位为y坐标,通过x,y的值可映射到多位数码管中的具体某一段,对其操作便可实现数字或折服的显示。


二:具体显示方法

由上面讲解可知,要让一位数码管显示数字或者字符,必须向其各段输入高低电平,如果将8各段接在一个8位寄存器(P1)

只需向此寄存器输入一个二位十六进制数即可。

共阴数码管码表

   0x3f  , 0x06 , 0x5b , 0x4f ,0x66 , 0x6d ,
   0           1          2         3       4         5
   0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c ,
   6           7          8         9       A        B
   0x39 , 0x5e , 0x79 , 0x71 , 0x00
   C           D         E         F       无显示
实际操作中,定义一个数组即可
unsigned char Digit[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};

四:显示实例

1:硬件连接

      将四位共阴数码管的8个段选通过锁存器接在一组P0口(记得加10K上拉电阻),4个位选通过锁存器接在P0口,形成段选锁存器及位选锁存器,两个锁存器的LE端接在其他IO引脚上,硬件连接便算完成。
      需要操作的寄存器为:   P0(对锁存器进行数据输入用)  ,2个IO引脚(控制段选锁存器,或位选锁存器)
      PS:锁存器不熟悉的请移步至:http://blog.csdn.net/metalseed/article/details/8259255

2:静态显示

(让数码管静态显示一个具体字符)

       
#include<reg52.h>sbit duan = P2^6;sbit wei = P2^7;void main(){wei = 1;      /*对位锁存器送数据,实现要点亮的数码位的选定*/P0 = 0xc0;wei = 0;duan = 1;     /*对段锁存器送数据,实现选定位的数码显示*/P0 = 0x06;duan = 0;while(1);}

3:动态扫描

由上所述,所有位的段接在一起(大大简化了硬件电路),要实现不同位显示不同字符就比较纠结了TvT  不过,既然敢这么接,必然有解决方案。
原理:如果我们要让四位数码管显示1,2,3,4; 
可如下操作:先让第一位显示1,然后让第二位显示2,再让第三位显示3··  快速循环,由于单片机的工作周期比人眼视觉暂留短的多,所以如此操作人眼便可清晰的看到数码管显示的是1,2,3,4  ^_^   由于是动态扫,所以称其动态扫描法。(其中涉及到消影等细节,自己研究吧少年~)

#include<reg52.h>            sbit duan = P2^6;      sbit wei  = P2^7;            unsigned char code digit[]={      0x3f, 0x06, 0x5b, 0x4f,      0x66, 0x6d, 0x7d, 0x07,      0x7f, 0x6f, 0x77, 0x7c,      0x39, 0x5e, 0x79, 0x71};            void delay(uint z);      void main()      {          int num;           while(1)          {              for(num=0;num<4;num++)                  {                     P0  = 0xff; /*消影*/                   wei = 1;   /*位选定*/                      P0  = 0xff - (1 << num);                      wei = 0;                                        P0   = 0x00; /*消影*/                     duan = 1;   /*段点亮*/                      P0   = digit[num + 1];                      duan = 0;                           }          }      }            void delay(int z)      {          int x, y;          for(x = z; x; --x)              for(y = 110; y; --y);         }  




原创粉丝点击