9键遥控器,单片机红外接收,驱动数码管显示的程序该怎么写? 不知道我这么写的对不对?
#include "stc15f2k60s2.h"
#define uchar unsigned char
#define uint unsigned int
int i;
sbit IRIN = P3^6; //红外接收器数据线
uchar IRCOM[7];
unsigned char code a[] ={0x98,0x08,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18 };
/**************************** 延时函数 ***********************************/
void delay(unsigned int a)
{
while(a--);
}
void delay1(unsigned char x) //x*0.14MS 1个for循环8个机器周期 =8*14*0.001=0.112ms
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void main(void)
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x01; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
P20=0; //数码管初始化
P21=0;
P22=0;
P23=0;
P41=0;
P42=0;
P43=0;
P44=0;
while(1);
}
void IR_IN() interrupt 0
{
unsigned char j,k,N=0;
EX0 = 0;
// delay1(15);
delay1(120); //0.07
if (IRIN==1)
{ EX0 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay1(8);}
for (j=0;j<7;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay1(8);}
while (!IRIN) //等 IR 变为高电平
{delay1(8);}
while (IRIN) //计算IR高电平时长
{
delay1(8);
N++;
if (N>=30)
{ EX0=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if (N>=8)
{IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
N=0;
}
}
if (IRCOM[5]!=0x00)
{ EX0=1;
return; }
if(IRCOM[6]== a[1]) ;
{
P21=1;
P22=1;
P23=1;
P20=0;
P41=1;
P42=1;
P43=1;
P44=0;
}
if(IRCOM[6]== a[2]) ;
{
P21=1;
P22=0;
P23=0;
P20=0;
P41=1;
P42=0;
P43=0;
P44=0;
}
if(IRCOM[6]== a[3]) ;
{
P21=0;
P22=1;
P23=1;
P20=0;
P41=1;
P42=1;
P43=0;
P44=1;
}
if(IRCOM[6]== a[4]) ;
{
P21=1;
P22=1;
P23=0;
P20=0;
P41=1;
P42=1;
P43=0;
P44=1;
}
if(IRCOM[6]== a[5]) ;
{
P21=1;
P22=0;
P23=0;
P20=0;
P41=1;
P42=0;
P43=1;
P44=1;
}
if(IRCOM[6]== a[6]) ;
{
P21=1;
P22=1;
P23=0;
P20=0;
P41=0;
P42=1;
P43=1;
P44=1;
}
if(IRCOM[6]== a[7]) ;
{
P21=1;
P22=1;
P23=1;
P20=0;
P41=0;
P42=1;
P43=1;
P44=1;
}
if(IRCOM[6]== a[8]) ;
{
P21=1;
P22=0;
P23=0;
P20=0;
P41=1;
P42=1;
P43=0;
P44=0;
}
if(IRCOM[6]== a[9]) ;
{
P21=1;
P22=1;
P23=1;
P20=0;
P41=1;
P42=1;
P43=1;
P44=1;
}
if(IRCOM[6]== a[10]) ;
{
P21=1;
P22=1;
P23=0;
P20=0;
P41=1;
P42=1;
P43=1;
P44=1;
}
EX0 = 1;
}
|