极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

楼主: 弘毅

arduino学习笔记13 - 4位数码管实验

  [复制链接]
发表于 2013-8-14 11:59:31 | 显示全部楼层
enzotim 发表于 2013-7-20 13:45
共阴代码。。。。。。。。。
//设置阴极接口

if (digitalRead(13) == LOW)

  {

    n = 0;

  }
请问这个是什么意思?可以使用if(n = 100000)啊
回复 支持 反对

使用道具 举报

发表于 2013-9-11 10:31:44 | 显示全部楼层
求问楼主。。。如何不用delay 来做延时,我想用timer做 但一直找不到资料 求指导
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-18 20:27:22 | 显示全部楼层
Ethan 发表于 2013-9-11 10:31
求问楼主。。。如何不用delay 来做延时,我想用timer做 但一直找不到资料 求指导

这个。。。。只能看AVR GCC了。。用atmel官方的IDE,里面有例程代码。。。
回复 支持 反对

使用道具 举报

发表于 2013-12-13 00:12:35 | 显示全部楼层
本帖最后由 旺旺哥 于 2013-12-13 00:16 编辑

求救求问楼主高手:怎嘛秒表显示4个0!不变化
回复 支持 反对

使用道具 举报

发表于 2013-12-13 00:17:26 | 显示全部楼层
庚影! 发表于 2013-7-6 21:45
用楼主的秒表代码出现一个问题 就是所有数值显示为0无法变化
稍微修改了下 能运行了 时间也不用去调整了
...

用你的的秒表代码出现一个问题 就是所有数值显示为0无法变化
回复 支持 反对

使用道具 举报

发表于 2014-2-17 19:51:16 | 显示全部楼层
本帖最后由 szlcw 于 2014-2-17 20:14 编辑

我将秒表的程序修改了一下:1、压缩了一下代码;2、改成精确定时;3、增加了一个按键,分为三个模式,停止(归零)、计时、暂停。

由于手头只有共阴极数码管,所以把代码全改为共阴极的了,接线图不变,增加一个按钮(加下拉电阻)接于A0口。
[pre lang="arduino" line="1" file="stopwatch"]
/*此数码管采用的是共阴极数码管*/
//设置阳极接口
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
int dp = 8;
//设置阴极接口
int d4 = 9;
int d3 = 10;
int d2 = 11;
int d1 = 12;
//设置变量
long n = 0;

byte pos_segs[8] = { a, b, c, d, e, f, g, dp};
byte neg_segs[4] = { d1, d2, d3, d4 };
byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },  // = 0
                                 { 0,1,1,0,0,0,0 },  // = 1
                                 { 1,1,0,1,1,0,1 },  // = 2
                                 { 1,1,1,1,0,0,1 },  // = 3
                                 { 0,1,1,0,0,1,1 },  // = 4
                                 { 1,0,1,1,0,1,1 },  // = 5
                                 { 1,0,1,1,1,1,1 },  // = 6
                                 { 1,1,1,0,0,0,0 },  // = 7
                                 { 1,1,1,1,1,1,1 },  // = 8
                                 { 1,1,1,1,0,1,1 }   // = 9
                             };
//上次运行时间
unsigned long previousMillis = 0;
//最小时间间隔
int INTERVAL = 100;
//flag代表三种模式,0则停止(归零),1则计时,2则暂停
int flag = 0;
//模拟口A0
int BUTTON = 0;
void setup()
{
  for(int i=0;i<4;i++)
    pinMode(neg_segs, OUTPUT);
  for(int i=0;i<8;i++)
    pinMode(pos_segs, OUTPUT);  
}

