|
发表于 2012-11-27 21:12:03
|
显示全部楼层
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit P3_4=P3^4 ;
static bit OP; //红外发射管的亮灭
static unsigned int count; //延时计数器
static unsigned int endcount; //终止延时计数
static unsigned char flag; //红外发送标志
char iraddr1; //十六位地址的第一个字节
char iraddr2; //十六位地址的第二个字节
int u=0;
uchar key11;
void SendIRdata(char p_irdata);
void delay();
uchar sccode,recode;
void dlms(void); /*延时函数*/
uchar kbscan(void); /*键扫描函数*/
uchar flag1; /*按键标志位 用于显示164的标志*/
uchar idata LED[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0xc3,0x85,0x61,0x71,0x31,0x31};
uchar num=0;
void dlms()
{ uchar i;
for(i=200;i>0;i--){}
}
uchar kbscan(void)
{
uchar sccode,recode;
P1=0xf0; /*发全0行扫描码,列线输入*/
if((P1&0xf0)!=0xf0) /*判断读进来的P1是否有变化,既有无键按下*/
{ dlms(); /*延时去抖*/
flag1=1;
if((P1&0xf0)!=0xf0) /*再判断是否是误动作引起的键变化*/
{sccode=0xfe; /*逐行扫描码初值*/
while((sccode&0x10)!=0) /*判数行扫描码左移时,不超4位*/
{P1=sccode; /*输出行扫描码*/
if((P1&0xf0)!=0xf0) /*判断读进P1是否有变化,既本行有无键按下*/
{recode=(P1&0xf0)|0x0f;
return((~sccode)+(~recode));/*返回按键特征码*/
}
else
sccode=(sccode<<1)|0x01; /*行扫描码左移一位*/
}
}
}
flag1=0;
return(0);
}
void todokey(q)
uchar q;
{
switch(q)
{//key11
case 0x11: {num =0x00;break;} /*0*/
case 0x21: {num =0x01;break;} /*1*/
case 0x41: {num =0x02;break;} /*2*/
case 0x81: {num =0x03;break;}
case 0x12: {num =0x04;break;}
case 0x22: {num =0x05;break;}
case 0x42: {num =0x06;break;}
case 0x82: {num =0x07;break;}
case 0x14: {num =0x08;break;}
case 0x24: {num =0x09;break;}
case 0x44: {num =0x0a;break;}
case 0x84: {num =0x0b;break;}
case 0x18: {num =0x0c;break;}
case 0x28: {num =0x0d;break;}
case 0x48: {num =0x0e;break;} /*E*/
case 0x88: {num =0x0f;break;} /*F*/
default:break;
}
}
void main()
{
uchar key=0;
SCON=0x00; //置串口工作方式 0//
EA=1;
count = 0;
flag = 0;
OP = 0;
P3_4 = 0;
TMOD = 0x11; //设定时器0和1为16位模式1
ET0 = 1; //定时器0中断允许
TH0 = 0xFF;
TL0 = 0xE6; //设定时值0为38K 也就是每隔26us中断一次
TR0=0;
iraddr1=3;
iraddr2=252;
while(1)
{P1=0xf0;
if((P1&0xf0)!=0xf0) /*判断读进来的P1是否有变化,既有无键按下*/
{ key=kbscan();
dlms();
todokey(key);
if(flag1==1)
{
TI=0;
SBUF=~LED[num]; //读表格数据,串行发送数据
TR0=1;
for(u=0;u<5;u++)
{delay();
SendIRdata(num);//key11//发送的键值***************************************//
}
TR0=0;
}
}
}
}
//定时器0中断处理
void timeint(void) interrupt 1
{
TH0=0xFF;
TL0=0xE6; //设定时值为38K 也就是每隔26us中断一次
count++;
if (flag==1)
{
OP=~OP;
}
else
{
OP = 0;
}
P3_4 = OP;
}
void SendIRdata(char p_irdata)
{
int i;
char irdata=p_irdata;
//发送9ms的起始码
endcount=223;
flag=1;
count=0;
do{}while(count<endcount);
//发送4.5ms的结果码
endcount=117;
flag=0;
count=0;
do{}while(count<endcount);
//发送十六位地址的前八位
irdata=iraddr1;
for(i=0;i<8;i++)
{ //先发送0.56ms的38KHZ红外波(即编码中0.56ms的低电平)
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
//停止发送红外信号(即编码中的高电平)
if(irdata-(irdata/2)*2) //判断二进制数个位为1还是0
{
endcount=41; //1为宽的高电平
}
else
{
endcount=15; //0为窄的高电平
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送十六位地址的后八位
irdata=iraddr2;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据
irdata=p_irdata;
for(i=0;i<8;i++)
{
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{
endcount=41;
}
else
{
endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
//发送八位数据的反码
irdata=~p_irdata;
for(i=0;i<8;i++)
{ endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
if(irdata-(irdata/2)*2)
{endcount=41;
}
else
{endcount=15;
}
flag=0;
count=0;
do{}while(count<endcount);
irdata=irdata>>1;
}
endcount=10;
flag=1;
count=0;
do{}while(count<endcount);
flag=0;
}
void delay()
{ int i,j;
for(i=0;i<400;i++)
{
for(j=0;j<100;j++)
{
}
}
}
|
|