找回密码
 立即注册

QQ登录

只需一步,快速开始

本帖最后由 lxf 于 2020-8-17 13:31 编辑

第32课 点阵屏随机骰子


目标

利用常闭震动传感器,使骰子的点数随机显示在MAX7219 8*8点阵屏上

实验材料

Arduino UNO开发板
四块MAX7219 8*8点阵屏
常闭震动传感器
配套USB数据线
配套杜邦线若干
Arduino IDE软件

微信图片_20200704134551.png

内容

利用常闭震动传感器,甩动骰子,使骰子1-6的点数随机显示在MAX7219 8*8点阵屏上

接线图

图片2.png

备注:接线图中只接了1个MAX7219 8*8点阵屏

接线方式

Arduino UNO     <------>    常闭震动传感器
              5V         <------>          VCC
             GND      <------>          GND
              3           <------>           D0
Arduino UNO     <------>   MAX7219 8*8点阵屏1(IN)
            5V           <------>          VCC
           GND        <------>          GND
           11            <------>           DIN
            9             <------>           CS
           13            <------>           CLK
MAX7219 8*8点阵屏1(OUT)    <------>    MAX7219 8*8点阵屏2(IN)
                          VCC                    <------>              VCC
                          GND                   <------>              GND
                          DOUT                  <------>              DIN
                           CS                      <------>                CS
                           CLK                    <------>                CLK
MAX7219 8*8点阵屏2(OUT)     <------>    MAX7219 8*8点阵屏3(IN)
                           VCC                    <------>              VCC
                          GND                    <------>              GND
                         DOUT                   <------>              DIN
                           CS                       <------>               CS
                          CLK                      <------>              CLK
MAX7219 8*8点阵屏3(OUT)    <------>    MAX7219 8*8点阵屏4(IN)
                         VCC                     <------>              VCC
                         GND                    <------>              GND
                        DOUT                   <------>              DIN
                          CS                       <------>               CS
                          CLK                     <------>              CLK

