- #include<IRremote.h>//红外遥控库函数
- /********************************设置变量********************************/
- #define IR_IN 8 //红外接收:D8
- IRrecv irrecv(IR_IN);
- decode_results results;
-
- //设置控制各段的数字I/O脚
- int a=16;//模拟口的A2,以下同
- int b=17;
- int c=4;
- int d=3;
- int e=2;
- int f=15;
- int g=14;
- int dp=5;
-
- //以下用数组给数码管管脚、0-9十个数字赋值
- byte segs[7] = { a, b, c, d, e, f, g };//除了小数点的7笔划段
- byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 }, // = 0
- { 0,1,1,0,0,0,0 }, // = 1
- { 1,1,0,1,1,0,1 }, // = 2
- { 1,1,1,1,0,0,1 }, // = 3
- { 0,1,1,0,0,1,1 }, // = 4
- { 1,0,1,1,0,1,1 }, // = 5
- { 1,0,1,1,1,1,1 }, // = 6
- { 1,1,1,0,0,0,0 }, // = 7
- { 1,1,1,1,1,1,1 }, // = 8
- { 1,1,1,1,0,1,1 } // = 9
- };
- /**************************译码输出子函数******************************/
- //执行译码结果函数,输出用灯光、数码管显示,必要可以加蜂鸣器
- void remote_deal(void)
- {
- switch(results.value)
- {
- case 0xFFA25D: //左上角的电源开关按键
- init_wire();//数码管熄灭
- buzzer_led();//蜂鸣器鸣叫
- break;
- //以下显示所按的数字
- case 0xFF6897://显示0
- lightSegments(0);
- break;
- case 0xFF30CF://1
- lightSegments(1);
- break;
- case 0xFF18E7://2
- lightSegments(2);
- break;
- case 0xFF7A85://3
- lightSegments(3);
- break;
- case 0xFF10EF://4
- lightSegments(4);
- break;
- case 0xFF38C7://5
- lightSegments(5);
- break;
- case 0xFF5AA5://6
- lightSegments(6);
- break;
- case 0xFF42BD://7
- lightSegments(7);
- break;
- case 0xFF4AB5://8
- lightSegments(8);
- break;
- case 0xFF52AD://显示9
- lightSegments(9);
- break;
- }
- }
- /***************************初始化设置函数******************************/
- void setup() {
- irrecv.enableIRIn();// 启动红外解码
- unsigned char i;
- for(i=2;i<=19;i++)
- {
- pinMode(i,OUTPUT);//设置2~19引脚为输出模式
- }
- //pinMode(LED_RED,OUTPUT);//设置与红灯连接的引脚为输出模式
- pinMode(IR_IN,INPUT);//设置红外接收引脚为输入
- digitalWrite(9,LOW);//为红外接收头的接地端,节省连接的导线
- digitalWrite(10,HIGH);//为红外接收头的+端,节省连接的导线
- digitalWrite(18,HIGH);//A4,为蜂鸣器-
- digitalWrite(19,HIGH);//A5,为蜂鸣器-,蜂鸣器可接在A4、A5中的任何一个
- Serial.begin(9600);//在计算机的串口窗口里面观察键码值,需要打开串口窗口
- }
- /***************************主函数(循环)******************************/
- void loop()
- {
- if(irrecv.decode(&results)) //解码成功,把数据放入results变量中
- {
- remote_deal(); //执行译码结果
- //以下是观察键码值的程序:
- Serial.println("ir_code");
- Serial.println(results.value, HEX);//显示十进制
- irrecv.resume();
- }
- }
- /***********************熄灭数码管全部笔画子函数************************/
- void init_wire()
- {
- for (int i=0;i<7;i++)
- {
- digitalWrite(segs[i], HIGH);
- }
- digitalWrite(dp,HIGH);
- }
- /************************点亮对应数字的数码管0-9*************************/
- void lightSegments(int x)
- {
- for (int i=0;i<7;i++)
- {
- digitalWrite(segs[i], 1-seven_seg_digits[x][i]);
- }
- buzzer_led();//蜂鸣器函数,数码管眨眼
- for (int i=0;i<7;i++)
- {
- digitalWrite(segs[i], 1-seven_seg_digits[x][i]);
- }
- }
- /********************蜂鸣器函数,同时数码管眨眼**********************/
- void buzzer_led()
- {
- delay(20);//数码管亮
- init_wire();//数码管熄灭
- digitalWrite(18,LOW);//蜂鸣器响
- digitalWrite(19,LOW);//蜂鸣器响
- delay(80);//响持续时间
- digitalWrite(18,HIGH);//蜂鸣器停
- digitalWrite(19,HIGH);
- }
复制代码
【效果】最终效果展示两个图