使用Arduino驱动7段LED显示屏的不同方法

电子说

1.3w人已加入

描述

步骤1:

LED显示屏

直接从Arduino/Atmega 328

通过Arduino/Atmega 328的移位寄存器

直接从Arduino/Atmega 328进行直接端口操作

通过Arduino/Atmega 328/按钮计数器的移位寄存器多路复用

通过Arduino/Atmega 328/电位器计数器的移位寄存器多路复用

1-直接从Arduino/Atmega 328

自动从零计数到九,然后重复

代码

///感谢Grumpy Mike http://www.thebox.myzen .co.uk/Tutorial/Arrays.html

//字节内的LED段分配= {DP ABCDEFG}

int引脚[] = {2、3、4、5、6、7、8、9} ;//分配给DP但未使用的引脚9(char tenCode中二进制数组的第一个元素)

int digit [] = {0,1,2,3,4,5,6,7,7,8,9,10 };

int计数器= 0;//将计数器初始化为零

int timer = 1000;//延迟计时器间隔

char tenCode [] = {B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,B01111111,B01111011};

void setup()

{

(int i = 0; i 《8; i ++)//将数字引脚设置为OUTPUTS

pinMode(pins [i],OUTPUT);

}

void loop()

{

for(int j = 0; j 《10; j ++)

{ displayEleven(digit [j]);

delay(timer);

}

}

void displayEleven( int num)

{

int mask = 1; for(int i = 0; i 《8; i ++)

{((mask&tenCode [num])== 0)

digitalWrite(pins [i],LOW);

else digitalWrite(pins [i],HIGH);

mask = mask 《《1;

}

}

步骤2:

LED显示屏

2-通过Arduino/Atmega 328的移位寄存器

从零自动计数到九,然后重复

代码

//字节= {内的LED段分配ABCDEFG DP}

int闩锁Pin = 8;//连接到移位寄存器的引脚12

int dataPin = 11;//连接到移位寄存器的引脚14

int clockPin = 12;////连接到移位寄存器的引脚11

int i = 0;

字节数字[] = {B11111100,B01100000,B11011010,B11110010,B01100110,B10110110,B10111110,

B11100000,B11111110,B11110110};

void setup()

{

pinMode(dataPin,OUTPUT);//将dataPin配置为OUTPUT

pinMode(latchPin,OUTPUT);//将闩锁引脚配置为OUTPUT

pinMode(clockPin,OUTPUT);//将clockPin配置为OUTPUT

}

void loop()

{

for(i = 0; i 《10; i ++)

{

digitalWrite(latchPin,LOW);//将锁存器拉低以开始发送数据

shiftOut(dataPin,clockPin,LSBFIRST,digit [i]);//发送数据

digitalWrite(latchPin,HIGH);//将闩锁拉到高电平以停止发送数据

delay(1000);

}

}

步骤3:

LED显示屏

3-直接从Arduino/Atmega 328直接进行端口操作

从零开始自动计数到9,然后重复

代码

////因为直接端口操作使用引脚0和1,即RX和TX

//分别为引脚,上传代码时必须断开这些引脚

//字节= {DP ABCDEFG}

字节i = 0内的LED段分配;

字节数字[10] = {B01111110,B00110000,B01101101,B01111001,B00110011,B01011011,B01011111,B01110000,B01111111,B01111011};

无效setup()

{

DDRD = B11111111;//将PORTD(数字7〜0)设置为输出

}

void count()

{

for(i = 0; i 《10; i ++)

{

PORTD = digit [i];

delay(1000);

PORTD = 0;

}

}

void loop()

{

count();

}

步骤4:

LED显示屏

4-通过从Arduino/Atmega 328/按钮计数器

按钮在0到8之间递增和递减计数器

代码

//7段LED计数器,使用74HC595 8位移位寄存器多路复用,通过按钮开关将计数器从0递增到8到零

//从这些源代码一起整理代码-感谢法尔斯

//http://www.sweeting.org/mark/blog/2011/11/27/arduino-74hc595-shift-register-and-a-7-segment-led-显示

//http://thecustomgeek.com/2011/06/29/multiplexing-for-a-7-yearold/

const int闩锁Pin = 5;//引脚连接到74HC595的引脚12(锁存器)

const int dataPin = 6;//引脚连接到74HC595的引脚14(数据)

const int clockPin = 7;//引脚连接到74HC595的引脚11(时钟)

int upPin = 12;//按钮连接到引脚12

int downPin = 13;//按钮连接到引脚12

int currUpState = 1;//将currUpState初始化为HIGH

int currDownState = 1;//将currDownState初始化为HIGH

int prevUpState = 0;

int prevDownState = 0;

int counter = 0;//将计数器初始化为零

const字节编号[10] =//用显示段0、1、2、3、4、5、6、7、8、9 《描述每个数字/p》

{

B11111100,

B01100000,

B11011010,

B11110010,

B01100110,

B10110110,

B10111110,

B11100000,

B11111110,

B11100110,

};

void setup()

