简单电路:点击按键循环计数(0~9)

这个功能分了两种实现方式, 第一种是我自己琢磨着实现的, 第二种是看了《爱上Arduino》后悟到了些什么,有把电路和程序修改了一下。


在“实现2”中有一点点问题,在《爱上Arduino》中给按钮串接了一个10K的电阻,而后又接到了GND端,这个的作用是什么呢?

实现1
使用模拟信息输入,导致按钮传达的信息不准确(好像是变成了感应开关似的),有时手还没有碰到按钮数字就飞速的变化起来了。小小的修改了一下程序,现在好些了,但还是不理想,还是用第二种实现方式效果比较好。


电路:

演示视频:

http://v.youku.com/v_show/id_XNDU0OTA5NDU2.html


程序:

/*
  a  b  c  d  e  f  g  dp
  7  6  5  10 11 8  9  4
*/
int map_led [8] = {
  7, 6, 5, 10, 11, 8, 9, 4
};
int map_table [10][8] = {
  {0, 0, 0, 0, 0, 0, 1, 1},   // 0
  {1, 0, 0, 1, 1, 1, 1, 1},   // 1
  {0, 0, 1, 0, 0, 1, 0, 1},   // 2
  {0, 0, 0, 0, 1, 1, 0, 1},   // 3
  {1, 0, 0, 1, 1, 0, 0, 1},   // 4
  {0, 1, 0, 0, 1, 0, 0, 1},   // 5
  {0, 1, 0, 0, 0, 0, 0, 1},   // 6
  {0, 0, 0, 1, 1, 1, 1, 1},   // 7
  {0, 0, 0, 0, 0, 0, 0, 1},   // 8
  {0, 0, 0, 0, 1, 0, 0, 1}    // 9
};
 
 
int num = 0;
int down;
int up;
int stat;
 
void setup() {
  int j;
  for (j = 4; j <=11; j++) {
    pinMode(j, OUTPUT);
  }
  for (j = 4; j <=11; j++) {
    digitalWrite(j, HIGH);
  }
  num = 0;
}
 
/**
 * 显示函数
 */
void display() {
  int i;
  for (i = 0; i < 8; i++) {
    digitalWrite(map_led[i], map_table[num][i] ? HIGH : LOW);
  }
}
 
void loop() {
/*** 自己做的计数程序 ***/
  int j;
  while (analogRead(0) > 1000) { //当按钮按下时,模拟端口0会获得连续的高电位
    down = 1; //此时将按下状态置为“真”
  }
  for (j = 0; j < 500; j++) { //此处循环500次,作用是吸收模拟端口0杂波
    analogRead(0);
  }
  if (down) { //判断按钮按下状态,如果按下过就显示数字并累加
    down = 0;
    display();  //调用显示函数
    if (++num == 10) {
      num = 0; //判断从0到9
    }
  }
}

实现2

我真的是看了《爱上Arduino》后悟到了. 
电路在按钮部分稍稍有些变化,主要是把按钮的一端接到5V,一端接到数字端口13上。
这里还有一点点问题,在《爱上Arduino》中给按钮串接了一个10K的电阻,而后又接到了GND端,这个的作用是什么呢?
程序也是稍稍有些变化,主要是loop函数。


电路:

演示视频:

http://v.youku.com/v_show/id_XNDU0OTEwMjg0.html


程序:

/*
  a  b  c  d  e  f  g  dp
  7  6  5  10 11 8  9  4
*/
int map_led [8] = {
  7, 6, 5, 10, 11, 8, 9, 4
};
int map_table [10][8] = {
  {0, 0, 0, 0, 0, 0, 1, 1},   // 0
  {1, 0, 0, 1, 1, 1, 1, 1},   // 1
  {0, 0, 1, 0, 0, 1, 0, 1},   // 2
  {0, 0, 0, 0, 1, 1, 0, 1},   // 3
  {1, 0, 0, 1, 1, 0, 0, 1},   // 4
  {0, 1, 0, 0, 1, 0, 0, 1},   // 5
  {0, 1, 0, 0, 0, 0, 0, 1},   // 6
  {0, 0, 0, 1, 1, 1, 1, 1},   // 7
  {0, 0, 0, 0, 0, 0, 0, 1},   // 8
  {0, 0, 0, 0, 1, 0, 0, 1}    // 9
};
 
 
int num = 0;
int val = 0;
int old_val = 0;
int stat = 0;
 
void setup() {
  int j;
  for (j = 4; j <=11; j++) {
    pinMode(j, OUTPUT);
  }
  for (j = 4; j <=11; j++) {
    digitalWrite(j, HIGH);
  }
  num = 0;
}
 
void display() {
  int i;
  for (i = 0; i < 8; i++) {
    digitalWrite(map_led[i], map_table[num][i] ? HIGH : LOW);
  }
}
 
void loop() {
/*** 《爱上Arduino》中的计数程序 ***/
    val = digitalRead(13);  //读取数字端口13,看按钮是否按下
    if (val == HIGH && old_val == LOW) {  //判断按钮由抬起到按下则说明按钮是按下了
      stat = 1 - stat;
      delay(10);  
    }
    old_val = val;  //把当前值赋给old_val,以备下一个循环使用
    if (stat == 1) {  //判断按钮是按下了,显示数字并累加
      stat = 1 - stat;
      display();
      if (++num == 10) {
        num = 0;
      }
    }
}

猜你喜欢

转载自aclyyx.iteye.com/blog/1687418