?? red.h
字號:
#ifndef _RED_INCLUDED_
#define _RED_INCLUDED_
#include "lcd13164.h"
#include "cd3315.h"
#include "comm.h"
//正點原子@scut 08/09/11
//經(jīng)過很多次驗證了,對這種賽格買的音響遙控解碼很好
//紅外接口
#define RDATA PIND.2 //紅外數(shù)據(jù)輸入腳
uchar keyval=0;//鍵值暫存
unsigned long order=0;//命令暫存處
uchar times=0;//按鍵次數(shù),此次按下鍵的次數(shù)
bit READY=0; //紅外接收到數(shù)據(jù)
bit RPlaying=0;//播放收音機(jī)標(biāo)志
void red_init(void)
{
//外部中斷0 ,任意電平觸發(fā)
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;
}
//處理紅外接收
/*-------------------------協(xié)議--------------------------
開始拉低9ms,接著是一個4.5ms的高脈沖,通知器件開始傳送數(shù)據(jù)了
接著是發(fā)送4個8位二進(jìn)制碼,第一二個是遙控識別碼(16),第一個為
正碼(16),第二個為反碼(239),接著兩個數(shù)據(jù)是鍵值,第一個為正碼
第二個為反碼.發(fā)送完后40ms,遙控再發(fā)送一個9ms低,2ms高的脈沖,
表示按鍵的次數(shù),出現(xiàn)一次則證明只按下了一次,如果出現(xiàn)多次,則可
以認(rèn)為是持續(xù)按下該鍵.
---------------------------------------------------------*/
interrupt [EXT_INT0] void ext_int0_isr(void)
{
uchar res=0;
bit OK=0;
bit RODATA=0;
while(1)
{
if(RDATA)//有高脈沖出現(xiàn)
{
res=check();//獲得此次高脈沖寬度
if(res==250)break;//非有用信號
if(res>=200&&res<250)OK=1; //獲得前導(dǎo)位(4.5ms)
else if(res>=85&&res<200) //按鍵次數(shù)加一(2ms)
{
En_backlight=1;//打開背光
lasttime=0;//背光持續(xù)時間計數(shù)器清空
READY=1;//接受到數(shù)據(jù)
times++;//按鍵次數(shù)增加
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; //按鍵次數(shù)清零
}
}
}
}
//處理紅外鍵盤
//返回相應(yīng)的鍵值
uchar key_process(void)
{
uchar t1,t2;
t1=order>>24; //紅外解碼
t2=(order>>16)&0xff;
READY=0;//清除標(biāo)記
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;//關(guān)等響
else voltemp[3]=1; //開等響
break; //等響開關(guān)
}
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設(shè)置 ,只在mp3模式下工作
{
if(PLAYING) //radio模式
{
delay_ms(90);
if(READY&×<4)return 0;//按鍵還在繼續(xù)
return t1;
}
break;
}
case 168:
case 48:
{
if(t1==48)SINGLE=!SINGLE;//單曲?
if(RPlaying) //radio模式
{
delay_ms(90);
if(READY&×<4)return 0;//按鍵還在繼續(xù)
return t1;
}
break;
}
case PREV:
case NEXT:
{
delay_ms(90);
if(READY&×<4)return 0;//按鍵還在繼續(xù)
return t1;
}
default :return t1;
}
init_cd3315(Audio_Ch);//選擇通道四
}
return t1;
}
}
return 0;
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -