0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

454398 来源:wv 2019-10-10 14:40 次阅读

步骤1:

使用Arduino驱动7段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:

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:

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:

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:

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设置为高电平以锁定并发送数据

}

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

    关注

    34

    文章

    1691

    浏览量

    97933
  • Arduino
    +关注

    关注

    184

    文章

    6425

    浏览量

    184775
收藏 人收藏

    评论

    相关推荐

    LED显示屏设计方案

    1、LED显示屏基础知识2、LED显示屏设计要素3、LED显示屏
    发表于 04-03 17:21 0次下载

    商场LED显示屏展示商品的一大亮点 商显大商场专用大就是好

    LED显示屏
    LED显示屏生产厂家
    发布于 :2024年03月10日 20:02:06

    家庭影院LED显示屏,装饰温暖美丽的家

    LED显示屏
    LED显示屏生产厂家
    发布于 :2024年03月10日 20:00:02

    商场外墙户外P5LED显示屏# P5LED显示屏# 商场LED显示屏# 广场LED显示屏# 小区LED显示屏

    LED显示屏
    LED显示屏生产厂家
    发布于 :2024年01月16日 20:24:01

    酒店会议室LED显示屏P2#酒店LED显示屏# P2LED显示屏# 会议室LED显示屏

    LED显示屏
    LED显示屏生产厂家
    发布于 :2024年01月16日 20:19:32

    LED创意LED异形LED异形显示屏定制【联诚发】#

    led显示屏
    联诚发
    发布于 :2023年10月09日 18:05:11

    户外全彩LED广告LED广告显示屏【#

    LED显示屏
    联诚发
    发布于 :2023年10月09日 17:17:00

    直径4米无边圆形圆饼圆面圆盘平面圆LED显示屏及各种定制异形创意LED显示屏

    ledLED显示屏
    晶锐创显JRCLED
    发布于 :2023年08月17日 09:09:15

    直径4米无边圆形圆饼圆面圆盘平面圆LED显示屏及各种定制异形创意LED显示屏

    ledLED显示屏
    晶锐创显JRCLED
    发布于 :2023年08月16日 19:14:10

    #LED显示屏 #数字展厅 #显示科技 #上热门?

    LED显示屏
    jf_95600885
    发布于 :2023年07月06日 11:09:05

    TM1637 LED显示屏上的Arduino显示温度

    电子发烧友网站提供《TM1637 LED显示屏上的Arduino显示温度.zip》资料免费下载
    发表于 06-28 15:47 0次下载
    TM1637 <b class='flag-5'>LED</b><b class='flag-5'>显示屏</b>上的<b class='flag-5'>Arduino</b><b class='flag-5'>显示</b>温度

    带I2C的Arduino 26x2 LED显示屏

    电子发烧友网站提供《带I2C的Arduino 26x2 LED显示屏.zip》资料免费下载
    发表于 06-09 15:21 0次下载
    带I2C的<b class='flag-5'>Arduino</b> 26x2 <b class='flag-5'>LED</b><b class='flag-5'>显示屏</b>

    带3D立体透视效果的圆柱体LED显示屏

    LED显示屏
    深圳恒彩光电LED显示屏
    发布于 :2023年05月22日 15:30:24