极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 迷你强

Arduino入门教程--第十八课--Arduino驱动数码管

  [复制链接]
发表于 2015-4-28 10:44:03 | 显示全部楼层
学习  学习啊
回复 支持 反对

使用道具 举报

发表于 2015-6-8 07:33:25 | 显示全部楼层
各位高手讲的太详细了,才自学不久努力中,多谢各位,,,,,,,还要输入验证码,发帖太麻烦了
回复 支持 反对

使用道具 举报

发表于 2015-7-2 10:42:44 | 显示全部楼层
/*
数码管显示
数码管连续循环显示0~9
*/

byte DIGITAL_DISPLAY[10][8] = { //设置0-9数字所对应数组
{ 0,0,0,0,0,1,0,0 }, // = 0
{ 0,0,0,1,1,1,1,1 }, // = 1
{ 0,1,0,0,1,0,0,0 }, // = 2
{ 0,0,0,0,1,0,1,0 }, // = 3
{ 0,0,0,1,0,0,1,1 }, // = 4
{ 0,0,1,0,0,0,1,0 }, // = 5
{ 0,0,1,0,0,0,0,0 }, // = 6
{ 0,0,0,0,1,1,1,1 }, // = 7
{ 0,0,0,0,0,0,0,0 }, // = 8
{ 0,0,0,0,0,0,1,0 } // = 9
};
byte DIGITAL[10][8] = { //设置0-9数字所对应数组
{ 1,1,1,1,1,1,1,1 }, // = 0
{ 1,1,1,1,1,1,1,1 }, // = 1
{ 1,1,1,1,1,1,1,1 }, // = 2
{ 1,1,1,1,1,1,1,1 }, // = 3
{ 1,1,1,1,1,1,1,1 }, // = 4
{ 1,1,1,1,1,1,1,1 }, // = 5
{ 1,1,1,1,1,1,1,1 }, // = 6
{ 1,1,1,1,1,1,1,1 }, // = 7
{ 1,1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,1,1,1,1,1 } // = 9
};

void setup() { //设定4-11号数字端口为输出
for(int i=4;i<=11;i++){
pinMode(i, OUTPUT);
}
}

void loop() {
//0-9数字显示
for (int k = 0; k < 10; k++) {
int pin = 4;
for (int s = 0; s < 8; s++)
{
digitalWrite(pin, DIGITAL_DISPLAY[k][s]);
delay(100);
pin++;
}
delay(1000);
for (int h = 0; h < 8; h++)
{
digitalWrite(pin, DIGITAL[k][h]);
delay(100);
pin--;
}
delay(1000);
}

}

这个代码能看到依次点亮的那一个灯。
回复 支持 反对

使用道具 举报

发表于 2015-9-4 20:37:24 | 显示全部楼层
本帖最后由 ximocnc 于 2015-9-4 20:59 编辑

谢谢 学习了
回复 支持 反对

使用道具 举报

发表于 2015-10-12 10:22:06 | 显示全部楼层

    [我用4片595级联4个数码管 然后用4个数字IO 接4个按键,在按下当按键的时候 数码管 显示一组数字   ,功能正常 ]
    能给接线图和程序吗,先行感谢了。
回复 支持 反对

使用道具 举报

发表于 2016-3-24 10:20:23 | 显示全部楼层
共阴数码管试验成功,但是[pin-3]这里为何要减去3,才能正常显示?

  1. void setup() {   
  2.    for(int pin=3;pin<=10;pin++) //a,b,c,d,e,f,g,Dp对应引脚3,4,5,6,7,8,9,10
  3.      pinMode(pin,OUTPUT);       //定义引脚为输出
  4. }
  5. void loop() {
  6.   /*==========显示=============*/  
  7.   //定义数组
  8.   int n[10][8]={1,1,1,1,1,1,0,0,    //0
  9.                 0,1,1,0,0,0,0,0,    //1
  10.                 1,1,0,1,1,0,1,0,    //2
  11.                 1,1,1,1,0,0,1,0,    //3
  12.                 0,1,1,0,0,1,1,0,    //4
  13.                 1,0,1,1,0,1,1,0,    //5
  14.                 1,0,1,1,1,1,1,0,    //6
  15.                 1,1,1,0,0,0,0,0,    //7
  16.                 1,1,1,1,1,1,1,0,    //8
  17.                 1,1,1,1,0,1,1,0,    //9
  18.                 };
  19.   for(int num=0;num<=9;num++)
  20.   {
  21.     for(int pin=3;pin<=10;pin++)
  22.       digitalWrite(pin,n[num][pin-3]);  //为何要-3,请大神指教。
  23.     delay(500);
  24.     }  
  25. }

复制代码
回复 支持 反对

使用道具 举报

