一 硬件
如图数码管是由8个LED(b,a,f,g,e,d,c,DP)构成,外接有10个端口,我自己连接的引脚标号如图,另外数码管分共阳和共阴,区别也很简单,如下【1】
共阳数码管,它们公共端接5V,那在代码中,控制另一端的数字引脚为LOW,这样才能让数码管点亮 。
如果是共阴数码管,公共端接GND,在代码中中,控制另一端数字引脚为HIGH,才让数码管点亮 。
连线的话,本来按照网站【1】的接法如下图,是在8个LED都接入220欧电阻,两个共阳极都接了5V,觉得这样比较麻烦,所以实际连线图还是按照最开始的上图,每个端口对应数字引脚直接连接即可,并没有串联电阻,在一个共阳极串联一个220欧再接5V,另一个共阳极空置(共阳极两个端口内部本来就是相连的)
二 代码
1.目的:通过红外遥控器控制1位数码管的显示,希望实现以下3个具体功能
1)通电后数码管随机显示一位数(目前随机出来总是7)
2)遥控器按0~9,就显示对应数字
3)遥控器按+或-,数字相应加/减一位,直到9/0不能增减为止
2. 代码如下
//红外遥控控制1位数码管#include //调用红外遥控的库int RECV_PIN = 11;//定义红外接口数字引脚IRrecv irrecv(RECV_PIN);//创建一个红外线接收对象irrecvdecode_results results;//声明一个IRremote库函数独有的变量类型(decode_results),results存放红外解码结果,int ledpin = 13;//定义LED接口引脚,为了观察遥控器是否发送成功,用LED灯的亮灭来直观展示boolean ledstate = LOW;int currentnumber = random(0,10);//定义当前显示的数字为一随机数//数码管部分相关/*一位共阳数码管,10个接口,8个对应8个LED(7个条形+1个点形),两个对应正(共阳)引脚接法,共阳极接5V或数字引脚(该引脚给高电平),其他八个端口对应数字引脚2~9b --> 2a --> 3f --> 4g --> 5e --> 9d --> 8c --> 7DP--> 6*/unsigned long IRcode[12] = {//红外编码0~9,+ -0xFF6897,0xFF30CF,0xFF18E7,0xFF7A85,0xFF10EF,//0~40xFF38C7,0xFF5AA5,0xFF42BD,0xFF4AB5,0xFF52AD,//5~90xFFA857,0xFFE01F//+,-};int number[10][8]={//二维数组,实际存放的是2~9引脚对应的高/低电平即1/0组合,从而点亮对应数码管,显示对应数字{0,0,0,1,1,0,0,0},//对应0{0,1,1,1,1,0,1,1},//对应1{0,0,1,0,1,1,0,0},{0,0,1,0,1,0,0,1},{0,1,0,0,1,0,1,1},{1,0,0,0,1,0,0,1},//对应n,,,{1,0,0,0,1,0,0,0},{0,0,1,1,1,0,1,1},{0,0,0,0,1,0,0,0},{0,0,0,0,1,0,0,1}//对应9};void numbershow(int i){//显示数字ifor(int pin=2;pin<=9;pin++){digitalWrite(pin,number[i][pin-2]);}}void setup(){//数码管部分初始设置for(int i=2;i<=9;i++){//设置数字引脚2~9为输出模式pinMode(i,OUTPUT);//数码管各连接引脚为输出模式,低电平时对应LED段亮digitalWrite(i,HIGH);//各LED灯初始是灭}//红外遥控部分初始设置irrecv.enableIRIn(); //启动红外解码//led灯初始设置pinMode(ledpin, OUTPUT);}void loop() {if (irrecv.decode(&results)) {//首先判断是否按遥控器并接收到红外码,若是,这个函数会返回true,把红外解码的结果放在results里面,并开始进行下列操作//1.每按一次,UNO上13引脚对应的LED灯亮或灭,从而直观判断有没有按-送-接收这一套流程成功ledstate = !ledstate;digitalWrite(ledpin,ledstate);//2.判断按的是什么按钮//2.1如果按的是0~9,显示对应数字for(int i=0;i<=9;i++){if(results.value=http://www.kingceram.com/post/=IRcode[i]){//将接收到的value与IRcode里面0~9的代码一一对照,如果有一个相等currentnumber=i;//将对应的i赋给currentnumbernumbershow(currentnumber);}}//2.2如果按的是+号(0xFFA857),且当前数字不是9,就让显示的数字加一位if(results.value==IRcode[10]&¤tnumber!=9){currentnumber=currentnumber+1;numbershow(currentnumber);}//2.3如果按的是-号(0xFFE01F),且当前数字不是0,就让显示的数字减一位if(results.value==IRcode[11]&¤tnumber!=0){currentnumber=currentnumber-1;numbershow(currentnumber);}irrecv.resume(); // 在解码一个红外线信号之后,要运行resume()函数,这样才会持续接收下一组信号}else{//若没有按遥控器,数码管初始显示随机数,不过随机数始终是7,原因不明numbershow(currentnumber);} }