zoukankan      html  css  js  c++  java
  • 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 }

    功能与效果的实现

     

    @青山不移,文笔不息。学习,坚持,梦想青春!
  • 相关阅读:
    [bzoj5278][Usaco2018 Open]Out of Sorts
    CF480Div2掉分记
    [bzoj3759]Hungergame
    [bzoj4184]shallot
    [原]Golang FileServer
    golang thrift 源码分析,服务器和客户端究竟是如何工作的
    golang thrift 总结一下网络上的一些坑
    德州扑克AI WEB版
    德州扑克AI实现 TexasHoldem Poker
    德州扑克游戏
  • 原文地址:https://www.cnblogs.com/pengwenzheng/p/8251750.html
Copyright © 2011-2022 走看看