📄 red.h~
字号:
#ifndef _RED_INCLUDED_
#define _RED_INCLUDED_
#include "lcd13164.h"
#include "cd3315.h"
#include "comm.h"
//蜂鸣器红外接口
#define RDATA PIND.2 //红外数据输入脚
uchar keyval=0;//键值暂存
unsigned long order=0;//命令暂存处
uchar times=0;//按键次数,此次按下键的次数
bit READY=0; //红外接收到数据
bit RPlaying=0;//播放收音机标志
void red_init(void)
{
//外部中断0 ,任意电平触发
GICR|=0x40;
MCUCR=0x01;
MCUCSR=0x00;
GIFR=0x40;
DDRD.2=0;
}
//检测脉冲长短
uchar check(void)
{
uchar t=0;
while(RDATA)
{
t++;
delay_us(20);
if(t==250)return t; //超时溢出
}
return t;
}
//处理红外接收
/*-------------------------协议--------------------------
开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了
接着是发送4个8位二进制码,第一二个是遥控识别码(16),第一个为
正码(16),第二个为反码(239),接着两个数据是键值,第一个为正码
第二个为反码.发送完后40ms,遥控再发送一个9ms低,2ms高的脉冲,
表示按键的次数,出现一次则证明只按下了一次,如果出现多次,则可
以认为是持续按下该键.
---------------------------------------------------------*/
interrupt [EXT_INT0] void ext_int0_isr(void)
{
uchar res=0;
bit OK=0;
bit RODATA=0;
while(1)
{
if(RDATA)//有高脉冲出现
{
res=check();//获得此次高脉冲宽度
if(res==250)break;//非有用信号
if(res>=200&&res<250)OK=1; //获得前导位(4.5ms)
else if(res>=85&&res<200) //按键次数加一(2ms)
{
En_backlight=1;//打开背光
lasttime=0;//背光持续时间计数器清空
READY=1;//接受到数据
times++;//按键次数增加
break;
}
else if(res>=50&&res<85)RODATA=1;//1.5ms
else if(res>=10&&res<50)RODATA=0;//500us
if(OK)
{
order<<=1;
order+=RODATA;
times=0; //按键次数清零
}
}
}
}
//处理红外键盘
//返回相应的键值
uchar key_process(void)
{
uchar t1,t2;
t1=order>>24; //红外解码
t2=(order>>16)&0xff;
READY=0;//清除标记
if(t1==~t2&&t1==16)//遥控识别码16(00010000)
{
t1=order>>8;
t2=order;
if(t1==~t2) //处理键值
{
if(PLAYING||RPlaying)//播放模式
{
switch(t1)
{
case 250:
{
if(voltemp[3])voltemp[3]=0;//关等响
else voltemp[3]=1; //开等响
break; //等响开关
}
case 122:
{
if(voltemp[2]<7)voltemp[2]++;//高音增加
break;
}
case 234:
{
if(voltemp[2]>-7)voltemp[2]--;//高音减少
break;
}
case 184://主音量增加
{
if(voltemp[0]<63)voltemp[0]++;
break;
}
case 40://主音量减少
{
if(voltemp[0]>0)voltemp[0]--;
break;
}
case 120:
{
if(voltemp[1]<7)voltemp[1]++;//低音增加
break;
}
case 232:
{
if(voltemp[1]>-7)voltemp[1]--;//低音减少
break;
}
case 106:
case 242:
case 114:
case 176:
case 112: //dsp设置 ,只在mp3模式下工作
{
if(PLAYING) //radio模式
{
delay_ms(90);
if(READY&×<4)return 0;//按键还在继续
return t1;
}
break;
}
case 168:
case 48:
{
if(t1==48)SINGLE=!SINGLE;//单曲?
if(RPlaying) //radio模式
{
delay_ms(90);
if(READY&×<4)return 0;//按键还在继续
return t1;
}
break;
}
case PREV:
case NEXT:
{
delay_ms(90);
if(READY&×<4)return 0;//按键还在继续
return t1;
}
default :return t1;
}
init_cd3315(Audio_Ch);//选择通道四
}
return t1;
}
}
return 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -