这个功能分了两种实现方式,
第一种是我自己琢磨着实现的,
第二种是看了《爱上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函数。
电路在按钮部分稍稍有些变化,主要是把按钮的一端接到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; } } }