414545584 发表于 2015-8-3 12:45:14

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

初学者打出来的代码,可能不“美观”,希望大家点评,多多留下意见,话不多说上代码……


下面为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={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={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;   //段选数码管
                  set(data);
                  //delay(1);
                  digitalWrite(SH_CP,HIGH);
                  //delay(1);      
            }
            
            for(j=0;j<8;j++)
            {
                  digitalWrite(SH_CP,LOW);
                  data=b;   //位选数码管
                  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={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={ 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;   //段选数码管
                  set(data);
                  delay(1);
                  digitalWrite(SH_CP,HIGH);
                  delay(1);      
            }
            
            for(j=0;j<8;j++)
            {
                  digitalWrite(SH_CP,LOW);
                  data=b;   //位选数码管
                  //若只选择一位数码管,则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)函数
}


凤凰de星空 发表于 2015-8-5 17:15:08

楼主有单独的八位数码管吗

414545584 发表于 2015-8-11 13:09:49

凤凰de星空 发表于 2015-8-5 17:15 static/image/common/back.gif
楼主有单独的八位数码管吗

你可以位选只选择一个即可,如果你只需要用一个数码管的话,也可以直接把位选接地或者高电平,这样把位选的那些程序删掉即可,应该是很容易的:)
页: [1]
查看完整版本: 用arduino和2个74HC595级联控制8位数码管显示