赞
踩
LED数码管:数码管是一种简单、廉价的显示器,是由多个发光二极管封装在一起组成“8”字型的器件
八段LED各有名字,八位
引脚定义;和下图序号相对应
我们单片机上的数码管引脚连接方式是阴极连接,假使要在数码管上显示数字6,公共端(即阴极)需要接地 (数据0或者低电平),负极选中(位选)
如图需要点亮A,F,G,E,C,D才会让数码管显示为数字6,则需要分别给对应的阳极引脚高电平 。
则可以得出段码:1011 1110(即引脚对应数据)
阳极连接则需要把共阳极连接到高电平端(VCC),则想要LED亮则需要在对应引脚接入数据0,
则可得出显示6的段码为:0100 0001
类似的上图的图一是阴极连接,每个四位一体数码管分成四个一位数码管,且这四个A与A连接,B与B连接,以此类推。
拿阴极连接作为例子,因为只需要其中的第三个一位数码管显示数字,则第三个一位数码管位选(即阴极)输入数据0,其他的为1;再对其阳极进行讨论,要显示为1,即BC亮,因为阴极接的是低电平,则BC对应的引脚应该输入高电平,接入数据1,即7,4给1,得出段码:0110 0000;
注意:共用引脚的结果:在同一个时刻,只能有一个一位数码管被选中,即使选中多个,也是只能显示相同的数字。好处是:节省空间,方便操作。
可以通过控制三个端口来控制八个端口的其中一个端口输出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
引脚P22,P23,P24在代码中分别对应P2_4,P2_3,P2_2。要选中Y5输出端,LED6,则需要CBA输入端输入101。
因为四位一体数码管是阳极连接,则需要激活的要输入1,反之则输入0;注意:从高位到低位依次是P07~P06~P05.......,其分别对应dp,g,f,e,d,c,b,a,则可得出段码:0111 1101。转换成16进制——0x7D;
得出代码:
- #include <REGX52.H>
-
- void main(void)
- {
- //分别对应138译码器的CBA输入端
- P2_4 = 1;//C
- P2_3 = 0;//B
- P2_2 = 1;//A
- //CBA输入101,选中输出端Y5
-
-
- P0 = 0x7D;
- while(1)
- {
-
- }
-
- }
首先有:
通过Switch函数快捷判断需要在哪个一体数码管上显示数字,再通过数组实现显示的数字
优化代码:
- #include <REGX52.H>
-
- unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
-
- void Nixie(unsigned char Location, Number)
- {
- switch(Location)
- {
- case 1: P2_4=1;P2_3=1;P2_2=1;break;
- case 2: P2_4=1;P2_3=1;P2_2=0;break;
- case 3: P2_4=1;P2_3=0;P2_2=1;break;
- case 4: P2_4=1;P2_3=0;P2_2=0;break;
- case 5: P2_4=0;P2_3=1;P2_2=1;break;
- case 6: P2_4=0;P2_3=1;P2_2=0;break;
- case 7: P2_4=0;P2_3=0;P2_2=1;break;
- case 8: P2_4=0;P2_3=0;P2_2=0;break;
- }
- P0 = NixieTable[Number];
- }
-
- void main(void)
- {
- Nixie(6,4);
- while(1)
- {
-
- }
-
- }
直接让静态数码管显示多个任务同时执行
- #include <REGX52.H>
- #include <INTRINS.H>
-
- void Nixie(unsigned char Location, Number);
-
-
- unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
-
-
-
- void Nixie(unsigned char Location, Number)
- {
- switch(Location)
- {
- case 1: P2_4=1;P2_3=1;P2_2=1;break;
- case 2: P2_4=1;P2_3=1;P2_2=0;break;
- case 3: P2_4=1;P2_3=0;P2_2=1;break;
- case 4: P2_4=1;P2_3=0;P2_2=0;break;
- case 5: P2_4=0;P2_3=1;P2_2=1;break;
- case 6: P2_4=0;P2_3=1;P2_2=0;break;
- case 7: P2_4=0;P2_3=0;P2_2=1;break;
- case 8: P2_4=0;P2_3=0;P2_2=0;break;
- }
- P0 = NixieTable[Number];
- }
-
- void main(void)
- {
-
- while(1)
- {
- Nixie(1,1);
- Nixie(2,2);
- Nixie(3,3);
- Nixie(4,1);
- }
-
- }
但是此时会出现bug,数字错乱显示在数码管上,如下图所示:
这就涉及到消隐过程。
数码管显示过程:位选——段选——位选——段选——位选——段选——.......
因为单片机的速度很快,在下一位数据还没出来时,上一位的数据会被串到下一位数据上,导致数据串位。
要解决这个问题,需要在每次段选之后清零,这样上一位数据对下一位数据就不会产生影响。
- #include <REGX52.H>
- #include <INTRINS.H>
-
- void Nixie(unsigned char Location, Number);
- void Delay(unsigned int xms);
-
- unsigned char NixieTable[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
-
- void Delay(unsigned int xms)
- {
- unsigned char i, j;
- while(xms)
- {
- _nop_();
- i = 2;
- j = 199;
- do
- {
- while (--j);
- } while (--i);
- xms--;
- }
-
- }
-
- void Nixie(unsigned char Location, Number)
- {
- switch(Location)
- {
- case 1: P2_4=1;P2_3=1;P2_2=1;break;
- case 2: P2_4=1;P2_3=1;P2_2=0;break;
- case 3: P2_4=1;P2_3=0;P2_2=1;break;
- case 4: P2_4=1;P2_3=0;P2_2=0;break;
- case 5: P2_4=0;P2_3=1;P2_2=1;break;
- case 6: P2_4=0;P2_3=1;P2_2=0;break;
- case 7: P2_4=0;P2_3=0;P2_2=1;break;
- case 8: P2_4=0;P2_3=0;P2_2=0;break;
- }
- P0 = NixieTable[Number];
- Delay(1);
- P0 = 0x00;
- }
-
- void main(void)
- {
-
- while(1)
- {
- Nixie(1,1);
- Nixie(2,2);
- Nixie(3,3);
- Nixie(4,1);
- }
-
- }
•单片机直接扫描:硬件设备简单,但会耗费大量的单片机CPU时间。
•专用驱动芯片:内部自带显存、扫描电路,单片机只需告诉它显示什么即可。
TM1640:
只需两根线就可以控制16个数码管显示任意数字
74AC595
只需三根线即可控制八个数码管。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。