当前位置:   article > 正文

单片机——数码管显示_单片机数码管

单片机数码管

数码管介绍

LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件

一位数码管

八段LED各有名字,八位

引脚定义;和下图序号相对应

 阴极连接在同一个端口上——阴极连接

 

 我们单片机上的数码管引脚连接方式是阴极连接,假使要在数码管上显示数字6,公共端(即阴极)需要接地 (数据0或者低电平),负极选中(位选)

 如图需要点亮A,F,G,E,C,D才会让数码管显示为数字6,则需要分别给对应的阳极引脚高电平 。

则可以得出段码:1011 1110(即引脚对应数据)

 阳极连接在一起——阳极连接

阳极连接则需要把共阳极连接到高电平端(VCC),则想要LED亮则需要在对应引脚接入数据0,

则可得出显示6的段码为:0100 0001

四位一体数码管

 

 

 类似的上图的图一是阴极连接,每个四位一体数码管分成四个一位数码管,且这四个A与A连接,B与B连接,以此类推。

假使要让四位一体数码管在第三个一位数码管上显示数字1,该如何操作?

拿阴极连接作为例子,因为只需要其中的第三个一位数码管显示数字,则第三个一位数码管位选(即阴极)输入数据0,其他的为1;再对其阳极进行讨论,要显示为1,即BC亮,因为阴极接的是低电平,则BC对应的引脚应该输入高电平,接入数据1,即7,4给1,得出段码:0110 0000;

注意:共用引脚的结果:在同一个时刻,只能有一个一位数码管被选中,即使选中多个,也是只能显示相同的数字。好处是:节省空间,方便操作。

138译码器:

可以通过控制三个端口来控制八个端口的其中一个端口输出1,

引脚介绍:

 A,B,C:输入端,高位到低位依次是是C-B-A

Y0 ~Y7:输出端

VCC:电源正极

GND:电源负极

G1,G2A,G2B:使能端,当G1接高电平,G2A,G2B接低电平时,才能正常工作。

工作原理:

输入端CBA输入000时,对应着0,对应着Y0;输入001时,对应1,对应着Y1......以此类推,可以通过控制三个引脚的输入来控制八个引脚中其中一个输出1(节省L口)。注意:八个引脚是低电平有效,即当输入端输入000时,输出端是0111 1111,Y0有效;输入端输入101时,输出端是1111 01111。

低电平驱动能力强,高电平驱动能力弱。

静态数码管显示

目标:实现在第三个一位数码管上显示数字6

操作如下

1、需要通过138译码器选中LED6

     引脚P22,P23,P24在代码中分别对应P2_4,P2_3,P2_2。要选中Y5输出端,LED6,则需要CBA输入端输入101。

 2、要显示数字6,对应LED要激活afgedc。

        因为四位一体数码管是阳极连接,则需要激活的要输入1,反之则输入0;注意:从高位到低位依次是P07~P06~P05.......,其分别对应dp,g,f,e,d,c,b,a,则可得出段码:0111 1101。转换成16进制——0x7D;

得出代码:

  1. #include <REGX52.H>
  2. void main(void)
  3. {
  4. //分别对应138译码器的CBA输入端
  5. P2_4 = 1;//C
  6. P2_3 = 0;//B
  7. P2_2 = 1;//A
  8. //CBA输入101,选中输出端Y5
  9. P0 = 0x7D;
  10. while(1)
  11. {
  12. }
  13. }
可以通过函数和数组来改善代码

 首先有:

 通过Switch函数快捷判断需要在哪个一体数码管上显示数字,再通过数组实现显示的数字

