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)
调用的方法为
1 digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据 2 shiftOut(dataPin,clockPin,MSBFIRST,a); 3 /*这个就是用MSBFIRST参数让0-7个针脚以高电平输出(LSBFIRST 低电平)是dataPin的参数, 4 clockPin的参数是变量a,前面我们说了这个变量会一次从1+1+到256,是个十进制数, 5 输入到芯片后会产生8个二进制数,达到开关的作用*/ 6 digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平 7 delay(500); //暂停500ms让你看到效果
先将latchpin拉低做准备,写入数据之后,拉高,即可。
整体代码如下
1 //VCC -- 5V 2 //GND -- GND 3 //DS -- A0 4 //ST_CP -- A1 5 //SH_CP -- A2 6 int latchPin = A1;//ST_CP 7 int clockPin = A2;//SH_CP 8 int dataPin = A0; //DS 9 //这里定义了74HC595的那三个脚 10 //设置阴极接口 11 int a = 8; 12 int b = 2; 13 int c = 3; 14 int d = 4; 15 int e = 5; 16 int f = 6; 17 int g = 9; 18 //设置阳极接口 19 int d4 = 7; 20 int d3 = 10; 21 int d2 = 11; 22 int d1 = 12; 23 //设置变量 24 long n = 0; 25 int x = 100; 26 int del = 55; //此处数值对时钟进行微调 27 28 byte segs[7] = { a, b, c, d, e, f, g }; 29 30 byte seven_seg_digits[10][7] = { { 0,0,0,0,0,0,1 }, // = 0 31 { 1,0,0,1,1,1,1 }, // = 1 32 { 0,0,1,0,0,1,0 }, // = 2 33 { 0,0,0,0,1,1,0 }, // = 3 34 { 1,0,0,1,1,0,0 }, // = 4 35 { 0,1,0,0,1,0,0 }, // = 5 36 { 0,1,0,0,0,0,0 }, // = 6 37 { 0,0,0,1,1,1,1 }, // = 7 38 { 0,0,0,0,0,0,0 }, // = 8 39 { 0,0,0,0,1,0,0 } // = 9 40 }; 41 42 void setup () 43 { 44 pinMode(13,INPUT); 45 pinMode(latchPin,OUTPUT); 46 pinMode(clockPin,OUTPUT); 47 pinMode(dataPin,OUTPUT); 48 //让74HC595的三个脚都是输出状 49 pinMode(d1, OUTPUT); 50 pinMode(d2, OUTPUT); 51 pinMode(d3, OUTPUT); 52 pinMode(d4, OUTPUT); 53 pinMode(a, OUTPUT); 54 pinMode(b, OUTPUT); 55 pinMode(c, OUTPUT); 56 pinMode(d, OUTPUT); 57 pinMode(e, OUTPUT); 58 pinMode(f, OUTPUT); 59 pinMode(g, OUTPUT); 60 } 61 //这个函数是显示一个数用的disNum(显示的数,显示的位,是否有小数点(1为有小数点)) 62 void disNum(int Num_Qua, int Num_Pos) 63 { 64 int Num_Qua_B = 0; 65 int Num_Pos_B = 0; 66 switch (Num_Qua) 67 { 68 case 0:Num_Qua_B = 63;break; 69 case 1:Num_Qua_B = 6;break; 70 case 2: Num_Qua_B = 91;break; 71 case 3:Num_Qua_B = 79;break; 72 case 4:Num_Qua_B = 102;break; 73 case 5:Num_Qua_B = 109;break; 74 case 6:Num_Qua_B = 125;break; 75 case 7:Num_Qua_B = 7;break; 76 case 8:Num_Qua_B = 127;break; 77 case 9:Num_Qua_B = 111;break; 78 default: Num_Qua_B = 0;break; 79 }; 80 //这个值转换为2进制 为一个数abcdefg的需要亮的针脚。 81 switch (Num_Pos) 82 { 83 case 1:Num_Pos_B = 0xffe;break; 84 case 2:Num_Pos_B = 253;break; 85 case 3:Num_Pos_B = 251;break; 86 case 4:Num_Pos_B = 247;break; 87 case 5:Num_Pos_B = 239;break; 88 case 6:Num_Pos_B = 223;break; 89 case 7:Num_Pos_B = 191;break; 90 case 8:Num_Pos_B = 127;break; 91 }; 92 //这个值转换为2进制 为当前点亮的位数。 93 digitalWrite(latchPin,LOW); //将ST_CP口上面加低电平让芯片准备好接收数据 94 int L = Num_Qua_B; int R = Num_Pos_B; 95 shiftOut(dataPin,clockPin,MSBFIRST,R); 96 shiftOut(dataPin,clockPin,MSBFIRST,L); 97 digitalWrite(latchPin,HIGH); //将ST_CP这个针脚恢复到高电平 98 //上面是74HC595的输出方式 每个74HC595能接受一个8位的2进制数值来电灯 第一个74HC595再次输入一个8位的数值他会把他现在的数值传给第二个串联的74HC595。 99 delayMicroseconds(100); 100 } 101 //这个是显示数用的函数 102 void showNum(double number)//注意用double,int不够长了。 103 { 104 long num = number; 105 int ShowNumber [8]; 106 ShowNumber[1] = (num/10000000)%10; 107 ShowNumber[2]= (num/1000000)%10; 108 ShowNumber[3] = (num/100000)%10; 109 ShowNumber[4] = (num/10000)%10; 110 ShowNumber[5] = (num/1000)%10; 111 ShowNumber[6] = (num/100)%10; 112 ShowNumber[7] = (num/10)%10; 113 ShowNumber[8]= (num/1)%10; 114 //取得每一位的数。然后存在一个数组里。 115 disNum(ShowNumber[1],1); 116 disNum(ShowNumber[2],2); 117 disNum(ShowNumber[3],3); 118 disNum(ShowNumber[4],4); 119 disNum(ShowNumber[5],5); 120 disNum(ShowNumber[6],6); 121 disNum(ShowNumber[7],7); 122 disNum(ShowNumber[8],8); 123 //依次显示数字,因为LED的闪烁很快,所以人眼无法识别闪烁。 124 } 125 void loop() 126 { 127 if (digitalRead(13)==LOW ) liang(); 128 else cong(); 129 } 130 void cong() 131 { 132 showNum(15617889);//相对简单的函数调用 133 clearLEDs(); 134 pickDigit(1); 135 lightSegments(7); 136 delayMicroseconds(del); 137 clearLEDs(); 138 pickDigit(2); 139 lightSegments(0); 140 delayMicroseconds(del); 141 clearLEDs(); 142 pickDigit(3); 143 lightSegments(8); 144 delayMicroseconds(del); 145 clearLEDs(); 146 pickDigit(4); 147 lightSegments(8); 148 delayMicroseconds(del); 149 } 150 void liang() 151 { 152 showNum(13073783);//相对简单的函数调用 153 clearLEDs(); 154 pickDigit(1); 155 lightSegments(3); 156 delayMicroseconds(del); 157 clearLEDs(); 158 pickDigit(2); 159 lightSegments(7); 160 delayMicroseconds(del); 161 clearLEDs(); 162 pickDigit(3); 163 lightSegments(3); 164 delayMicroseconds(del); 165 clearLEDs(); 166 pickDigit(4); 167 lightSegments(8); 168 delayMicroseconds(del); 169 } 170 void pickDigit(int x) //定义pickDigit(x),其作用是开启dx端口 171 { 172 digitalWrite(d1, LOW); 173 digitalWrite(d2, LOW); 174 digitalWrite(d3, LOW); 175 digitalWrite(d4, LOW); 176 switch(x) 177 { 178 case 1: 179 digitalWrite(d1, HIGH); 180 break; 181 case 2: 182 digitalWrite(d2, HIGH); 183 break; 184 case 3: 185 digitalWrite(d3, HIGH); 186 break; 187 default: 188 digitalWrite(d4, HIGH); 189 break; 190 } 191 } 192 void clearLEDs() //清屏 193 { 194 digitalWrite(a, HIGH); 195 digitalWrite(b, HIGH); 196 digitalWrite(c, HIGH); 197 digitalWrite(d, HIGH); 198 digitalWrite(e, HIGH); 199 digitalWrite(f, HIGH); 200 digitalWrite(g, HIGH); 201 } 202 // 点亮对应数字的数码管 203 void lightSegments(int x) { 204 for (int i = 0; i < 7; i++) { 205 digitalWrite(segs[i], seven_seg_digits[x][i]); 206 } 207 }
功能与效果的实现