发表于 2016-3-24 11:26:01 | 显示全部楼层
使用16进制,为何数字不进行循环?求解。

  1.   int nums[]=
  2.   { 0xFC,       //    1111,1100  ,0
  3.     0x60,       //    0110,0000  ,1
  4.     0xDA,       //    1101,1010  ,2
  5.     0xF2,       //    1111,0010  ,3
  6.     0x66,       //    0110,0110  ,4
  7.     0xB6,       //    1011,0110  ,5
  8.     0xBE,       //    1011,1110  ,6
  9.     0xE0,       //    1110,0000  ,7
  10.     0xFE,       //    1111,1110  ,8
  11.     0xF6,       //    1111,0110  ,9
  12.   } ;  
  13. void setup()
  14. {  
  15.   for(int pin=3;pin<=10;pin++)
  16.    pinMode(pin,OUTPUT);
  17. }

  18. void loop()
  19. {
  20.   /*==========显示=============*/
  21.       
  22.   for(int num=0; num<=9;num++)            
  23.   {
  24.     for(int pin=1; pin<=8; pin++)   //采用循环方式依次点亮指定的数码管led(数组中1为点亮),单位时间只点亮1个led
  25.       digitalWrite(pin,nums[num]);  
  26.    }
  27.   delay(1000);
  28. }

复制代码
回复 支持 反对

使用道具 举报

发表于 2016-3-24 22:05:12 | 显示全部楼层
本帖最后由 fullmous 于 2016-3-24 22:06 编辑

给大家介绍一种新的处理方式。

//一个数码管连续显示0~F,十六个字符的程序
//数码管的位选引脚接端口C的0引脚,
//其他8个字段引脚接端口B的0~7引脚
//在本人的AVR单片机最小系统通过,Arduino的引脚不够使

//数码管字符定义数组,共阳的。
uint8_t CA_digit_8[]=
{
        0xC0,//"0"
        0xF9,//"1"
        0xA4,//"2"
        0xB0,//"3"
        0x99,//"4"
        0x92,//"5"
        0x82,//"6"
        0xF8,//"7"
        0x80,//"8"
        0x98,//"9"
        0x88,//"A"
        0x83,//"B"
        0xC6,//"C"
        0xA1,//"D"
        0x86,//"E"
        0x8E,//"F"
        0x00//"8."
};

//数码管字符定义数组,共阴的。
/*
uint8_t CC_digit_8[]=
{
        0x3F,//"0"
        0x06,//"1"
        0x5B,//"2"
        0x4F,//"3"
        0x66,//"4"
        0x6D,//"5"
        0x7D,//"6"
        0x07,//"7"
        0x7F,//"8"
        0x67,//"9"
        0x77,//"A"
        0x7C,//"B"
        0x39,//"C"
        0x5E,//"D"
        0x79,//"E"
        0x71,//"F"
        0xFF//"8."
};
*/

void setup()
{
  DDRC = 0x3F;    //初始化端口C输出,用于位选
  DDRB = 0xFF;    //初始化端口B输出,用于数码管段
  PORTC = 0x00;
  PORTB = 0x00;
}

void loop()
{
  int i;
  PORTC = 0x01;    //选择端口C的引脚0
  while(1)
  {
    for (i = 0;i < 16; i++)    //循环
    {
      PORTB = CA_digit_8;  //0 ~ F 字符码
      delay(1000);            //延时1秒   
}
  }
}

是不是比Arduino 的引脚方式简单的多。感兴趣的话,我有更多的例程可介绍给大家。
回复 支持 反对

使用道具 举报

发表于 2016-3-25 18:04:09 | 显示全部楼层
arduino_ykk 发表于 2013-5-18 13:56
交作业咯。 数组没有必要定义在loop里面,否则每次循环都要重新开一点内存来放数组。可以放在整个方法外面啦 ...

讲得真好!谢谢!
回复 支持 反对

使用道具 举报

发表于 2016-5-9 17:20:54 | 显示全部楼层
不错,好评,下次再来
回复 支持 反对

使用道具 举报

发表于 2016-6-27 22:40:03 | 显示全部楼层

unsigned char number[]={252,96,2,3,4,5,6,7,8,9};

void setup() {
  int i;
  for(i=2;i<10;i++)
  {
    pinMode(i,OUTPUT);
    digitalWrite(i,1);
  }
}
//-------------主程序--------------------
void loop() {
  int i;
  for(i=0;i<10;i++) disLED(i);
}
//------------------------------------------
void disLED(char Num)
{
  int i;
  unsigned char j=number[Num];
  for(i=2;i<10;i++)
  {
    Serial.println(j);
    if(j/128==1)
    {
      digitalWrite(i,0);
    }
    j=j<<1;
  }
  delay(1000);
  for(i=2;i<10;i++) digitalWrite(i,1);
}
//是不是这样的代码更少
回复 支持 反对

使用道具 举报

