版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MadeInJack/article/details/51712174
1、硬件部分
数码管,常见的用来显示数字的,比如像计算器。这回我们就要来好好研究一下数码管,看看它是如何工作的。数码管,其实也算是LED中的一种。数码管的每一段,都是一个独立的LED,通过数字引脚来控制相应段的亮灭就能达到显示数字的效果。这个项目要实现的是循环显示数字0~9。
按下图连线图连接,注意数码管各段所对应的引脚。右边引脚说明图上为什么画这么几个箭头呢?个人觉得,这样看起来更方便。可以给你作为参考。我们从上面一排看,红色箭头的方向,从右往左,b a f g的顺序正好对应,下面红色箭头逆时针顺序b --> a --> f --> g。蓝色箭头也是表达的同样的意思。
我还特意在连接图上,对数码管所连接的引脚做了标示。这样就能更清楚的知道哪个引脚控制哪一段了。这8个电阻同样是起限流的作用。
重点:弄明白数码管的原理可以随便接(代码中我未按这个图接线,注意针脚就行)
下图是真实卡片的接线图,保留了原红外接收,我的代码将按下图设计,按0-9任一键将变成按的数字,按前进>|数字向后翻至9结束,按|<数字向前翻至0结束。
2、代码部分
#include <IRremote.h>
int RECV_PIN = 13;
IRrecv irrecv(RECV_PIN);
decode_results results; //用于接收红外码
int currentNumber = 0;
//数码管显示0-9的数组
int num[10][8] = {
{0,0,0,1,0,0,0,1},
{0,1,1,1,1,1,0,1},
{0,0,1,0,0,0,1,1},
{0,0,1,0,1,0,0,1},
{0,1,0,0,1,1,0,1},
{1,0,0,0,1,0,0,1},
{1,0,0,0,0,0,0,1},
{0,0,1,1,1,1,0,1},
{0,0,0,0,0,0,0,1},
{0,0,0,0,1,1,0,1}
};
//定义遥控器的上的12个按钮代码
long codes[12] = {
0xFD30CF,0xFD08F7, // 0 ,1
0xFD8877,0xFD48B7, // 2 ,3
0xFD28D7,0xFDA857, // 4 ,5
0xFD6897,0xFD18E7, // 6 ,7
0xFD9867,0xFD58A7, // 8 ,9
0xFD20DF,0xFD609F, // 前进键>|, 后退键|<
};
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
for(int i=2;i<=9;i++){
pinMode(i,OUTPUT);
digitalWrite(i,HIGH); //共阳极时HIGH表示灭的意思
}
}
//显示数字
void showNumberX(int i){
for(int pin = 2;pin<10;pin++){
digitalWrite(pin,num[i][pin-2]);
}
}
void loop() {
if(irrecv.decode(&results)){
for(int i=0;i<12;i++){
if(results.value == codes[i] && i<=9){
showNumberX(currentNumber = i);
Serial.println(i);
break;
}else if(results.value == codes[10] && currentNumber !=0){
currentNumber--;
showNumberX(currentNumber);
Serial.println(currentNumber);
break;
}else if(results.value == codes[11] && currentNumber != 9){
currentNumber++;
showNumberX(currentNumber);
Serial.println(currentNumber);
break;
}
}
Serial.println(results.value,HEX);
irrecv.resume();
}
}