void loop()
{
  if(flag == 0)//停止(归零)模式
  {
    clearLEDs();
    keyScan();
    n=0;
    previousMillis=millis();
  }
  else
  {
    if(flag == 1)//计时模式
    {
      unsigned long currentMillis=millis();//当前运行时间
      if(currentMillis - previousMillis >= INTERVAL)
      {
        n++;
        previousMillis=currentMillis;
      }
    }
   
    clearLEDs();
    pickDigit(1);
    lightSegments((n/1000)%10);
   
    clearLEDs();
    pickDigit(2);
    lightSegments((n/100)%10);
   
    clearLEDs();
    pickDigit(3);
    dispDec(3);
    lightSegments((n/10)%10);
   
    clearLEDs();
    pickDigit(4);
    lightSegments(n%10);
   
    keyScan();
  }
}

void pickDigit(int x)  //定义pickDigit(x),其作用是开启dx端口
{
  for(int i=0;i<4;i++)
  {
    if(i == (x-1))
      digitalWrite(neg_segs, LOW);
    else
      digitalWrite(neg_segs, HIGH);   
  }
}

//设定开启小数点
void dispDec(int x)  
{
  digitalWrite(dp, HIGH);
}

//清屏
void clearLEDs()  
{
  for (int i = 0; i < 8; i++)
    digitalWrite(pos_segs, LOW);
}


// 点亮对应数字的数码管
void lightSegments(int x)
{
  for (int i = 0; i < 7; i++)
  {
    digitalWrite(pos_segs, seven_seg_digits[x]);
  }
}

