初学者打出来的代码,可能不“美观”,希望大家点评,多多留下意见,话不多说上代码……
下面为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)函数
}
|