优化代码:

  1. #include <REGX52.H>
  2. unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  3. void Nixie(unsigned char Location, Number)
  4. {
  5. switch(Location)
  6. {
  7. case 1: P2_4=1;P2_3=1;P2_2=1;break;
  8. case 2: P2_4=1;P2_3=1;P2_2=0;break;
  9. case 3: P2_4=1;P2_3=0;P2_2=1;break;
  10. case 4: P2_4=1;P2_3=0;P2_2=0;break;
  11. case 5: P2_4=0;P2_3=1;P2_2=1;break;
  12. case 6: P2_4=0;P2_3=1;P2_2=0;break;
  13. case 7: P2_4=0;P2_3=0;P2_2=1;break;
  14. case 8: P2_4=0;P2_3=0;P2_2=0;break;
  15. }
  16. P0 = NixieTable[Number];
  17. }
  18. void main(void)
  19. {
  20. Nixie(6,4);
  21. while(1)
  22. {
  23. }
  24. }

动态数码管显示

直接让静态数码管显示多个任务同时执行

  1. #include <REGX52.H>
  2. #include <INTRINS.H>
  3. void Nixie(unsigned char Location, Number);
  4. unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  5. void Nixie(unsigned char Location, Number)
  6. {
  7. switch(Location)
  8. {
  9. case 1: P2_4=1;P2_3=1;P2_2=1;break;
  10. case 2: P2_4=1;P2_3=1;P2_2=0;break;
  11. case 3: P2_4=1;P2_3=0;P2_2=1;break;
  12. case 4: P2_4=1;P2_3=0;P2_2=0;break;
  13. case 5: P2_4=0;P2_3=1;P2_2=1;break;
  14. case 6: P2_4=0;P2_3=1;P2_2=0;break;
  15. case 7: P2_4=0;P2_3=0;P2_2=1;break;
  16. case 8: P2_4=0;P2_3=0;P2_2=0;break;
  17. }
  18. P0 = NixieTable[Number];
  19. }
  20. void main(void)
  21. {
  22. while(1)
  23. {
  24. Nixie(1,1);
  25. Nixie(2,2);
  26. Nixie(3,3);
  27. Nixie(4,1);
  28. }
  29. }

但是此时会出现bug,数字错乱显示在数码管上,如下图所示:

 这就涉及到消隐过程。

消隐

数码管显示过程:位选——段选——位选——段选——位选——段选——.......

因为单片机的速度很快,在下一位数据还没出来时,上一位的数据会被串到下一位数据上,导致数据串位。

要解决这个问题,需要在每次段选之后清零,这样上一位数据对下一位数据就不会产生影响。

  1. #include <REGX52.H>
  2. #include <INTRINS.H>
  3. void Nixie(unsigned char Location, Number);
  4. void Delay(unsigned int xms);
  5. unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
  6. void Delay(unsigned int xms)
  7. {
  8. unsigned char i, j;
  9. while(xms)
  10. {
  11. _nop_();
  12. i = 2;
  13. j = 199;
  14. do
  15. {
  16. while (--j);
  17. } while (--i);
  18. xms--;
  19. }
  20. }
  21. void Nixie(unsigned char Location, Number)
  22. {
  23. switch(Location)
  24. {
  25. case 1: P2_4=1;P2_3=1;P2_2=1;break;
  26. case 2: P2_4=1;P2_3=1;P2_2=0;break;
  27. case 3: P2_4=1;P2_3=0;P2_2=1;break;
  28. case 4: P2_4=1;P2_3=0;P2_2=0;break;
  29. case 5: P2_4=0;P2_3=1;P2_2=1;break;
  30. case 6: P2_4=0;P2_3=1;P2_2=0;break;
  31. case 7: P2_4=0;P2_3=0;P2_2=1;break;
  32. case 8: P2_4=0;P2_3=0;P2_2=0;break;
  33. }
  34. P0 = NixieTable[Number];
  35. Delay(1);
  36. P0 = 0x00;
  37. }
  38. void main(void)
  39. {
  40. while(1)
  41. {
  42. Nixie(1,1);
  43. Nixie(2,2);
  44. Nixie(3,3);
  45. Nixie(4,1);
  46. }
  47. }

数码管数码管驱动

 单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间。

专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。

 TM1640:

只需两根线就可以控制16个数码管显示任意数字

74AC595

 

 只需三根线即可控制八个数码管。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/408767
推荐阅读
相关标签
  

闽ICP备14008679号