极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 77014|回复: 19

Arduino学习笔记A10 - Arduino数码管骰子实验

[复制链接]
发表于 2011-12-28 22:25:53 | 显示全部楼层 |阅读模式
Arduino数码管骰子实验

看到特高科的数码管骰子http://www.geek-workshop.com/forum.php?mod=viewthread&tid=76写的太极品了,忍不住改一下。这个应该是非常简单的代码了,欢迎挑战更短写法(一行多语句的不算){:soso_e120:} 。

电路连接

由于数码管品种多样,还有共阴共阳的,下面我们使用一个数码管段码生成器(在文章结尾)去解决不同数码管的问题:

本例作者利用手头现有的一位不知品牌的共阳数码管:型号D5611 A/B,在Eagle找了一个类似的型号SA56-11,引脚功能一样可以直接代换。所以下面电路图使用SA56-11做引脚说明。



注意:

1. 将数码管的a~g段,分别接到Arduino的D0~D6上面。如果你手上的数码管未知的话,可以通过通电测量它哪个引脚对应哪个字段,然后找出a~g即可。
2. 分清共阴还是共阳。共阴的话,接220Ω电阻到电源负极;共阳的话,接220Ω电阻到电源+5v。3. 220Ω电阻视数码管实际工作亮度与手头现有原件而定,不一定需要准确。
4. 按下按钮即停。




源代码

由于我是按照段码生成器默认接法接的,所以不用修改段码生成器了,直接在段码生成器选择共阳极,再按“自动”生成数组就搞定。


下面是源代码,由于偷懒不用写循环,使用了部分AVR语句。

PORTD这个是AVR的端口输出控制语句,8位对应D7~D0,PORTD=00001001就是D3和D0是高电平。

PORTD = a;就是找出相应的段码输出到D7~D0。

DDRD这个是AVR语句中控制引脚作为输出/输入的语句。DDRD = 0xFF;就是D0~D7全部作为输出脚了。

  1. /*
  2. Arduino单数码管骰子
  3. Ansifa 2011-12-28
  4. */

  5. //定义段码表,表中十个元素由LED段码生成器生成,选择了共阳极。
  6. int a[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
  7. void setup()
  8. {
  9.     DDRD = 0xFF;          //AVR定义PortD的低七位全部用作输出使用。即0xFF=B11111111对应D7~D0
  10.     pinMode(12, INPUT);    //D12用来做骰子暂停的开关
  11. }
  12. void loop()
  13. {
  14.     for(int i = 0; i < 10; i++)
  15.     {
  16.         //将段码输出PortD的低7位,即Arduino的引脚D0~D6,这样需要取出PORTD最高位,即D7的状态,与段码相加,之后再输出。
  17.         PORTD = a[i];
  18.         delay(50);        //延时50ms
  19.         while(digitalRead(12)) {}        //如果D12引脚高电平,则在此死循环,暂停LED跑动
  20.     }
  21. }


复制代码
实物演示视频

夜间摄像头拍摄的,质量可能比较差。仅供感性认识参考
还有,笔者录视频的时候手头没有220Ω电阻,随便抓了一个LED做电阻降压,效果一样,凑合看吧。

(优酷还要审核-_-)


下面是段码生成器以及本例源代码:


本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2011-12-30 09:31:47 | 显示全部楼层
这个应该是非常简单的代码了,欢迎挑战更短写法(一行多语句的不算) 。

看到这句我笑了,楼主真幽默,又有技术。赞一个
回复 支持 反对

使用道具 举报

发表于 2011-12-30 09:45:03 | 显示全部楼层
楼主老大,我想向你请教一个问题,ARDUINO是不是也可以像普通语句PORTA=0XFF;这样之类的赋值呢?我在我们论坛的求助区里问的好像就是这个问题,哈哈。好高兴啊好高兴!谢谢你这贴子带给我的启示哦。谢谢!http://www.geek-workshop.com/for ... &extra=page%3D1
回复 支持 反对

使用道具 举报

发表于 2012-2-26 03:03:26 | 显示全部楼层
プ汏坏疍 发表于 2011-12-30 09:45
楼主老大,我想向你请教一个问题,ARDUINO是不是也可以像普通语句PORTA=0XFF;这样之类的赋值呢?我在我们论 ...

可以的,这么写就是揭开了arduino的外衣,归还了AVR的本质
你看digitalWrite之类的就是这么来的
回复 支持 反对

使用道具 举报

发表于 2012-5-3 12:25:05 | 显示全部楼层
AVR原生端口操作~~
回复 支持 反对

使用道具 举报

发表于 2012-5-24 14:52:25 | 显示全部楼层
int a[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
void setup()
{
    DDRD = 0xFF;          //AVR定义PortD的低七位全部用作输出使用。即0xFF=B11111111对应D7~D0
    pinMode(12, INPUT);    //D12用来做骰子暂停的开关
}
void loop()
{
    //for(int i = 0; i < 10; i++)
    //{
        //将段码输出PortD的低7位,即Arduino的引脚D0~D6,这样需要取出PORTD最高位,即D7的状态,与段码相加,之后再输出。
        PORTD = a[random(10)]; //one
        delay(50);        //延时50ms
        while(digitalRead(12)) {}        //如果D12引脚高电平,则在此死循环,暂停LED跑动
    //}
}

评分

参与人数 1 +15 收起 理由
Ansifa + 15 这个换成了随机数,有创意,不过实际效果差.

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2012-5-24 14:54:44 | 显示全部楼层
int a[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};
int i=0;
void setup()
{
    DDRD = 0xFF;          //AVR定义PortD的低七位全部用作输出使用。即0xFF=B11111111对应D7~D0
    pinMode(12, INPUT);    //D12用来做骰子暂停的开关
}
void loop()
{
    //for(int i = 0; i < 10; i++)
    //{
        //将段码输出PortD的低7位,即Arduino的引脚D0~D6,这样需要取出PORTD最高位,即D7的状态,与段码相加,之后再输出。
        PORTD = a[i++%10]; //tow
        delay(50);        //延时50ms
        while(digitalRead(12)) {}        //如果D12引脚高电平,则在此死循环,暂停LED跑动
    //}
}
回复 支持 反对

使用道具 举报

发表于 2012-8-23 14:52:04 | 显示全部楼层
感谢分享啊,又学到了一招
回复 支持 反对

使用道具 举报

发表于 2012-9-20 09:40:02 | 显示全部楼层
好东西,感谢楼主分享~
回复 支持 反对

使用道具 举报

发表于 2013-5-15 20:54:43 | 显示全部楼层
感谢 感谢。。
回复 支持 反对

使用道具 举报

发表于 2013-10-30 22:00:38 | 显示全部楼层
你好,我想问一下,如果只是想定义D0---D4需要高电平,而D5--D7不想定义,那如何用PORTD定义?
回复 支持 反对

使用道具 举报

发表于 2013-11-1 14:23:55 | 显示全部楼层
感谢分享,挺不错。
回复 支持 反对

使用道具 举报

发表于 2013-12-31 17:23:46 | 显示全部楼层
又学习了一个案例,呵呵。
回复 支持 反对

使用道具 举报

发表于 2014-5-4 21:06:19 | 显示全部楼层
骰子要是能延时自停就好了.
回复 支持 反对

使用道具 举报

发表于 2014-5-6 19:54:14 | 显示全部楼层
{:soso_e142:}
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 12:21 , Processed in 0.048268 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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