这个功能分了两种实现方式,
第一种是我自己琢磨着实现的,
第二种是看了《爱上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;
}
}
}