|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2011-11-19 17:03:17
|
显示全部楼层
终于学会了 输入捕捉 红外解码 程序共享一下 新手 程序可能有不足之处 但是功能实现了 呵呵
#include <iom16v.h>
#include <macros.h>
#include "1602.h"
#define uchar unsigned char
#define uint unsigned int
const uchar cdis1[ ] = {" Red Control "};
const uchar cdis2[ ] = {" IR-CODE: --H "};
uchar shu[2];
volatile uint data0,data1,data2,bitcnt,oldFall,temp,newFall;
void ice_init()//输入捕捉初始化
{
TCCR1A=0x00;
TCCR1B=0x82;
TCNT1H=0;
TCNT1L=0;
SREG|=BIT(7);
TIMSK|=BIT(5);//输入捕捉中断使能
TIMSK|=BIT(2);//T1溢出中断使能位
//TIMSK|=0x24;
// SEI();
}
void firstdisplay()
{
uchar m;
lcd_init(); //初始化LCD
write_com(0x80); //设置显示位置为第一行的第1个字符
m = 0;
while(cdis1[m] != '\0')
{ //显示字符
write_date(cdis1[m]);
m++;
}
write_com(0x40+0x80); //设置显示位置为第二行第1个字符
m = 0;
while(cdis2[m] != '\0')
{
write_date(cdis2[m]); //显示字符
m++;
}
}
main()
{
PORTD|=BIT(6);
firstdisplay();
ice_init();
//DDRD=BIT(6);
while(1);
}
#pragma interrupt_handler IceInt:6
void IceInt()
{
CLI();
newFall=ICR1;
temp=newFall-oldFall;
oldFall=newFall;
if(temp>1024 && temp<1225)
{
temp=0;
}
else if(temp>2145 && temp<2345)
{
temp=1;
}
else if(temp>13400 && temp<13600)
{
bitcnt=0;
data0=0;
data1=0;
return;
}
else{return;}
bitcnt++;
if(bitcnt<16)
{
data0=data0|(uint)temp;
data0=data0<<1;
}
else if(bitcnt==16)
{
data0=data0|(uint)temp;
}
else if(bitcnt<32)
{
data1=data1|(uint)temp;
data1=data1<<1;
}
if(bitcnt==32)
{
bitcnt=0;
data1=data1|(uint)temp;
data2=data1/256;
shu[1]=(uchar)(data2&0x0f);
shu[0]=(uchar)(data2>>4);
if(shu[1]>9)shu[1]=shu[1]+0x37;
else shu[1]=shu[1]+0x30;
if(shu[0]>9)shu[0]=shu[0]+0x37;
else shu[0]=shu[0]+0x30;
write_com(0x4b+0x80);
write_date(shu[0]); //第一位数显示
write_com(0x4c+0x80);
write_date(shu[1]); //第二位数显示
data0=0;
data1=0;
}
SEI();
}
#pragma interrupt_handler timer1:9
void timer1()
{
TCNT1H=0x00;
TCNT1L=0x00; //设置定时器1初值
} |
|