阿正的网易云音乐 - 创建于 2017

一个大学生的学习心得,与君共勉。

arduino扩展IO与M74HC595B芯片的使用,挪车电话提示牌的设计

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 }

功能与效果的实现

 

 

posted @ 2018-01-09 15:43  阿♛正  阅读(1109)  评论(0编辑  收藏  举报