2018-01-0915:39:24
首先arduino中shiftOUT()函数的定义与说明!
shiftOut()
描述
将一个数据的一个字节一位一位的移出。从最高有效位(最左边)或最低有效位(最右边)开始。依次向数据脚写入每一位,之后时钟脚被拉高或拉低,指示刚才的数据有效。
注意:如果你所连接的设备时钟类型为上升沿,你要确定在调用shiftOut()前时钟脚为低电平,如调用digitalWrite(clockPin, LOW)。
注意:这是一个软件实现;Arduino提供了一个硬件实现的SPI库,它速度更快但只在特定脚有效。
语法
shiftOut(dataPin, clockPin, bitOrder, value)
参数
dataPin:输出每一位数据的引脚(int)
clockPin:时钟脚,当dataPin有值时此引脚电平变化(int)
bitOrder:输出位的顺序,最高位优先或最低位优先
value: 要移位输出的数据(byte)
调用的方法为
digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
shiftOut(dataPin,clockPin,MSBFIRST,a);
/*这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是dataPin的参数,
clockPin的参数是变量a,前面我们说了这个变量会一次从1+1+到256,是个十进制数,
输入到芯片后会产生8个二进制数,达到开关的作用*/
digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
delay(); //暂停500ms让你看到效果
先将latchpin拉低做准备,写入数据之后,拉高,即可。
整体代码如下
//VCC -- 5V
//GND -- GND
//DS -- A0
//ST_CP -- A1
//SH_CP -- A2
int latchPin = A1;//ST_CP
int clockPin = A2;//SH_CP
int dataPin = A0; //DS
//这里定义了74HC595的那三个脚
//设置阴极接口
int a = ;
int b = ;
int c = ;
int d = ;
int e = ;
int f = ;
int g = ;
//设置阳极接口
int d4 = ;
int d3 = ;
int d2 = ;
int d1 = ;
//设置变量
long n = ;
int x = ;
int del = ; //此处数值对时钟进行微调 byte segs[] = { a, b, c, d, e, f, g }; byte seven_seg_digits[][] = { { ,,,,,, }, // = 0
{ ,,,,,, }, // = 1
{ ,,,,,, }, // = 2
{ ,,,,,, }, // = 3
{ ,,,,,, }, // = 4
{ ,,,,,, }, // = 5
{ ,,,,,, }, // = 6
{ ,,,,,, }, // = 7
{ ,,,,,, }, // = 8
{ ,,,,,, } // = 9
}; void setup ()
{
pinMode(,INPUT);
pinMode(latchPin,OUTPUT);
pinMode(clockPin,OUTPUT);
pinMode(dataPin,OUTPUT);
//让74HC595的三个脚都是输出状
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
}
//这个函数是显示一个数用的disNum(显示的数,显示的位,是否有小数点(1为有小数点))
void disNum(int Num_Qua, int Num_Pos)
{
int Num_Qua_B = ;
int Num_Pos_B = ;
switch (Num_Qua)
{
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case : Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
case :Num_Qua_B = ;break;
default: Num_Qua_B = ;break;
};
//这个值转换为2进制 为一个数abcdefg的需要亮的针脚。
switch (Num_Pos)
{
case :Num_Pos_B = 0xffe;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
case :Num_Pos_B = ;break;
};
//这个值转换为2进制 为当前点亮的位数。
digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据
int L = Num_Qua_B; int R = Num_Pos_B;
shiftOut(dataPin,clockPin,MSBFIRST,R);
shiftOut(dataPin,clockPin,MSBFIRST,L);
digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平
//上面是74HC595的输出方式 每个74HC595能接受一个8位的2进制数值来电灯 第一个74HC595再次输入一个8位的数值他会把他现在的数值传给第二个串联的74HC595。
delayMicroseconds();
}
//这个是显示数用的函数
void showNum(double number)//注意用double,int不够长了。
{
long num = number;
int ShowNumber [];
ShowNumber[] = (num/)%;
ShowNumber[]= (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[] = (num/)%;
ShowNumber[]= (num/)%;
//取得每一位的数。然后存在一个数组里。
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
disNum(ShowNumber[],);
//依次显示数字,因为LED的闪烁很快,所以人眼无法识别闪烁。
}
void loop()
{
if (digitalRead()==LOW ) liang();
else cong();
}
void cong()
{
showNum();//相对简单的函数调用
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
}
void liang()
{
showNum();//相对简单的函数调用
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
clearLEDs();
pickDigit();
lightSegments();
delayMicroseconds(del);
}
void pickDigit(int x) //定义pickDigit(x),其作用是开启dx端口
{
digitalWrite(d1, LOW);
digitalWrite(d2, LOW);
digitalWrite(d3, LOW);
digitalWrite(d4, LOW);
switch(x)
{
case :
digitalWrite(d1, HIGH);
break;
case :
digitalWrite(d2, HIGH);
break;
case :
digitalWrite(d3, HIGH);
break;
default:
digitalWrite(d4, HIGH);
break;
}
}
void clearLEDs() //清屏
{
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
}
// 点亮对应数字的数码管
void lightSegments(int x) {
for (int i = ; i < ; i++) {
digitalWrite(segs[i], seven_seg_digits[x][i]);
}
}
功能与效果的实现