程序实现代码

  1. #include <SPI.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Max72xxPanel.h>   //MAX7219点阵屏库文件
  4. uint8_t  LEDArray[8];
  5. volatile int item;  //定义一个整型变量item
  6. Max72xxPanel myMatrix = Max72xxPanel(9,4,1);   //CS=9,水平点阵屏为4和竖直点阵屏为1
  7. const uint8_t A[8] PROGMEM ={0xc0,0xc0,0x00,0x00,0x00,0x00,0x00,0x00};
  8. const uint8_t B[8] PROGMEM ={0x03,0x03,0x00,0x00,0x00,0x00,0x00,0x00};
  9. const uint8_t C[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0};
  10. const uint8_t D[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03};
  11. void my_1() {         //函数1显示骰子数字1
  12.   memcpy_P (&LEDArray, &A, 8);   
  13.   for(int index_i=0; index_i<8; index_i++)
  14.   {
  15.     for(int index_j=0*8; index_j<0*8+8; index_j++)
  16.     {
  17.       if((LEDArray[index_i]&0x01)>0)
  18.        myMatrix.drawPixel(index_j, 7-index_i,1);
  19.   else
  20.   myMatrix.drawPixel(index_j, 7-index_i,0);
  21.        LEDArray[index_i] = LEDArray[index_i]>>1;
  22.     }
  23.   }
  24.   myMatrix.write();
  25.   memcpy_P (&LEDArray, &B, 8);
  26.   for(int index_i=0; index_i<8; index_i++)
  27.   {
  28.     for(int index_j=1*8; index_j<1*8+8; index_j++)
  29.     {
  30.       if((LEDArray[index_i]&0x01)>0)
  31.        myMatrix.drawPixel(index_j, 7-index_i,1);
  32.   else
  33.   myMatrix.drawPixel(index_j, 7-index_i,0);
  34.        LEDArray[index_i] = LEDArray[index_i]>>1;
  35.     }
  36.   }
  37.   myMatrix.write();
  38.   memcpy_P (&LEDArray, &C, 8);
  39.   for(int index_i=0; index_i<8; index_i++)
  40.   {
  41.     for(int index_j=2*8; index_j<2*8+8; index_j++)
  42.     {
  43.       if((LEDArray[index_i]&0x01)>0)
  44.        myMatrix.drawPixel(index_j, 7-index_i,1);
  45.   else
  46.   myMatrix.drawPixel(index_j, 7-index_i,0);
  47.        LEDArray[index_i] = LEDArray[index_i]>>1;
  48.     }
  49.   }
  50.   myMatrix.write();
  51.   memcpy_P (&LEDArray, &D, 8);
  52.   for(int index_i=0; index_i<8; index_i++)
  53.   {
  54.     for(int index_j=3*8; index_j<3*8+8; index_j++)
  55.     {
  56.       if((LEDArray[index_i]&0x01)>0)
  57.        myMatrix.drawPixel(index_j, 7-index_i,1);
  58.   else
  59.   myMatrix.drawPixel(index_j, 7-index_i,0);
  60.        LEDArray[index_i] = LEDArray[index_i]>>1;
  61.     }
  62.   }
  63.   myMatrix.write();
  64. }
  65. const uint8_t E[8] PROGMEM ={0x00,0x00,0x80,0x80,0x00,0x00,0x00,0x00};
  66. const uint8_t F[8] PROGMEM ={0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00};
  67. const uint8_t G[8] PROGMEM ={0x00,0x00,0x00,0x00,0x80,0x80,0x00,0x00};
  68. const uint8_t H[8] PROGMEM ={0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x00};
  69. void my_2() {                   //函数2显示骰子数字2
  70.   memcpy_P (&LEDArray, &E, 8);
  71.   for(int index_i=0; index_i<8; index_i++)
  72.   {
  73.     for(int index_j=0*8; index_j<0*8+8; index_j++)
  74.     {
  75.       if((LEDArray[index_i]&0x01)>0)
  76.        myMatrix.drawPixel(index_j, 7-index_i,1);
  77.   else
  78.   myMatrix.drawPixel(index_j, 7-index_i,0);
  79.        LEDArray[index_i] = LEDArray[index_i]>>1;
  80.     }
  81.   }
  82.   myMatrix.write();
  83.   memcpy_P (&LEDArray, &F, 8);
  84.   for(int index_i=0; index_i<8; index_i++)
  85.   {
  86.     for(int index_j=1*8; index_j<1*8+8; index_j++)
  87.     {
  88.       if((LEDArray[index_i]&0x01)>0)
  89.        myMatrix.drawPixel(index_j, 7-index_i,1);
  90.   else
  91.   myMatrix.drawPixel(index_j, 7-index_i,0);
  92.        LEDArray[index_i] = LEDArray[index_i]>>1;
  93.     }
  94.   }
  95.   myMatrix.write();
  96.   memcpy_P (&LEDArray, &G, 8);
  97.   for(int index_i=0; index_i<8; index_i++)
  98.   {
  99.     for(int index_j=2*8; index_j<2*8+8; index_j++)
  100.     {
  101.       if((LEDArray[index_i]&0x01)>0)
  102.        myMatrix.drawPixel(index_j, 7-index_i,1);
  103.   else
  104.   myMatrix.drawPixel(index_j, 7-index_i,0);
  105.        LEDArray[index_i] = LEDArray[index_i]>>1;
  106.     }
  107.   }
  108.   myMatrix.write();
  109.   memcpy_P (&LEDArray, &H, 8);
  110.   for(int index_i=0; index_i<8; index_i++)
  111.   {
  112.     for(int index_j=3*8; index_j<3*8+8; index_j++)
  113.     {
  114.       if((LEDArray[index_i]&0x01)>0)
  115.        myMatrix.drawPixel(index_j, 7-index_i,1);
  116.   else
  117.   myMatrix.drawPixel(index_j, 7-index_i,0);
  118.        LEDArray[index_i] = LEDArray[index_i]>>1;
  119.     }
  120.   }
  121.   myMatrix.write();
  122. }
  123. const uint8_t I[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  124. const uint8_t J[8] PROGMEM ={0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00};
  125. const uint8_t K[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00};
  126. const uint8_t L[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  127. void my_3() {     //函数3显示骰子数字3
  128.   memcpy_P (&LEDArray, &I, 8);
  129.   for(int index_i=0; index_i<8; index_i++)
  130.   {
  131.     for(int index_j=0*8; index_j<0*8+8; index_j++)
  132.     {
  133.       if((LEDArray[index_i]&0x01)>0)
  134.        myMatrix.drawPixel(index_j, 7-index_i,1);
  135.   else
  136.   myMatrix.drawPixel(index_j, 7-index_i,0);
  137.        LEDArray[index_i] = LEDArray[index_i]>>1;
  138.     }
  139.   }
  140.   myMatrix.write();
  141.   memcpy_P (&LEDArray, &J, 8);
  142.   for(int index_i=0; index_i<8; index_i++)
  143.   {
  144.     for(int index_j=1*8; index_j<1*8+8; index_j++)
  145.     {
  146.       if((LEDArray[index_i]&0x01)>0)
  147.        myMatrix.drawPixel(index_j, 7-index_i,1);
  148.   else
  149.   myMatrix.drawPixel(index_j, 7-index_i,0);
  150.        LEDArray[index_i] = LEDArray[index_i]>>1;
  151.     }
  152.   }
  153.   myMatrix.write();
  154.   memcpy_P (&LEDArray, &K, 8);
  155.   for(int index_i=0; index_i<8; index_i++)
  156.   {
  157.     for(int index_j=2*8; index_j<2*8+8; index_j++)
  158.     {
  159.       if((LEDArray[index_i]&0x01)>0)
  160.        myMatrix.drawPixel(index_j, 7-index_i,1);
  161.   else
  162.   myMatrix.drawPixel(index_j, 7-index_i,0);
  163.        LEDArray[index_i] = LEDArray[index_i]>>1;
  164.     }
  165.   }
  166.   myMatrix.write();
  167.   memcpy_P (&LEDArray, &L, 8);
  168.   for(int index_i=0; index_i<8; index_i++)
  169.   {
  170.     for(int index_j=3*8; index_j<3*8+8; index_j++)
  171.     {
  172.       if((LEDArray[index_i]&0x01)>0)
  173.        myMatrix.drawPixel(index_j, 7-index_i,1);
  174.   else
  175.   myMatrix.drawPixel(index_j, 7-index_i,0);
  176.        LEDArray[index_i] = LEDArray[index_i]>>1;
  177.     }
  178.   }
  179.   myMatrix.write();
  180. }
  181. const uint8_t M[8] PROGMEM ={0x00,0x00,0x00,0x3c,0x3c,0x3c,0x00,0x00};
  182. const uint8_t N[8] PROGMEM ={0x00,0x00,0x00,0x3c,0x3c,0x3c,0x00,0x00};
  183. const uint8_t O[8] PROGMEM ={0x00,0x00,0x00,0x3c,0x3c,0x3c,0x00,0x00};
  184. const uint8_t P[8] PROGMEM ={0x00,0x00,0x00,0x3c,0x3c,0x3c,0x00,0x00};
  185. void my_4() {     //函数4显示骰子数字4
  186.   memcpy_P (&LEDArray, &M, 8);
  187.   for(int index_i=0; index_i<8; index_i++)
  188.   {
  189.     for(int index_j=0*8; index_j<0*8+8; index_j++)
  190.     {
  191.       if((LEDArray[index_i]&0x01)>0)
  192.        myMatrix.drawPixel(index_j, 7-index_i,1);
  193.   else
  194.   myMatrix.drawPixel(index_j, 7-index_i,0);
  195.        LEDArray[index_i] = LEDArray[index_i]>>1;
  196.     }
  197.   }
  198.   myMatrix.write();
  199.   memcpy_P (&LEDArray, &N, 8);
  200.   for(int index_i=0; index_i<8; index_i++)
  201.   {
  202.     for(int index_j=1*8; index_j<1*8+8; index_j++)
  203.     {
  204.       if((LEDArray[index_i]&0x01)>0)
  205.        myMatrix.drawPixel(index_j, 7-index_i,1);
  206.   else
  207.   myMatrix.drawPixel(index_j, 7-index_i,0);
  208.        LEDArray[index_i] = LEDArray[index_i]>>1;
  209.     }
  210.   }
  211.   myMatrix.write();
  212.   memcpy_P (&LEDArray, &O, 8);
  213.   for(int index_i=0; index_i<8; index_i++)
  214.   {
  215.     for(int index_j=2*8; index_j<2*8+8; index_j++)
  216.     {
  217.       if((LEDArray[index_i]&0x01)>0)
  218.        myMatrix.drawPixel(index_j, 7-index_i,1);
  219.   else
  220.   myMatrix.drawPixel(index_j, 7-index_i,0);
  221.        LEDArray[index_i] = LEDArray[index_i]>>1;
  222.     }
  223.   }
  224.   myMatrix.write();
  225.   memcpy_P (&LEDArray, &P, 8);
  226.   for(int index_i=0; index_i<8; index_i++)
  227.   {
  228.     for(int index_j=3*8; index_j<3*8+8; index_j++)
  229.     {
  230.       if((LEDArray[index_i]&0x01)>0)
  231.        myMatrix.drawPixel(index_j, 7-index_i,1);
  232.   else
  233.   myMatrix.drawPixel(index_j, 7-index_i,0);
  234.        LEDArray[index_i] = LEDArray[index_i]>>1;
  235.     }
  236.   }
  237.   myMatrix.write();
  238. }
  239. const uint8_t Q[8] PROGMEM ={0xc0,0xc0,0x00,0x3c,0x3c,0x3c,0x00,0x00};
  240. const uint8_t R[8] PROGMEM ={0x03,0x03,0x00,0x3c,0x3c,0x3c,0x00,0x00};
  241. const uint8_t S[8] PROGMEM ={0x00,0x00,0x00,0x3c,0x3c,0x3c,0xc0,0xc0};
  242. const uint8_t T[8] PROGMEM ={0x00,0x00,0x00,0x3c,0x3c,0x3c,0x03,0x03};
  243. void my_5() {     //函数5显示骰子数字5
  244.   memcpy_P (&LEDArray, &Q, 8);
  245.   for(int index_i=0; index_i<8; index_i++)
  246.   {
  247.     for(int index_j=0*8; index_j<0*8+8; index_j++)
  248.     {
  249.       if((LEDArray[index_i]&0x01)>0)
  250.        myMatrix.drawPixel(index_j, 7-index_i,1);
  251.   else
  252.   myMatrix.drawPixel(index_j, 7-index_i,0);
  253.        LEDArray[index_i] = LEDArray[index_i]>>1;
  254.     }
  255.   }
  256.   myMatrix.write();
  257.   memcpy_P (&LEDArray, &R, 8);
  258.   for(int index_i=0; index_i<8; index_i++)
  259.   {
  260.     for(int index_j=1*8; index_j<1*8+8; index_j++)
  261.     {
  262.       if((LEDArray[index_i]&0x01)>0)
  263.        myMatrix.drawPixel(index_j, 7-index_i,1);
  264.   else
  265.   myMatrix.drawPixel(index_j, 7-index_i,0);
  266.        LEDArray[index_i] = LEDArray[index_i]>>1;
  267.     }
  268.   }
  269.   myMatrix.write();
  270.   memcpy_P (&LEDArray, &S, 8);
  271.   for(int index_i=0; index_i<8; index_i++)
  272.   {
  273.     for(int index_j=2*8; index_j<2*8+8; index_j++)
  274.     {
  275.       if((LEDArray[index_i]&0x01)>0)
  276.        myMatrix.drawPixel(index_j, 7-index_i,1);
  277.   else
  278.   myMatrix.drawPixel(index_j, 7-index_i,0);
  279.        LEDArray[index_i] = LEDArray[index_i]>>1;
  280.     }
  281.   }
  282.   myMatrix.write();
  283.   memcpy_P (&LEDArray, &T, 8);
  284.   for(int index_i=0; index_i<8; index_i++)
  285.   {
  286.     for(int index_j=3*8; index_j<3*8+8; index_j++)
  287.     {
  288.       if((LEDArray[index_i]&0x01)>0)
  289.        myMatrix.drawPixel(index_j, 7-index_i,1);
  290.   else
  291.   myMatrix.drawPixel(index_j, 7-index_i,0);
  292.        LEDArray[index_i] = LEDArray[index_i]>>1;
  293.     }
  294.   }
  295.   myMatrix.write();
  296. }

  297. const uint8_t U[8] PROGMEM ={0x60,0x00,0x00,0x00,0x60,0x60,0x00,0x00};
  298. const uint8_t V[8] PROGMEM ={0x06,0x00,0x00,0x00,0x06,0x06,0x00,0x00};
  299. const uint8_t W[8] PROGMEM ={0x00,0x00,0x00,0x60,0x60,0x00,0x00,0x60};
  300. const uint8_t X[8] PROGMEM ={0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x06};
  301. void my_6() {   //函数6显示骰子数字6
  302.   memcpy_P (&LEDArray, &U, 8);
  303.   for(int index_i=0; index_i<8; index_i++)
  304.   {
  305.     for(int index_j=0*8; index_j<0*8+8; index_j++)
  306.     {
  307.       if((LEDArray[index_i]&0x01)>0)
  308.        myMatrix.drawPixel(index_j, 7-index_i,1);
  309.   else
  310.   myMatrix.drawPixel(index_j, 7-index_i,0);
  311.        LEDArray[index_i] = LEDArray[index_i]>>1;
  312.     }
  313.   }
  314.   myMatrix.write();
  315.   memcpy_P (&LEDArray, &V, 8);
  316.   for(int index_i=0; index_i<8; index_i++)
  317.   {
  318.     for(int index_j=1*8; index_j<1*8+8; index_j++)
  319.     {
  320.       if((LEDArray[index_i]&0x01)>0)
  321.        myMatrix.drawPixel(index_j, 7-index_i,1);
  322.   else
  323.   myMatrix.drawPixel(index_j, 7-index_i,0);
  324.        LEDArray[index_i] = LEDArray[index_i]>>1;
  325.     }
  326.   }
  327.   myMatrix.write();
  328.   memcpy_P (&LEDArray, &W, 8);
  329.   for(int index_i=0; index_i<8; index_i++)
  330.   {
  331.     for(int index_j=2*8; index_j<2*8+8; index_j++)
  332.     {
  333.       if((LEDArray[index_i]&0x01)>0)
  334.        myMatrix.drawPixel(index_j, 7-index_i,1);
  335.   else
  336.   myMatrix.drawPixel(index_j, 7-index_i,0);
  337.        LEDArray[index_i] = LEDArray[index_i]>>1;
  338.     }
  339.   }
  340.   myMatrix.write();
  341.   memcpy_P (&LEDArray, &X, 8);
  342.   for(int index_i=0; index_i<8; index_i++)
  343.   {
  344.     for(int index_j=3*8; index_j<3*8+8; index_j++)
  345.     {
  346.       if((LEDArray[index_i]&0x01)>0)
  347.        myMatrix.drawPixel(index_j, 7-index_i,1);
  348.   else
  349.   myMatrix.drawPixel(index_j, 7-index_i,0);
  350.        LEDArray[index_i] = LEDArray[index_i]>>1;
  351.     }
  352.   }
  353.   myMatrix.write();
  354. }
  355. void setup(){
  356.   item = 0;  //item赋值为0
  357.   myMatrix.fillScreen(0);    //初始化点阵屏为全灭
  358.   myMatrix.write();
  359.   pinMode(3, INPUT);  //将3号引脚设置为输入
  360. }
  361. void loop(){
  362.   myMatrix.setIntensity(20);    //设置MAX7219点阵屏亮度为20
  363.   myMatrix.setRotation(0,1);  //将MAX7219点阵屏屏幕序号0的角度旋转270度,根据实际情况调整
  364.   myMatrix.setRotation(1,1);  //将MAX7219点阵屏屏幕序号0的角度旋转270度,根据实际情况调整
  365.   myMatrix.setRotation(2,1);   //将MAX7219点阵屏屏幕序号0的角度旋转270度,根据实际情况调整
  366.   myMatrix.setRotation(3,1);  //将MAX7219点阵屏屏幕序号0的角度旋转270度,根据实际情况调整
  367.   if (digitalRead(3) == HIGH) {   //判断如果3号引脚为高电平,即筛子被摇动
  368.     delay(1000);  //延迟等待1秒
  369.     item = random(1, 6);   //变量item赋值为1-6的随机数
  370.     if (item == 1) {   //如果item为1,则执行函数my_1(),即显示数字1
  371.       my_1();
  372.     } else if (item == 2) {   //如果item为2,则执行函数my_2(),即显示数字2
  373.       my_2();
  374.     } else if (item == 3) {    //如果item为3,则执行函数my_3(),即显示数字3
  375.       my_3();
  376.     } else if (item == 4) {    //如果item为4,则执行函数my_4(),即显示数字4
  377.       my_4();
  378.     } else if (item == 5) {   //如果item为5,则执行函数 my_5(),即显示数字5
  379.       my_5();
  380.     } else if (item == 6) {   //如果item为6,则执行函数 my_6(),即显示数字6
  381.       my_6();
  382.     }
  383.   }
  384. }
复制代码
分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册