#include <iom16v.h>
#include <macros.h>
#define uint unsigned int
#define uchar unsigned char
#define RS_H (PORTC|=BIT(5))
#define RS_L (PORTC&=~BIT(5))
#define LCDEN_H (PORTC|=BIT(6))
#define LCDEN_L (PORTC&=~BIT(6))
/*遥控器按键码值
#define 0xA2 电源
#define 0X62 返回
#define 0XE2 MODE
#define 0X22 CH-
#define 0X02 CH+
#define 0XC2 EQ
#define 0XE0 快退
#define 0XA8 快进
#define 0X90 暂停
#define 0X68 减小
#define 0X98 增加
#define 0XB0 0
#define 0X30 1
#define 0X18 2
#define 0X7A 3
#define 0X10 4
#define 0X38 5
#define 0X5A 6
#define 0X42 7
#define 0X4A 8
#define 0X52 9
*/
uchar table[]=" zhou fu ming ";
uchar table1[]=" CODE : 0X00 ";
#include"1602.c"
volatile uint data0,data1,data2,bitcnt,oldFall,temp,newFall;
uchar shu[2];
//
void main()
{
DDRA=0XFF;
PORTA=0XFF;
DDRC=0X60;
PORTC=0X60;
DDRD&=~BIT(7);
PORTD|=BIT(7);
L1602_in();
TCCR1A=0X00;
TCCR1B = 0x82; //T1进行8分频,捕捉噪声抑制,下降沿触发输入捕捉
TCNT1H=0; //T1高八位数据寄存器的初值(往返1cm要58us)
TCNT1L=0;//T1低八位数据寄存器的初值
SREG|=BIT(7);//开总中断
TIMSK|=BIT(5);//输入捕捉中断使能
TIMSK|=BIT(2);//T1溢出中断使能位
while(1) ;
}
#pragma interrupt_handler IceInt:6
//下降沿触发中断
void IceInt()
{
CLI();
newFall=ICR1;
temp=newFall-oldFall; //计算脉冲加间隔的时间用于判断该为是0或1
oldFall=newFall;
if(temp>1024 && temp<1225) // "0"信号(左右浮动100us)产生的下降沿
{
temp=0;
}
else if(temp>2145 && temp<2345) //"1"信号(左右浮动100us)产生的下降沿
{
temp=1;
}
else if(temp>13400 && temp<13600) //header信号
{
bitcnt=0;
data0=0;
data1=0;
return; //返回(已经接收到引导码,等待下次开始接收数据)
}
else //干扰信号
{
return;
}
bitcnt++;
if(bitcnt<16) //开始接收前16位
{
data0=data0|(uint)temp;
data0=data0<<1;
}
else if(bitcnt==16)
{
data0=data0|(uint)temp;
}
else if(bitcnt<32) //开始接收后16位
{
data1=data1|(uint)temp;
data1=data1<<1;
}
else 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;
display(shu);
}
SEI();
}
#pragma interrupt_handler timer1:9
void timer1()
{
TCNT1H=0x00;
TCNT1L=0x00; //设置定时器1初值
}