小日月 发表于 2013-8-14 11:59:31

enzotim 发表于 2013-7-20 13:45 static/image/common/back.gif
共阴代码。。。。。。。。。
//设置阴极接口



if (digitalRead(13) == LOW)

{

    n = 0;

}
请问这个是什么意思?可以使用if(n = 100000)啊

Ethan 发表于 2013-9-11 10:31:44

求问楼主。。。如何不用delay 来做延时,我想用timer做 但一直找不到资料 求指导

弘毅 发表于 2013-9-18 20:27:22

Ethan 发表于 2013-9-11 10:31 static/image/common/back.gif
求问楼主。。。如何不用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 static/image/common/back.gif
用楼主的秒表代码出现一个问题 就是所有数值显示为0无法变化
稍微修改了下 能运行了 时间也不用去调整了
...

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

szlcw 发表于 2014-2-17 19:51:16

本帖最后由 szlcw 于 2014-2-17 20:14 编辑

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

由于手头只有共阴极数码管,所以把代码全改为共阴极的了,接线图不变,增加一个按钮(加下拉电阻)接于A0口。

/*此数码管采用的是共阴极数码管*/
//设置阳极接口
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 = { a, b, c, d, e, f, g, dp};
byte neg_segs = { d1, d2, d3, d4 };
byte seven_seg_digits = { { 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);
}
}

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

活着就是幸福 发表于 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

引脚没看懂。。。:dizzy::dizzy::dizzy:

kradnangel 发表于 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 static/image/common/back.gif
跟2楼一样,我也没看懂(n/x/1000)%10

我也是呀,这是什么道理,求解答

雨未停_ 发表于 2014-12-12 19:12:30

我想要在第二个实验上再多加一个蜂鸣器,把源代码改成99秒倒计时,在到50秒时,蜂鸣器每隔500毫秒响一次,到30秒时蜂鸣器每隔100毫秒响一次,怎么办?求源代码和电路图

yh54576063 发表于 2015-1-19 14:14:42

我用4片595级联4个数码管 然后用4个数字IO 接4个按键,在按下当按键的时候 数码管 显示一组数字   ,功能正常 但是在用手触摸 按键引脚的时候会出现数码管显示 变乱的情况有没有办法解决

小华盛顿 发表于 2015-5-28 21:35:12

为何我的秒表程序 跑到32以后就乱码了,过一会有自动重新开始??谁能帮帮我呀?//shezhi yanjijiekou
int a = 6;
int b = 7;
int c = 8;
int d = 9;
int e = 10;
int f = 11;
int g = 12;
int p = 13;
//shezhi yinjijiekou
int d1 = 2;
int d2 = 3;
int d3 = 4;
int d4 = 5;

int smgyanjin = {a,b,c,d,e,f,g};
byte smgshuzu = {
                     {1,1,1,1,1,1,0},
                     {0,1,1,0,0,0,0},
                     {1,1,0,1,1,0,1},
                     {1,1,1,1,0,0,1},
                     {0,1,1,0,0,1,1},
                     {1,0,1,1,0,1,1},
                     {1,0,1,1,1,1,1},
                     {1,1,1,0,0,0,0},
                     {1,1,1,1,1,1,1},
                     {1,1,1,1,0,1,1}
                     };


void setup()
{
    for(int x = 2;x <= 13;x ++)
    {
      pinMode(x,OUTPUT);
    }
    for(int x = 6;x <= 13;x ++)
    {
      digitalWrite(x,LOW);
    }
}

void pickdigit(int x)
{
    for(int i = 2;i <= 5;i ++)
    {
      digitalWrite(i,HIGH);
    }
    switch(x)
    {
      case 1:
      digitalWrite(d1,LOW);
      break;
      case 2:
      digitalWrite(d2,LOW);
      break;
      case 3:
      digitalWrite(d3,LOW);
      break;
      case 4:
      digitalWrite(d4,LOW);
      break;
    }
}

void clearLEDs()
{
    for(int x = 6;x <= 13;x ++)
    {
      digitalWrite(x,LOW);
    }
}
void xiaoshudian()
{
    digitalWrite(p,HIGH);
}
void smgshuzi(int x)
{
    for(int i = 0;i < 7;i ++)
    {
      digitalWrite(smgyanjin,smgshuzu);//xianshishuzi
    }
}
int del = 55;
int n = 0;
void loop()
{
    clearLEDs();
    pickdigit(1);
    smgshuzi((n/100/10000)%10);
    delayMicroseconds(del);
    clearLEDs();
    pickdigit(2);
    smgshuzi((n/100/100)%10);
    delayMicroseconds(del);
    clearLEDs();
    pickdigit(3);
    smgshuzi((n/100/10)%10);
    xiaoshudian();
    delayMicroseconds(del);
    clearLEDs();
    pickdigit(4);
    smgshuzi((n/100)%10);
    delayMicroseconds(del);
    n++;
   
   
}
页: 1 2 [3] 4
查看完整版本: arduino学习笔记13 - 4位数码管实验