数码管abcdefg对应 您所在的位置:网站首页 数码管abcdefg对应 数码管abcdefg对应

数码管abcdefg对应

2024-06-24 03:39| 来源: 网络整理| 查看: 265

数码管详细总结

一、数码管电路1、单个数码管2、多个数码管3、数码管与芯片的连接3.1 为什么要使用锁存器?3.2 锁存器的电路连接

二、数码管显示数字时芯片引脚的状态值三、数码管实现动态显示1、一个数码管从0到F动态显示2、多个数码管从0到F动态显示3、一个经典例子

一、数码管电路

1、单个数码管

一个数码管是由a、b、c、d、e、f、g、dp八个二极管组成,八个LED一端接在一起,另一端引脚引出来。二极管如果阳极连在一起,就是共阳极数码管,阴极连在一起,就是共阴极数码管。

如上图,是一个共阴极数码管,要使数码管显示不同的数字,只需点亮对应LED即可。如:数码管显示“0”,则a、b、c、d、e、f六个LED亮,g、dp这俩个LED灭,即可显示“0”。

2、多个数码管

上图所示的六个数码管,在使用时,需要程序选定使用哪几个数码管,这就是“位选”,选定数码管后再对选定的数码管进行操作,其操作与单个数码管的操作一致(接下来还会进一步详解),这就是“段选”。

3、数码管与芯片的连接

3.1 为什么要使用锁存器?

二极管正常工作时需要5mA以上的电流,若数码管引脚和芯片引脚直接相连,芯片的I/O口无法输出这么大的电流,对于共阴极的数码管,可以在阳极处接上拉电阻,对于共阳极的数码管,可以在阴极处接下拉电阻,但是也使得“位选”需做另外的处理。

引入锁存器,利用其输出电流大的特点,有效的解决了LED工作电流问题,而且还可以利用锁存器进行“位选”、“段选”。

3.2 锁存器的电路连接

上图所示,连接俩块锁存器,U1控制段选,U2控制位选,锁存器我们在博客(一)中做过总结,现再回顾一下 根据电路图,OE始终接地,所以锁存器工作状态只有前三种,当LE软件置1时,锁存器的输入端D与输出端Q同高电平,同低电平,当LE软件置0时,锁存器输出为Q0。

由电路图可得,电路连接为:

单片机的芯片引脚P00—>P07分别接U1锁存器的D0——>D7,单片机的芯片引脚P00—>P07分别接U2锁存器的D0——>D7,也就是说U1、U2俩锁存器都与P0相连,所以在数码管工作状态下,俩个锁存器不能同时处于打开状态,即俩个锁存器的LE不能同时为高电平。锁存器U1的输出接数码管的LED阳极,锁存器U2的输出接数码管的WE,控制“数码管选择”。

锁存器U2控制位选,U2打开时,U1关闭,此时U2的输入和输出同高、同低电平。如下图,若使用数码管1,则只需D0置0,其他引脚置1,即芯片P00输出为0,P01——>P07输出为1,即P0寄存器的状态值为0xfe(上面低位,从下往上读)

锁存器U1控制段选,如刚刚位选了数码管1,则接下来段选是对数码管1的操作。此时关闭U2,打开U1,即U2的LE软件置0,U1的LE软件置1,而U2的LE与芯片的P27相连,U1的LE与芯片的P26相连(下图所示),所以只需使芯片的P27输出低电平来关闭U2锁存器,P26输出高电平来打开U1锁存器。

打开U1锁存器后,使数码管显示某个数字,我们在第一节中总结过了,比如显示一个数字“6”,需要a、c、d、e、f、g六个LED亮,所以锁存器输出01111101(共阴极数码管。输出1时点亮),即P0寄存器输出01111101,P0寄存器的状态值为0x7d。

第一个数码管显示数字“6”的程序如下:

#include

sbit dula=P2^6;

sbit wela=P2^7;

void main()

{

wela=1;

P0=0xfe;//位选第一个数码管

wela=0;

dula=1;

P0=0x7d;

dula=0;

while(1);

}

分析上面程序:

首先对连接U1、U2锁存器LE的芯片引脚P26与P27进行位操作,重命名为“dula”与“wela”,表示“段选”和“位选”。主函数里,先打开位选:wela=1,选择第一个数码管,则U2锁存器输入和输出均为11111110(从下往上),P0的输出也为11111110,即0xfe,位选结束后关闭位选:wela=0。

接下来打开段选:dula=1,对第一个数码管操作,显示数字“6”,U1锁存器输入输出均为01111101,即P0输出为01111101,即P0的状态值为0x7d。最后关闭段选。

