7244浏览
查看: 7244|回复: 3

[进阶] Arduino数码管骰子实验

[复制链接]
放一段非常简单的Arduino数码管骰子实验代码。


电路连接

由于数码管品种多样,还有共阴共阳的,下面我们使用一个数码管段码生成器(在文章结尾)去解决不同数码管的问题:
本例作者利用手头现有的一位不知品牌的共阳数码管:型号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. }
复制代码

附件中下载段码生成器以及本例源代码

生成器以及本例源代码.rar

317.26 KB, 下载次数: 2612

luna  初级技神

发表于 2015-2-10 16:08:05

教程很清晰,回去试试
回复

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2015-2-10 17:58:19

luna 发表于 2015-2-10 16:08
教程很清晰,回去试试

看看哪里还可以改进的呢
回复

使用道具 举报

Youyou  初级技匠

发表于 2015-2-14 20:06:34

这貌似是传说中的静态扫描法,数码管多的话,可以使用动态扫描法。
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail