极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 38672|回复: 8

Arduino 4位数码管按键计数器

[复制链接]
发表于 2013-5-30 22:52:45 | 显示全部楼层 |阅读模式
本帖最后由 conjee 于 2013-5-30 22:53 编辑

Arduino 4位数码管按键计数器,支持断电存储。
学习要点:
       1.数码管编码,及扫描输出。
       2.中断使用。
       3.EEPROM 写入long型数据。(参考论坛文章)


效果图:


视频:


接线图:


完整代码:
  1. #include <avr/eeprom.h>

  2. #define EEPROM_write(address, var) eeprom_write_block((const void *)&(var), (void *)(address), sizeof(var))  //EEPROM支持long 占用4字节
  3. #define EEPROM_read(address, var) eeprom_read_block((void *)&(var), (const void *)(address), sizeof(var))  //EEPROM支持long 占用4字节

  4. #define  PinA 2  //中断0
  5. #define led1  1
  6. #define led2  3
  7. #define led3  4
  8. #define led4  5

  9. #define da  6
  10. #define db  7
  11. #define dc  8
  12. #define dd  9
  13. #define de 10
  14. #define df 11
  15. #define dg 12
  16. #define dp 13


  17. long count ;

  18. unsigned long time = 0;
  19. int data[11] = {0x3f, 0x06, 0x5b, 0x4f,  0x66,  0x6d,  0x7d,  0x07,  0x7f, 0x6f, 0x80};   

  20. // the setup routine runs once when you press reset:
  21. void setup() {               
  22.    pinMode(PinA,INPUT);
  23.    
  24. //  for(int i = 0; i < 4; i++)
  25. //        disValue.dchar[i] = EEPROM.read(i);
  26.    EEPROM_read(0, count);
  27.   // count = 0;
  28.   // EEPROM_write(0,  count);
  29.    attachInterrupt(0, runCount, FALLING);    //设置触发,中断号0,即数字2口

  30.   
  31.     pinMode(led1, OUTPUT);
  32.     pinMode(led2, OUTPUT);
  33.     pinMode(led3, OUTPUT);
  34.     pinMode(led4, OUTPUT);
  35.    
  36.     digitalWrite(led1, HIGH);  
  37.     digitalWrite(led2, HIGH);  
  38.     digitalWrite(led3, HIGH);  
  39.     digitalWrite(led4, HIGH);  
  40.    
  41.    for(int i=6; i < 14; i++){
  42.         pinMode(i, OUTPUT);  
  43.    
  44. }
  45.   
  46.   ledTest();
  47.   
  48. }

  49. void runCount()            //触发函数
  50. {

  51. if ((millis() - time) > 150) //防抖动处理
  52. {
  53.     count ++;
  54.       //for(int i = 0; i < 4; i++) {
  55.        //  EEPROM.write(i,  *dpointer);
  56.         EEPROM_write(0,  count);
  57.       //   dpointer++;
  58.      // }
  59.      
  60. }
  61.         
  62. time = millis();

  63. }

  64. //led test 初始测试
  65. void ledTest(){

  66.     digitalWrite(led1, LOW);  
  67.     digitalWrite(led2, LOW);  
  68.     digitalWrite(led3, LOW);  
  69.     digitalWrite(led4, LOW);  
  70.   
  71.    for(int i=0; i < 11; i++){
  72.       ledOut(led1, i );
  73.       delay(200);
  74. }

  75.   selecLed(led1);
  76.   ledOut(led1, 0 );

  77. }

  78. //select LED 选择对应的数码位
  79. void selecLed(int led){
  80.   for(int i=1; i < 5; i++){
  81.     int t = i>1?i+1:1;
  82.     if( t == led){
  83.       digitalWrite(t, LOW);
  84.     }else {
  85.        digitalWrite(t, HIGH);
  86.     }      
  87.   }
  88. }

  89. //led out 单个显示
  90. void ledOut(int ledSelect, int td){
  91.        digitalWrite(ledSelect, LOW);
  92.        int  set = 0x01;
  93.        for(int i=6; i<14; i++){
  94.               int dis =data[td] & set;
  95.                 digitalWrite(i, dis);
  96.               set = set<<1;
  97.        }
  98. }

  99. //led display
  100. void ledDisplay(unsigned long d){
  101.   int d1 = d%10;
  102.   int d2 = (d/10)%10;
  103.   int d3= (d/100)%10;
  104.   int d4= d/1000;
  105.    if(d<10){
  106.          selecLed(led1);
  107.          ledOut(led1, d1);
  108.     }else if(d >=10 && d < 100){
  109.          selecLed(led1);
  110.          ledOut(led1, d1);
  111.          delay(10);
  112.          selecLed(led2);
  113.          ledOut(led2, d2);
  114.            delay(10);
  115.     }else if(d >=100 && d < 1000){
  116.         selecLed(led1);
  117.          ledOut(led1, d1);
  118.          delay(7);
  119.          selecLed(led2);
  120.          ledOut(led2, d2);
  121.            delay(8);
  122.         selecLed(led3);
  123.          ledOut(led3, d3);
  124.           delay(9);
  125.     }else if(d >=1000 && d < 10000){
  126.         selecLed(led1);
  127.          ledOut(led1, d1);
  128.          delay(5);
  129.          selecLed(led2);
  130.          ledOut(led2, d2);
  131.            delay(6);
  132.         selecLed(led3);
  133.          ledOut(led3, d3);
  134.           delay(7);
  135.         selecLed(led4);
  136.          ledOut(led4, d4);
  137.          delay(8);
  138.     }
  139.   
  140. }


  141. // the loop routine runs over and over again forever:
  142. void loop() {

  143.        ledDisplay(count);   //显示值
  144.       
  145.   
  146. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-5-31 10:28:07 | 显示全部楼层
Arduino 玩数码管 总觉得 管脚不够用 不如51管脚多。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-31 10:48:29 | 显示全部楼层
ro0t 发表于 2013-5-31 10:28
Arduino 玩数码管 总觉得 管脚不够用 不如51管脚多。。。

恩,可以用一个595扩展一下或两个373数据和片选复用。
回复 支持 反对

使用道具 举报

发表于 2013-6-1 09:33:03 | 显示全部楼层
ro0t 发表于 2013-5-31 10:28
Arduino 玩数码管 总觉得 管脚不够用 不如51管脚多。。。

总线))))
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-1 13:09:25 | 显示全部楼层
本帖最后由 conjee 于 2013-6-1 13:10 编辑
friskit 发表于 2013-6-1 09:33
总线))))



可以使用595芯片,能省下5个IO口,
效果图如下:


用595芯片后程序如下:
  1. #include <avr/eeprom.h>

  2. #define EEPROM_write(address, var) eeprom_write_block((const void *)&(var), (void *)(address), sizeof(var))
  3. #define EEPROM_read(address, var) eeprom_read_block((void *)&(var), (const void *)(address), sizeof(var))
  4. #define uchar unsigned char

  5. #define  PinA 2  //中断0
  6. #define led1  1
  7. #define led2  3
  8. #define led3  4
  9. #define led4  5

  10. #define da  6
  11. #define db  7

  12. #define dc  8
  13. #define DataOUT 8
  14. #define DataSTB 9
  15. #define DataCLK 10

  16. #define dd  9
  17. #define de 10

  18. #define df 11
  19. #define dg 12
  20. #define dp 13

  21. int subPin = A1;


  22. int keyValue = 1024;

  23. long count ;

  24. unsigned long time = 0;
  25. uchar data[11] = {0x3f, 0x06, 0x5b, 0x4f,  0x66,  0x6d,  0x7d,  0x07,  0x7f, 0x6f, 0x80};   

  26. // the setup routine runs once when you press reset:
  27. void setup() {               
  28.    pinMode(PinA,INPUT);
  29.    
  30. //  for(int i = 0; i < 4; i++)
  31. //        disValue.dchar[i] = EEPROM.read(i);
  32.    EEPROM_read(0, count);
  33.   // count = 0;
  34.   // EEPROM_write(0,  count);
  35.    attachInterrupt(0, runCount, FALLING);    //设置触发,中断号0,即数字2口

  36.   
  37.     pinMode(led1, OUTPUT);
  38.     pinMode(led2, OUTPUT);
  39.     pinMode(led3, OUTPUT);
  40.     pinMode(led4, OUTPUT);
  41.    
  42.     digitalWrite(led1, HIGH);  
  43.     digitalWrite(led2, HIGH);  
  44.     digitalWrite(led3, HIGH);  
  45.     digitalWrite(led4, HIGH);  
  46.    
  47.    for(int i=6; i < 14; i++){
  48.         pinMode(i, OUTPUT);  
  49.    
  50. }
  51.   
  52.   ledTest();
  53.   
  54. }

  55. void runCount()            //触发函数
  56. {

  57. if ((millis() - time) > 150) //防抖动处理
  58. {
  59.    
  60.    keyValue = analogRead(subPin);
  61.    
  62.   if( keyValue < 500){
  63.     count--;
  64.     keyValue = 1023;
  65.   }else{
  66.     count ++;
  67.   }

  68.       //for(int i = 0; i < 4; i++) {
  69.        //  EEPROM.write(i,  *dpointer);
  70.         EEPROM_write(0,  count);
  71.       //   dpointer++;
  72.      // }
  73.      
  74. }
  75.         
  76. time = millis();

  77. }

  78. //led test
  79. void ledTest(){

  80.     digitalWrite(led1, LOW);  
  81.     digitalWrite(led2, LOW);  
  82.     digitalWrite(led3, LOW);  
  83.     digitalWrite(led4, LOW);  
  84.   
  85.    for(int i=0; i < 11; i++){
  86.       ledOut(led1, i );
  87.       delay(200);
  88. }

  89.   selecLed(led1);
  90.   ledOut(led1, 0 );

  91. }

  92. //select LED
  93. void selecLed(int led){
  94.   for(int i=1; i < 5; i++){
  95.     int t = i>1?i+1:1;
  96.     if( t == led){
  97.       digitalWrite(t, LOW);
  98.     }else {
  99.        digitalWrite(t, HIGH);
  100.     }      
  101.   }
  102. }

  103. //led out
  104. void ledOut(int ledSelect, int td){
  105.     //   digitalWrite(ledSelect, LOW);
  106.        int  set = 0x01;
  107.       
  108.        /** not use 595
  109.        for(int i=6; i<14; i++){
  110.               int dis =data[td] & set;
  111.               digitalWrite(i, dis);
  112.               set = set<<1;
  113.        } */
  114.         
  115.         //use 595
  116.         
  117.        // int testData = 0x9f;
  118.       //  uchar testData = 0x06;
  119.       
  120.         //testData =~testData;
  121.          
  122.        for(int i=0; i<8; i++){
  123.               digitalWrite(DataCLK, 0);
  124.               
  125.               uchar dis =data[td] & set;
  126.                
  127.               digitalWrite(DataOUT, dis);
  128.               
  129.               set = set<<1;
  130.             
  131.               digitalWrite(DataCLK,1);
  132.               
  133.        }
  134.         digitalWrite(DataSTB, 0);      //595刷新            
  135.               digitalWrite(DataSTB, 1);   

  136. }

  137. //led display
  138. void ledDisplay(unsigned long d){
  139.   int d1 = d%10;
  140.   int d2 = (d/10)%10;
  141.   int d3= (d/100)%10;
  142.   int d4= d/1000;
  143.    if(d<10){
  144.          selecLed(led1);
  145.          ledOut(led1, d1);
  146.     }else if(d >=10 && d < 100){
  147.          selecLed(led1);
  148.          ledOut(led1, d1);
  149.          delay(10);
  150.          selecLed(led2);
  151.          ledOut(led2, d2);
  152.           delay(10);
  153.     }else if(d >=100 && d < 1000){
  154.         selecLed(led1);
  155.          ledOut(led1, d1);
  156.          delay(7);
  157.          selecLed(led2);
  158.          ledOut(led2, d2);
  159.          delay(8);
  160.         selecLed(led3);
  161.          ledOut(led3, d3);
  162.          delay(9);
  163.     }else if(d >=1000 && d < 10000){
  164.         selecLed(led1);
  165.          ledOut(led1, d1);
  166.          delay(5);
  167.          selecLed(led2);
  168.          ledOut(led2, d2);
  169.            delay(6);
  170.         selecLed(led3);
  171.          ledOut(led3, d3);
  172.           delay(7);
  173.         selecLed(led4);
  174.          ledOut(led4, d4);
  175.          delay(8);
  176.     }
  177.   
  178. }


  179. // the loop routine runs over and over again forever:
  180. void loop() {

  181.        ledDisplay(count);   
  182.      
  183.   
  184. }
复制代码

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2013-6-2 08:13:26 | 显示全部楼层
学习啦,那个595芯片能不能详细介绍一下,电路图。
回复 支持 反对

使用道具 举报

发表于 2014-4-9 23:08:45 | 显示全部楼层
求实验原理图和接线图,新手学习用
回复 支持 反对

使用道具 举报

发表于 2015-5-6 12:59:14 | 显示全部楼层
高手们,能给一个电路的接线图吗
回复 支持 反对

使用道具 举报

发表于 2015-5-10 13:39:31 | 显示全部楼层
库文件在哪儿有啊
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 01:57 , Processed in 0.042785 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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