{

pinMode(latchPin,OUTPUT);//将SR引脚设置为输出

pinMode(clockPin,OUTPUT);

pinMode(dataPin,OUTPUT);

pinMode(upPin,INPUT);//将引脚12设置为按钮输入

pinMode(downPin,INPUT);//将引脚13设置为按钮输入

}

void loop()

{

currUpState = digitalRead(upPin);

if(prevUpState!= currUpState)//状态从

{//从高变为低,反之亦然

prevUpState = currUpState;

if(currUpState == HIGH)//如果按下按钮

counter ++;//将计数器加1

//延迟(1);

}

if(counter》 8)

计数器-= 1;

show(numbers [counter]);//显示当前数字

currDownState = digitalRead(downPin);

如果(prevDownState!= currDownState)//状态从

{//从高到低,反之亦然

prevDownState = currDownState;

if(currDownState == HIGH)//如果按下按钮

counter- = 1 ;//将计数器减1

//delay(1);

}

if(counter 《0)

counter ++ ;

show(numbers [counter]);//显示当前数字

}

void show(字节数)

{

////使用循环和按位AND移至组成

//七段显示的每一位(从左到右,A =》 G),然后检查

//看是否应该

for(int j = 0; j 《= 7; j ++)

{

byte toWrite = number&(B10000000 》》 j );

if(!toWrite){

Continue;

}//如果所有位均为0,则将其写入移位寄存器没有意义,因此

shiftIt(toWrite);继续操作。////否则将其移入寄存器

}

}

void shiftIt(字节数据)

{

digitalWrite(latchPin,LOW);//将这8位时钟输入到寄存器中时将闩锁引脚LOW

for(int k = 0; k 《= 7; k ++)

{

digitalWrite(clockPin,LOW);//ClockPin在发送位之前为低电平

if(data&(1 《

{

digitalWrite(dataPin,HIGH);//打开“

}

else

{

digitalWrite(dataPin,LOW);//将“关闭”

}

digitalWrite(clockPin,HIGH);//并为

}

digitalWrite(clockPin,LOW)中的位提供时钟//停止移出数据

digitalWrite(latchPin,HIGH);//将闩锁Pin设置为高电平以锁定并发送数据

}

步骤5:

LED显示屏

5-通过Arduino/Atmega 328/电位计计数器的移位寄存器多路复用

电位计用于在0到8之间递增和递减计数器

Code

//7段LED计数器,使用74HC595 8位移位寄存器进行多路复用,通过电位计将计数器从0递增为8到0 资料来源-感谢法尔斯

//http://www.sweeting.org/mark/blog/2011/11/27/arduino-74hc595-shift-register-and-a-7-segment-led-display

//http://thecustomgeek.com/2011/06/29/multiplexing-for-a-7-yeard/

const int闩锁Pin = 5;//引脚连接到74HC595的引脚12(锁存器)

const int dataPin = 6;//引脚连接到74HC595的引脚14(数据)

const int clockPin = 7;//引脚连接到74HC595的引脚11(时钟)

int counter = 0;//将计数器初始化为零

int potReading = 0;

const字节编号[10] =//用显示段0、1、2、3、4、5来描述每个数字6,7,8,9

{

B11111100,

B01100000,

B11011010,

B11110010,

B01100110,

B10110110,

B10111110,

B11100000,

B11111110,

B11100110,

};

void setup()

{

pinMode(latchPin,OUTPUT);//将SR引脚设置为输出

pinMode(clockPin,OUTPUT);

pinMode(dataPin,OUTPUT);

}

void loop()

{

potReading =模拟读取(A0);

potReading = map(potReading,0,1023,0,8);

{

if(potReading》 8)

potReading-;

show(numbers [potReading]);

}

{

if(potReading 《0)

potReading ++;

show(numbers [potReading] );

}

}

void show(字节数)

{

//使用循环和按位AND移至使向上

//七段显示(从左到右,A =》 G),然后检查

//是否应打开

for(int j = 0; j 《= 7; j ++)

{

要写入的字节=数字&(B10000000 》》 j);

if(!toWrite){

continue;

}//如果全部位为0,则无意义将其写入移位寄存器,因此请中断并继续执行下一段。

shiftIt(toWrite);//否则将其移入寄存器

}

}

void shiftIt(字节数据)

{

digitalWrite(latchPin,LOW);//将这8位时钟输入到寄存器

时将闩锁引脚LOW设置为(int k = 0; k 《= 7; k ++)

{

digitalWrite(clockPin,LOW);//ClockPin在发送位之前为低电平

////请注意,在我们的示例中,对于

//“ On”,我们需要将pinState设置为0(LOW),因为74HC595吸收电流时使用常见的

//阳极显示器。如果要使用公共阴极显示器,则

//将其切换。

if(data&(1 《 {

digitalWrite(dataPin,HIGH);//打开“

}

else

{

digitalWrite(dataPin,LOW);//关闭“

}

digitalWrite(clockPin,HIGH);//并时钟

}

digitalWrite(clockPin,LOW);中的位//停止移出数据

digitalWrite(latchPin,HIGH);//将闩锁Pin设置为高电平以锁定并发送数据

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分