发表于 2016-8-2 16:02:27 | 显示全部楼层
我也搞不懂那个PIN为什么要减3??求大神指教啊,我知道是很简单的问题,但就是不理解啊!!
void setup() {   
   for(int pin=3;pin<=10;pin++) //a,b,c,d,e,f,g,Dp对应引脚3,4,5,6,7,8,9,10
     pinMode(pin,OUTPUT);       //定义引脚为输出
}
void loop() {
  /*==========显示=============*/  
  //定义数组     a,b,c,d,e,f,g,dp
  int n[10][8]={1,1,1,1,1,1,0,0,    //0
                0,1,1,0,0,0,0,0,    //1
                1,1,0,1,1,0,1,0,    //2
                1,1,1,1,0,0,1,0,    //3
                0,1,1,0,0,1,1,0,    //4
                1,0,1,1,0,1,1,0,    //5
                1,0,1,1,1,1,1,0,    //6
                1,1,1,0,0,0,0,0,    //7
                1,1,1,1,1,1,1,0,    //8
                1,1,1,1,0,1,1,0,    //9
                };
  for(int num=0;num<=9;num++)
  {
    for(int pin=3;pin<=10;pin++)
      digitalWrite(pin,n[num][pin-3]);  //为何要-3,请大神指教。
    delay(500);
    }  
}
回复 支持 反对

使用道具 举报

发表于 2016-8-2 16:20:18 | 显示全部楼层
小白路过。
写的时候为了把pin(3~10)映射到数组n[10][0~7]所以每个值对应减了3.(这种写法不太好理解,值得改进)
即:pin 3         4            5 6 7 8 9 10
↓ n[10][3-3] n[10][4-3] ...
↓   n[10][0]    n[10][1]   ...
回复 支持 反对

使用道具 举报

发表于 2016-12-20 21:29:32 | 显示全部楼层
厉害了   自己试着写56789abc
回复 支持 反对

使用道具 举报

发表于 2016-12-25 17:55:01 | 显示全部楼层
本帖最后由 .js 于 2016-12-25 17:56 编辑

代码应该可以设置高亮吧

  1. /*
  2. * 作者:极客工坊-迷你强
  3. * 时间:2012年10月2日
  4. * IDE版本号:1.0.1
  5. * 发布地址:www.geek-workshop.com
  6. * 作用:arduino驱动数码管循环显示0,1,2,3,4几个数字
  7. */

  8. void setup()
  9. {
  10.         pinMode( 13, OUTPUT ); /* 激活13号引脚,我们需要用它供电 */

  11.         for ( int n = 2; n <= 9; n++ )
  12.         {
  13.                 pinMode( n, OUTPUT );
  14.         }
  15. }


  16. void loop()
  17. {
  18.         digitalWrite( 13, 1 );                          /* 这个就是HIGH  和LOW 的另一种写法  0代表LOW   1代表HIGH */


  19.         /*==========显示0=============*/
  20.         int        n0[8]        = { 0, 0, 0, 0, 0, 0, 1, 1 };   /* 定义数组 通过0,1定义各数码管的明灭, */
  21.         int        z        = 0;
  22.         for ( int x = 2; x <= 9; x++ )                  /* 采用循环方式依次点亮指定的数码管led(数组中0为点亮),单位时间只点亮1个led */
  23.         {
  24.                 digitalWrite( x, n0[z] );               /* 点亮led语句  X为引脚数  n0[z]为数组z为0-8的变量,来依次读取数组中的值 */
  25.                 z++;
  26.                 if ( z >= 9 )                           /* 防止变量z累加超过了8 */
  27.                         z = 0;
  28.         }
  29.         delay( 1000 );
  30. /*==========显示1=============*/
  31.         int n1[8] = { 1, 0, 0, 1, 1, 1, 1, 1 };
  32.         z = 0;
  33.         for ( int x = 2; x <= 9; x++ )
  34.         {
  35.                 digitalWrite( x, n1[z] );
  36.                 z++;
  37.                 if ( z >= 9 )
  38.                         z = 0;
  39.         }
  40.         delay( 1000 );
  41. /*==========显示2=============*/
  42.         int n2[8] = { 0, 0, 1, 0, 0, 1, 0, 1 };
  43.         z = 0;
  44.         for ( int x = 2; x <= 9; x++ )
  45.         {
  46.                 digitalWrite( x, n2[z] );
  47.                 z++;
  48.                 if ( z >= 9 )
  49.                         z = 0;
  50.         }
  51.         delay( 1000 );
  52. /*==========显示3=============*/
  53.         int n3[8] = { 0, 0, 0, 0, 1, 1, 0, 1 };
  54.         z = 0;
  55.         for ( int x = 2; x <= 9; x++ )
  56.         {
  57.                 digitalWrite( x, n3[z] );
  58.                 z++;
  59.                 if ( z >= 9 )
  60.                         z = 0;
  61.         }
  62.         delay( 1000 );
  63. /*==========显示4=============*/
  64.         int n4[8] = { 1, 0, 0, 1, 1, 0, 0, 1 };
  65.         z = 0;
  66.         for ( int x = 2; x <= 9; x++ )
  67.         {
  68.                 digitalWrite( x, n4[z] );
  69.                 z++;
  70.                 if ( z >= 9 )
  71.                         z = 0;
  72.         }
  73.         delay( 1000 );
  74. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 04:11 , Processed in 0.044588 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表