//按键扫描
void keyScan()
{
  if(analogRead(BUTTON)>600)
   {
     delay(20);
     if(analogRead(BUTTON)>600)
     {
       flag++;
       if(flag>=3)
         flag=0;
       while(analogRead(BUTTON)>600);
     }
   }
}[/code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-2-23 20:46:53 | 显示全部楼层
关于您在“arduino学习笔记13 - 4位数码管实验”的帖子
void loop()
{
  clearLEDs();
  pickDigit(1);
  lightSegments((n/x/1000)%10);
  delayMicroseconds(del);

  clearLEDs();
  pickDigit(2);
  lightSegments((n/x/100)%10);
  delayMicroseconds(del);

  clearLEDs();
  pickDigit(3);
  dispDec(3);
  lightSegments((n/x/10)%10);
  delayMicroseconds(del);

  clearLEDs();
  pickDigit(4);
  lightSegments(n/x%10);
  delayMicroseconds(del);

  n++;

  if (digitalRead(13) == HIGH)
  {
    n = 0;
  }
}

数码管驱动代码里的   if (digitalRead(13) == HIGH) 是什么意义呢?为什么13脚高电平就n=0? 怎么理解?另外  lightSegments((n/x/100)%10); 用处是不是设置显示位数?不太明白,弘毅老师能不能解答一下,谢谢啦!
回复 支持 反对

使用道具 举报

发表于 2014-2-25 13:12:15 | 显示全部楼层
终于明白了, 就是求余计算.
回复 支持 反对

使用道具 举报

发表于 2014-4-13 20:02:19 | 显示全部楼层
引脚没看懂。。。
回复 支持 反对

使用道具 举报

发表于 2014-5-4 17:24:44 | 显示全部楼层
给楼主点赞!
回复 支持 反对

使用道具 举报

发表于 2014-11-17 13:13:59 | 显示全部楼层
SEGSEG.H能可以吗
回复 支持 反对

使用道具 举报

发表于 2014-12-8 19:42:16 | 显示全部楼层
xzmoji 发表于 2012-7-3 07:56
跟2楼一样,我也没看懂(n/x/1000)%10

我也是呀,这是什么道理,求解答
回复 支持 反对

使用道具 举报

发表于 2014-12-12 19:12:30 | 显示全部楼层
我想要在第二个实验上再多加一个蜂鸣器,把源代码改成99秒倒计时,在到50秒时,蜂鸣器每隔500毫秒响一次,到30秒时蜂鸣器每隔100毫秒响一次,怎么办?求源代码和电路图
回复 支持 反对

使用道具 举报

发表于 2015-1-19 14:14:42 | 显示全部楼层
我用4片595级联4个数码管 然后用4个数字IO 接4个按键,在按下当按键的时候 数码管 显示一组数字   ,功能正常 但是在用手触摸 按键引脚的时候会出现数码管显示 变乱的情况  有没有办法解决
回复 支持 反对

使用道具 举报

发表于 2015-5-28 21:35:12 | 显示全部楼层
为何我的秒表程序 跑到32以后就乱码了,过一会有自动重新开始??谁能帮帮我呀?
  1. //shezhi yanjijiekou
  2. int a = 6;
  3. int b = 7;
  4. int c = 8;
  5. int d = 9;
  6. int e = 10;
  7. int f = 11;
  8. int g = 12;
  9. int p = 13;
  10. //shezhi yinjijiekou
  11. int d1 = 2;
  12. int d2 = 3;
  13. int d3 = 4;
  14. int d4 = 5;

  15. int smgyanjin[7] = {a,b,c,d,e,f,g};
  16. byte smgshuzu[10][7] = {
  17.                        {1,1,1,1,1,1,0},
  18.                        {0,1,1,0,0,0,0},
  19.                        {1,1,0,1,1,0,1},
  20.                        {1,1,1,1,0,0,1},
  21.                        {0,1,1,0,0,1,1},
  22.                        {1,0,1,1,0,1,1},
  23.                        {1,0,1,1,1,1,1},
  24.                        {1,1,1,0,0,0,0},
  25.                        {1,1,1,1,1,1,1},
  26.                        {1,1,1,1,0,1,1}
  27.                        };


  28. void setup()
  29. {
  30.     for(int x = 2;x <= 13;x ++)
  31.     {
  32.         pinMode(x,OUTPUT);
  33.     }
  34.     for(int x = 6;x <= 13;x ++)
  35.     {
  36.         digitalWrite(x,LOW);
  37.     }
  38. }

  39. void pickdigit(int x)
  40. {
  41.     for(int i = 2;i <= 5;i ++)
  42.     {
  43.         digitalWrite(i,HIGH);
  44.     }
  45.     switch(x)
  46.     {
  47.       case 1:
  48.       digitalWrite(d1,LOW);
  49.       break;
  50.       case 2:
  51.       digitalWrite(d2,LOW);
  52.       break;
  53.       case 3:
  54.       digitalWrite(d3,LOW);
  55.       break;
  56.       case 4:
  57.       digitalWrite(d4,LOW);
  58.       break;
  59.     }
  60. }

  61. void clearLEDs()
  62. {
  63.     for(int x = 6;x <= 13;x ++)
  64.     {
  65.         digitalWrite(x,LOW);
  66.     }
  67. }
  68. void xiaoshudian()
  69. {
  70.     digitalWrite(p,HIGH);
  71. }
  72. void smgshuzi(int x)
  73. {
  74.     for(int i = 0;i < 7;i ++)
  75.     {
  76.         digitalWrite(smgyanjin[i],smgshuzu[x][i]);//xianshishuzi
  77.     }
  78. }
  79. int del = 55;
  80. int n = 0;
  81. void loop()
  82. {
  83.     clearLEDs();
  84.     pickdigit(1);
  85.     smgshuzi((n/100/10000)%10);
  86.     delayMicroseconds(del);
  87.     clearLEDs();
  88.     pickdigit(2);
  89.     smgshuzi((n/100/100)%10);
  90.     delayMicroseconds(del);
  91.     clearLEDs();
  92.     pickdigit(3);
  93.     smgshuzi((n/100/10)%10);
  94.     xiaoshudian();
  95.     delayMicroseconds(del);
  96.     clearLEDs();
  97.     pickdigit(4);
  98.     smgshuzi((n/100)%10);
  99.     delayMicroseconds(del);
  100.     n++;
  101.    
  102.    
  103. }
复制代码
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 23:12 , Processed in 0.050527 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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