/*************************基于 51 单片机的红外遥控计算器程序****************/
/****本程序用基于 TC9012 遥控器可直接操作,电路图,遥控器编码图在最后****/
unsigned long int
//红外接口标志
//红外用全局变量
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define lint
sbit IR=P3^2;
bit irpro_ok,irok;
uchar irtime,X,mir,fir;
uchar IRcord[4], irdata[33];
uchar DATA1[8]={0,0,0,0,0,0,0,0};
uchar DATA2[8]={0,0,0,0,0,0,0,0};
uchar RESUIT[8]={0,0,0,0,0,0,0,0};
uchar px1=0,px2=0,px3=0,flag=0,flag1=0,flag2=0,flag3=0,f1=0,f2=0,f3=0,f4=0; //各全局变量
uchar temp,key,fang1,fang2;
lint
void delay(msx);
void Init();
void INTInit();
void Ircordpro();
void keyscan();
void delay(uint);
void DataOper();
void DataHandle();
void DisplayHandle();
void display(uchar,uchar);
void main()
{
//输入的数及其结果
//ms 延时函数
//系统初始化
//中断初始化
//红外码值处理函数
//键值检测
//延时
//数据运算
//数据接收
//显示处理
//数码管显示函数
//第一个数
//第二个数
//结果
x1=0,x2=0,y=0;
INTInit();
P0=0x00;
while(1)
{
keyscan();
DataHandle();
DisplayHandle();
}
}
void INTInit()
{
TMOD=0x02; //定时器 0 工作方式 2,TH0 是重装值,TL0 是初值
TH0=0x00;
TL0=0x00;
//reload value
//initial value
ET0=1;
TR0=1;
IT0 = 1;
EX0 = 1;
EA = 1;
}
void Init()
{
//开中断
// Configure interrupt 0 for falling edge on /INT0 (P3.2)
// Enable EX0 Interrupt
//初始化,所有数据归零
uchar i;
px1=0;px2=0;px3=0;
flag=0;flag1=0;flag2=0;flag3=0;
f1=0;f2=0;f3=0;f4=0;
x1=0;x2=0;y=0;
for(i=0;i<8;i++)
{DATA1[i]=0;DATA2[i]=0;RESUIT[i]=0;}
}
void delay(msx)
{
uint i,j;
for(i=0;i<=msx;i++)
for(j=0;j<=110;j++);
}
void display(uchar n,uchar m)
{
P0=P0&0x80;
P0=P0|(n<<4);
P0=P0|m;
//msx 为延时毫秒数
//n 是第几只数码管,m 是显示的数字是多少
}
void tim0_isr (void) interrupt 1 using 1//定时器 0 中断服务函数
{irtime++;}
void ex0_isr (void) interrupt 0 using 0//外部中断 0 服务函数
{
if(fir)
{
//4.5ms+4.5ms
if(irtime<49&&irtime>=31)mir=0;
irdata[mir]=irtime;
irtime=0;
mir++;
if(mir==33){irok=1;mir=0;fir=0;}
}
else
{irtime=0;fir=1;}
}
void Ircordpro(void)
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
for(i=0;i<4;i++)
{
//红外码值处理函数
//处理 4 个字节
for(j=1;j<=8;j++)
//处理 1 个字节 8 位
{
}
cord=irdata[k];
if(cord>7) value=value|0x80;
else value=value;
if(j<8)value=value>>1;
k++;
IRcord[i]=value;
value=0;
}
if((IRcord[0]=~IRcord[1])&&(IRcord[2]=~IRcord[3]))
{X=IRcord[2];fang2=1;}
}
void keyscan()
{
//矩阵键值扫描子函数
if(irok){Ircordpro();irok=0;fang1=1;}
if((fang1==1)&&(fang2==1))
{
fang1=0;fang2=0;
switch(X)
{
case 0x08: key=0;flag=1;break;
case 0x01: key=1;flag=1;break;
case 0x02: key=2;flag=1;break;
case 0x03: key=3;flag=1;break;
case 0x05: key=4;flag=1;break;
case 0x06: key=5;flag=1;break;
case 0x07: key=6;flag=1;break;
case 0x09: key=7;flag=1;break;
case 0x0A: key=8; flag=1;break;
case 0x0B: key=9; flag=1;break;
case 0x10: key=10;flag1=1;display(7,0);break;
case 0x1A: key=11;flag1=1;display(7,0);break;
case 0x16: key=12;flag2=1;Init();break;
case 0x11: key=13;flag2=1;DataOper();break;
case 0x15: key=14;flag1=1;display(7,0);break;
case 0x19: key=15;flag1=1;display(7,0);break;
}
}
}
void DataOper()
{
uchar i,j,m=0;
lint k=0;
for(i=0;i<(px1-1);i++)
{
k=DATA1[i];
for(j=0;j<(px1-i-1);j++)
{
k=k*10;
}
x1=x1+k;
}
x1=x1+DATA1[px1-1];
for(i=0;i<(px2-1);i++)
{
k=DATA2[i];
for(j=0;j<(px2-i-1);j++)
{
k=k*10;
}
x2=x2+k;
//把第一个数组中的数处理成十进制数
//把第二个数组中的数处理成十进制数
//根据标志位进行运算
//把各位分离出来存入结果数组中
y=x1+x2;
}
x2=x2+DATA2[px2-1];
if(f1==1)
else if(f2==1) y=x1-x2;
else if(f3==1) y=x1*x2;
else if(f4==1) y=x1/x2;
RESUIT[0]=y/10000000;
RESUIT[1]=(y%10000000)/1000000;
RESUIT[2]=(y%1000000)/100000;
RESUIT[3]=(y%100000)/10000;
RESUIT[4]=(y%10000)/1000;
RESUIT[5]=(y%1000)/100;
RESUIT[6]=(y%100)/10;
RESUIT[7]=y%10;
while(!RESUIT[m]) m++;
px3=m;
}
void DataHandle()
{
//把每次按键的结果记录下来,并存到适当的位置
if((key<10)&&(flag==1)&&(flag1==0))
{
DATA1[px1]=key;
px1++;
flag=0;
}
else if((key<10)&&(flag==1)&&(flag1==1))
{
DATA2[px2]=key;
px2++;
flag=0;
}
else if(flag1==1)
{
switch(key)
{
case 10 : f1=1;f2=0;f3=0;f4=0;break;
case 11 : f1=0;f2=1;f3=0;f4=0;break;
case 14 : f1=0;f2=0;f3=1;f4=0;break;
case 15 : f1=0;f2=0;f3=0;f4=1;break;
// "+"
// "-"
// "*"
// "/"
}
}
}
void DisplayHandle()
{
//将数据显示在数码管上
uchar i,x;
if((flag1==0)&&(flag2==0))
{
x=px1;
if(px1==0) display(7,0);
else
{
for(i=0;i
x=px2;
if(px2==0) display(7,0);
else
{
for(i=0;i
=px3;i--)
{
display(i,RESUIT[i]);
delay(3);
}
}
}