注: 正因为锁存器U1与U2同时接在芯片的P0引脚上,所以俩个锁存器不能同时打开,否则芯片引脚P0输出的状态值会在U1和U2上同时发生响应,造成紊乱。

二、数码管显示数字时芯片引脚的状态值

显示数字“0”,abcdef亮,状态值00111111——>0x3f 显示数字“1”,bc亮,状态值00000110——>0x06 显示数字“2”,abdeg亮,状态值01011011——>0x5b 显示数字“3”,abcdg亮,状态值01001111——>0x4f 显示数字“4”,bcfg亮,状态值01100110——>0x66 显示数字“5”,acdfg亮,状态值01101101——>0x6d 显示数字“6”,acdefg亮,状态值01111101——>0x7d 显示数字“7”,abc亮,状态值00000111——>0x07 显示数字“8”,abcdefg亮,状态值01111111——>0x7f 显示数字“9”,abcdfg亮,状态值01101111——>0x6f 显示字母“A”,abcefg亮,状态值01110111——>0x77 显示字母“B”,cdefg亮,状态值01111100——>0x7c 显示字母“C”,adef亮,状态值00111001——>0x39 显示字母“D”,bcdeg亮,状态值01011110——>0x5e 显示字母“E”,adefg亮,状态值01111001——>0x79 显示字母“F”,aefg亮,状态值01110001——>0x71

在编写程序时将上述状态值放入数组中,通过数组来实现数码管的动态显示。

放在如下数组中:

#define uchar unsigned char

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

}

在table数组名前加了code,表示编码的意思,单片机程序把不需要更改的东西通过code关键字定义为编码,单片机执行程序时,table只占用程序存储空间,可以理解为占用flash,而不占用RAM。

三、数码管实现动态显示

1、一个数码管从0到F动态显示

#include

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

uchar num;

sbit dula=P2^6;

sbit wela=P2^7;

void delay_ms(uint );

void main()

