📄 irr._c
字号:
//Atmega16的红外遥控器接收试验
//使用1602液晶进行显示,
#include<iom16v.h>
#include"1602.h"
#pragma interrupt_handler ext_int0_isr:2 //指定外部中断函数
#define uchar unsigned char
#define uint unsigned int
uchar irr_b=0,s_s=0;
uchar wb=0,a=0,ds=0;
long da=0;
uchar d1,d2,d3,d4;
uchar ten_1,ten_2,ten_3,ten_4,i;
//中断接收
void ext_int0_isr(void)
{
if(irr_b==0) //第一个中断
{
irr_b=1; //状态为:开始接收
TCNT1L=0x00; //定时器清零
}
else if(irr_b==1) //第二个以后的中断
{
a=TCNT1L; //读取定时器的值
//判断是引导,还是数据
if((170<a)&&(a<235)) //引导
{
wb=0; //数据计数清零
da=0; //数据清零
TCNT1L=0x00; //定时器清零
}
else if((8<a)&&(a<25)) //数据0
{
wb++;
da=(da<<1);
TCNT1L=0x00;
}
else if((25<a)&&(a<45)) //数据1
{
wb++;
da=(da<<1)+1;
TCNT1L=0x00;
}
}
if(wb==32) //数据长度够32位
{
irr_b=0; //状态为停止接收
wb=0; //数据计数清零
s_s=1; //打开显示许可
}
}
//定时器T1初始化
void t1_init()
{
TCCR1B=0x00; //关闭定时器
TCNT1H=0x00; //定时器初值
TCNT1L=0x00;
TCCR1A=0x00; //
TCCR1B=0x05; //1024分频
}
//主函数
main()
{
//初始化端口
DDRA=0xff;
PORTA=0x00;
DDRB=0xff;
DDRD=0x00; //中断输入
PORTD=0xff; //内部上拉
t1_init();
MCUCR = 0x02;//下降沿中断
GICR = 0x40;//开外部中断int_0
TIMSK = 0x00;
SREG=0x80; //开全局中断
s_s=1;
while(1)
{
ds=TCNT1L;
if(ds>250) //定时器超时,接收复位
{
TCNT1L=0;
irr_b=0;
da=0;
wb=0;
s_s=0;
}
if(s_s==1) //显示开关打开,开始显示
{
SREG=0x00; //关闭全局中断
LcdInit(); //1602初始化
//显示设备码
d1=da>>24;
ten_1=d1/100;
ten_2=(d1-(100*ten_1))/10;
ten_3=d1-(100*ten_1)-ten_2*10;
WriteNum(1,0,ten_1);
WriteNum(1,1,ten_2);
WriteNum(1,2,ten_3);
//显示设备码反码
d1=da>>16;
ten_1=d1/100;
ten_2=(d1-(100*ten_1))/10;
ten_3=d1-(100*ten_1)-ten_2*10;
WriteNum(1,4,ten_1);
WriteNum(1,5,ten_2);
WriteNum(1,6,ten_3);
//显示键码
d1=da>>8;
ten_1=d1/100;
ten_2=(d1-(100*ten_1))/10;
ten_3=d1-(100*ten_1)-ten_2*10;
WriteNum(1,8,ten_1);
WriteNum(1,9,ten_2);
WriteNum(1,10,ten_3);
//显示键码反码
d1=da;
ten_1=d1/100;
ten_2=(d1-(100*ten_1))/10;
ten_3=d1-(100*ten_1)-ten_2*10;
WriteNum(1,12,ten_1);
WriteNum(1,13,ten_2);
WriteNum(1,14,ten_3);
//复位D端口
DDRD=0x00; //中断输入
PORTD=0xff; //内部上拉
s_s=0; //关闭显示开关
SREG=0x80; //开全局中断
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -