小日月
发表于 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++;
}