{

wela=1;

P0=0xfe;

wela=0;

while(1)

{

for(num=0;num

{

dula=1;

P0=table[num];

dula=0;

delay_ms(500);

}

}

}

void delay_ms(uint ms)

{

uint i,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

此时第一个数码管从0变化到F,之后停止不动。

若使数码管从0到F反复变化,只需在while()语句里添加如下代码:

if(num==16)

num=0;

完整程序:

#include

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

uchar num;

sbit dula=P2^6;

sbit wela=P2^7;

void delay_ms(uint );

void main()

{

wela=1;

P0=0xfe;

wela=0;

while(1)

{

for(num=0;num

{

dula=1;

P0=table[num];

dula=0;

delay_ms(500);

}

//------------新加

if(num==16)

num=0;

//----------------

}

}

void delay_ms(uint ms)

{

uint i,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

2、多个数码管从0到F动态显示

与之前的一个数码管比较,多个数码管的动态显示只需改变位选时P0的输出,如六个数码管同时显示,则P0输出11000000,即0xc0

位选代码:

wela=1;

P0=0xc0;

wela=0;

完整代码:

//六个数码管从0到F循环动态显示

#include

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

uchar num;

sbit dula=P2^6;

sbit wela=P2^7;

void delay_ms(uint );

void main()

{

wela=1;

P0=0xc0;

wela=0;

while(1)

{

for(num=0;num

{

dula=1;

P0=table[num];

dula=0;

delay_ms(500);

}

if(num==16)

num=0;

}

}

void delay_ms(uint ms)

{

uint i,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

3、一个经典例子

题: 六个数码管,第一个数码管显示数字“1”,间隔1秒后再在第二个数码管上显示数字“2”,间隔1s后在第三个数码管上显示数字“3”,以此类推…在第六个数码管上显示数字“6”

分析: 六个数码管轮流显示,所以位选时依次选择数码管1、2…6,每次位选后,再段选输出需要显示的数字。

第一个数码管位选:

wela=1;

P0=0xfe;//第一个数码管

wela=0;

第一个数码管段选输出数字“1”:

dula=1;

P0=table[1];

dula=0;

delay_ms(1000);

位选时P0的输出之前已经总结过了,再回忆一下,如下图,从左到右分别为数码管1、2、3、4…从下往上读,得到8位二进制码,变为16进制即可。 完整程序:

#include

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

uchar num;

sbit dula=P2^6;

sbit wela=P2^7;

void delay_ms(uint );

void main()

{

while(1)

{

wela=1;

P0=0xfe;//第一个数码管

wela=0;

dula=1;

P0=table[1];

dula=0;

delay_ms(1000);

wela=1;

P0=0xfd;//第二个数码管

wela=0;

dula=1;

P0=table[2];

dula=0;

delay_ms(1000);

wela=1;

P0=0xfb;//第三个数码管

wela=0;

dula=1;

P0=table[3];

dula=0;

delay_ms(1000);

wela=1;

P0=0xf7;//第四个数码管

wela=0;

dula=1;

P0=table[4];

dula=0;

delay_ms(1000);

wela=1;

P0=0xef;//第五个数码管

wela=0;

dula=1;

P0=table[5];

dula=0;

delay_ms(1000);

wela=1;

P0=0xdf;//第六个数码管

wela=0;

dula=1;

P0=table[6];

dula=0;

delay_ms(1000);

}

}

void delay_ms(uint ms)

{

uint i,j;

for(i=ms;i>0;i--)

for(j=110;j>0;j--);

}

abcdefg———>由低位到高位? ? ?例如:二进制1110 0000对应的gfedcba? ? ?

低电频(0)亮? ? ? ? ? ? ? 高电频(1)灭 ?

Arduino Uno - 控制4位8段共阴极数码管 显示数字

2021/1/28

原理图

1位8段共阴极数码管 abcdefg. 分别是8段引脚

图1图2图3 4位8段共阴极数码管 abcdefg. 分别是8段引脚 1 2 3 4是对应哪一位数码管

图1图2图3

代码

//1位8段共阴数码管引脚图

//g f cc a b

//e d cc c dp

//4位8段共阴数码管引脚图

//1 a f 2 3 b

//e d dp c g 4

//abcdefg. 分别是8段引脚

int a = 1;

int b = 2;

int c = 3;

int d = 5;

int e = 6;

int f = 7;

int g = 8;

int dp = 13;

//“1 2 3 4”是对应哪一位数码管

int d1 = 9;

int d2 = 10;

int d3 = 11;

int d4 = 12;

void setup() {

// put your setup code here, to run once:

pinMode(a, OUTPUT);

pinMode(b, OUTPUT);

pinMode(c, OUTPUT);

pinMode(d, OUTPUT);

pinMode(e, OUTPUT);

pinMode(f, OUTPUT);

pinMode(g, OUTPUT);

pinMode(dp, OUTPUT);

pinMode(d1, OUTPUT);

pinMode(d2, OUTPUT);

pinMode(d3, OUTPUT);

pinMode(d4, OUTPUT);

}

int number = 0;

void loop() {

int cc = 0;

while(cc

{

Display(1, number % 10000 / 1000);

Display(2, number % 1000 / 100);

Display(3, number % 100 / 10);

Display(4, number % 10 / 1);

cc++;

}

number++;

}

//x为坐标 Number为数字

void Display(unsigned char x, unsigned char Number)

{

SetPosition(x);

SetNumber(Number);

delay(1);

Clear();

}

//1-2-3-4哪个位置数码管

void SetPosition(unsigned char n)

{

switch(n)

{

case 1:

digitalWrite(d1, LOW);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 2:

digitalWrite(d1, HIGH);

digitalWrite(d2, LOW);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

case 3:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, LOW);

digitalWrite(d4, HIGH);

break;

case 4:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, LOW);

break;

default:

digitalWrite(d1, HIGH);

digitalWrite(d2, HIGH);

digitalWrite(d3, HIGH);

digitalWrite(d4, HIGH);

break;

}

}

//选数

void SetNumber(unsigned char n)

{

switch(n)

{

case 0:

Num_0();

break;

case 1:

Num_1();

break;

case 2:

Num_2();

break;

case 3:

Num_3();

break;

case 4:

Num_4();

break;

case 5:

Num_5();

break;

case 6:

Num_6();

break;

case 7:

Num_7();

break;

case 8:

Num_8();

break;

case 9:

Num_9();

break;

default:

Clear();

break;

}

}

//清屏

void Clear()

{

digitalWrite(a, LOW);

digitalWrite(b, LOW);

digitalWrite(c, LOW);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_0()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_1()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_2()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, LOW);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_3()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_4()

{

digitalWrite(a, LOW);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_5()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_6()

{

digitalWrite(a, HIGH);

digitalWrite(b, LOW);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_7()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, LOW);

digitalWrite(e, LOW);

digitalWrite(f, LOW);

digitalWrite(g, LOW);

digitalWrite(dp, LOW);

}

void Num_8()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, HIGH);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

void Num_9()

{

digitalWrite(a, HIGH);

digitalWrite(b, HIGH);

digitalWrite(c, HIGH);

digitalWrite(d, HIGH);

digitalWrite(e, LOW);

digitalWrite(f, HIGH);

digitalWrite(g, HIGH);

digitalWrite(dp, LOW);

}

效果图

代码烧录到板子上,程序运行后,数字会从0000显示累加1,0001,0002,···,9999这样



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有