极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19946|回复: 2

用arduino和2个74HC595级联控制8位数码管显示

[复制链接]
发表于 2015-8-3 12:45:14 | 显示全部楼层 |阅读模式
初学者打出来的代码,可能不“美观”,希望大家点评,多多留下意见,话不多说上代码……


下面为8位数码管全部显示
#include "Arduino.h"
void set(int x);
void setup();
void loop();
void shu();
int SH_CP = 12;  //595_SH_CP/11   存储寄存器   
int DS = 13;  //595_DS/14      移位寄存器
int ST_CP = 11;  //595_ST_CP/12   串行数据输入端   
int OE = 10;    //595_OE/13      输出使能端
int MR = 9;  //595_MR/10      芯片复位端

/*数码管段选*/
int a[10][8]={0,0,1,1,1,1,1,1,    //0
                    0,0,0,0,0,1,1,0,    //1   
                    0,1,0,1,1,0,1,1,    //2
                    0,1,0,0,1,1,1,1,    //3
                    0,1,1,0,0,1,1,0,    //4
                    0,1,1,0,1,1,0,1,    //5
                    0,1,1,1,1,1,0,1,    //6
                    0,0,0,0,0,1,1,1,    //7
                    0,1,1,1,1,1,1,1,    //8
                    0,1,1,0,0,1,1,1,};  //9

/*共阴极数码管位选*/
int b[8][8]={1,1,1,1,1,1,1,0,    //0
                   1,1,1,1,1,1,0,1,    //1   
                   1,1,1,1,1,0,1,1,    //2
                   1,1,1,1,0,1,1,1,    //3
                   1,1,1,0,1,1,1,1,    //4
                   1,1,0,1,1,1,1,1,    //5
                   1,0,1,1,1,1,1,1,    //6
                   0,1,1,1,1,1,1,1,    //7
              };
int data;
int j;

void set(int x)
{
      if(x==0)digitalWrite(DS,LOW);  
      else digitalWrite(DS,HIGH);
}

void setup() {
                                                   
              pinMode(SH_CP,OUTPUT);
              pinMode(DS,OUTPUT);
              pinMode(ST_CP,OUTPUT);
              pinMode(OE,OUTPUT);
              pinMode(MR,OUTPUT);
}

void loop()
{                                                                                               
      shu();
}

void shu()
{
        for(int i=0; i<8;i++)     //若要显示0-9,则i<10,你懂得
        {
            digitalWrite(MR,HIGH);//复位引脚给高电平
            digitalWrite(OE,HIGH);   //片选引脚先给高电平
            digitalWrite(ST_CP,LOW);  //移位寄存器低电平

            for(j=0;j<8;j++)
            {
                  digitalWrite(SH_CP,LOW);
                  data=a[i][j];   //段选数码管
                  set(data);
                  //delay(1);
                  digitalWrite(SH_CP,HIGH);
                  //delay(1);      
            }
            
            for(j=0;j<8;j++)
            {
                  digitalWrite(SH_CP,LOW);
                  data=b[i][j];   //位选数码管
                  set(data);
                  //delay(1);
                  digitalWrite(SH_CP,HIGH);
                  //delay(1);      
            }
            
            digitalWrite(OE,LOW);    //595片选选中
            digitalWrite(ST_CP,HIGH); //移位寄存器一个上升沿,
                                    //将值锁存在锁存器里并输出
            delayMicroseconds(100); //此处延时要短,否则
                                    //8位数码管同时亮时会闪烁
            digitalWrite(ST_CP,LOW);
            //delay(1000);         //让一个数字显示1s*/
        }  

        //若要每次只有一个数码管显示,则将里面的延时函数全部加上即可
     //若要全部显示则只能留下delayMicroseconds(us)函数
}



下面为单个数码管显示


#include "Arduino.h"
void set(int x);
void setup();
void loop();
void shu();
int SH_CP = 12;  //595_SH_CP/11   存储寄存器   
int DS = 13;  //595_DS/14      移位寄存器
int ST_CP = 11;  //595_ST_CP/12   串行数据输入端   
int OE = 10;    //595_OE/13      输出使能端
int MR = 9;  //595_MR/10      芯片复位端

/*数码管段选*/
int a[10][8]={0,0,1,1,1,1,1,1,    //0
              0,0,0,0,0,1,1,0,    //1   
              0,1,0,1,1,0,1,1,    //2
              0,1,0,0,1,1,1,1,    //3
              0,1,1,0,0,1,1,0,    //4
              0,1,1,0,1,1,0,1,    //5
              0,1,1,1,1,1,0,1,    //6
              0,0,0,0,0,1,1,1,    //7
              0,1,1,1,1,1,1,1,    //8
              0,1,1,0,0,1,1,1,};  //9

/*数码管位选*/
int b[8][8]={ 1,1,1,1,1,1,1,0,    //0
              1,1,1,1,1,1,0,1,    //1   
              1,1,1,1,1,0,1,1,    //2
              1,1,1,1,0,1,1,1,    //3
              1,1,1,0,1,1,1,1,    //4
              1,1,0,1,1,1,1,1,    //5
              1,0,1,1,1,1,1,1,    //6
              0,1,1,1,1,1,1,1,    //7
              };
int data;
int j;

void set(int x)
{
      if(x==0)digitalWrite(DS,LOW);  
      else digitalWrite(DS,HIGH);
}

void setup() {
                                                   
              pinMode(SH_CP,OUTPUT);
              pinMode(DS,OUTPUT);
              pinMode(ST_CP,OUTPUT);
              pinMode(OE,OUTPUT);
              pinMode(MR,OUTPUT);
}

void loop()
{                                                                                               
      shu();
}

void shu()
{
        for(int i=0; i<10;i++)
        {
            digitalWrite(MR,HIGH);//复位引脚给高电平
            digitalWrite(OE,HIGH);   //片选引脚先给高电平
            digitalWrite(ST_CP,LOW);  //移位寄存器低电平

            for(j=0;j<8;j++)
            {
                  digitalWrite(SH_CP,LOW);
                  data=a[i][j];   //段选数码管
                  set(data);
                  delay(1);
                  digitalWrite(SH_CP,HIGH);
                  delay(1);      
            }
            
            for(j=0;j<8;j++)
            {
                  digitalWrite(SH_CP,LOW);
                  data=b[0][j];   //位选数码管
                  //若只选择一位数码管,则i可以直接输入值如0
                  set(data);
                  delay(1);
                  digitalWrite(SH_CP,HIGH);
                  delay(1);      
            }
            
            digitalWrite(OE,LOW);    //595片选选中
            digitalWrite(ST_CP,HIGH); //移位寄存器一个上升沿,
                                    //将值锁存在锁存器里并输出
            delayMicroseconds(100); //此处延时要短,否则
                                    //8位数码管同时亮时会闪烁
            digitalWrite(ST_CP,LOW);
            delay(1000);         //让一个数字显示1s*/
        }  

        //若要每次只有一个数码管显示,则将里面的延时函数全部加上即可
        //若要全部显示则只能留下delayMicroseconds(us)函数
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-8-5 17:15:08 | 显示全部楼层
楼主有单独的八位数码管吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-8-11 13:09:49 | 显示全部楼层
凤凰de星空 发表于 2015-8-5 17:15
楼主有单独的八位数码管吗

你可以位选只选择一个即可,如果你只需要用一个数码管的话,也可以直接把位选接地或者高电平,这样把位选的那些程序删掉即可,应该是很容易的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 22:15 , Processed in 0.037447 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表