|
-
- /*
- 此次開發(fā) 利用STC8A平臺全面方面 實(shí)現(xiàn)了51單片機(jī) 學(xué)習(xí) 實(shí)驗(yàn) 設(shè)計(jì) 等功能
- 下面是接口整體介紹
- TFT驅(qū)動IC為 ILI9341
- tft
- 控制線:RS-P3^5; WR-P3^6; RD-P3^7; CS-P4^4; RST-P4^3
- 數(shù)據(jù)線: P7口低八位數(shù)據(jù)端口 P0口高八位數(shù)據(jù)端口(兩個數(shù)據(jù)口都以選用 不可做其他)
- 觸摸xpt2046
- SPI總線 MOSI-P2^3 MISO-P2^4 SCLK-P2^5
- CS-P6^2 PENIRQ-P6^3
- 紅外解碼實(shí)驗(yàn)
- 紅外采用P3.2中斷0口 讀取H1838傳來的紅外信息并將其進(jìn)行解碼
-
- NEC 碼的位定義:一個脈沖對應(yīng)560us 的連續(xù)載波,
- 邏輯1 應(yīng)該是560us 低+1680us 高,
- 邏輯0 應(yīng)該是560us 低+560us 高。
-
- NEC 遙控指令的數(shù)據(jù)格式為:同步碼頭、地址碼、地址反碼、控制碼、控制反碼。
- 同步碼 由一個9ms 的低電平和一個4.5ms 的高電平組成,地址碼、地址反碼、控制碼、
- 控制反碼均是 8 位數(shù)據(jù)格式。
- 具體解碼過程請參考資料
-
- */
- #include "stc8.h" //STC頭文件
- #include "def.h" //宏定義 常用函數(shù)
- #include "delay.h" //延時(shí)函數(shù)
- #include "tft.h" //TFT IC底層驅(qū)動
- #include "gui.h"
- #include "xpt2046.h"
- #include "spi.h"
- #include "h1838.h"
- //真對 STC8A系列 IO口初始化
- //除P3 P5口外 其他IO默認(rèn)準(zhǔn)雙向IO口 所以當(dāng)用的P3 P5口是要進(jìn)行初始化一下
- void IO_init(void)
- {
- P3M0 = 0X00;
- P3M1 = 0X00;
- P5M0 = 0X00;
- P5M1 = 0X00;
- }
- void main()
- {
- IO_init(); //IO口初始化
- Lcd_Init(); //tft初始化
- Init_SPI(); //SPI初始化
- GUI_Clear(White); //白色清屏
- GUI_sprintf_hzstr16x(0,0,"infrared decoding test",White,1);
- GUI_sprintf_hzstr16x(0,18,"IR-CODE: --H",Red,White);
- hongw(); //紅外解碼測試函數(shù)
-
- }
復(fù)制代碼
#include "stc15f2k60s2.h"
#include "delay.h"
#include "tft.h"
#include "gui.h"
#include "xpt2046.h"
#include "h1838.h"
#include "gui.h"
u8 ma[2]; //紅外解碼數(shù)據(jù)
u8 hong=0; //紅外 標(biāo)志位
void hongw(void)
{
IT0=1; //邊沿觸發(fā)
EX0=1; //外部中斷0 P3.2口
EA = 1; // 開總中斷
while(1)
{
if(hong==1) //判斷標(biāo)志位 是否數(shù)據(jù)更新
{
GUI_sprintf_char(73,16,ma[0],White,Blue,0); //顯示解碼值
GUI_sprintf_char(81,16,ma[1],White,Blue,0);
hong=0; //清標(biāo)志位等待下一次接收
}
}
}
/////////////////////////////////
//////////////////////////////////
//紅外解碼 外部P32口邊沿觸發(fā)中斷
//同步碼 由一個9ms 的低電平和一個4.5ms 的高電平組成
//邏輯1 是560us 低+1680us 高,邏輯0 是560us 低+560us 高
void IR_IN() interrupt 0
{
u8 j,k,N=0;
u8 IRCOM[4];
EX0 = 0; //進(jìn)入中斷后關(guān)閉中斷 進(jìn)行解碼
delay_us(7700); //24M下大約7ms延時(shí) 9ms低電平前 檢測P32狀態(tài)
if (IRIN==1) //如果非0 說明紅外錯誤 返回
{ EX0 =1;
return;
}
//確認(rèn)IR信號出現(xiàn)
while(!IRIN); //等IR變?yōu)楦唠娖,跳過9ms的前導(dǎo)低電平信號。
for (j=0;j<4;j++) //收集四組數(shù)據(jù)
{
for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
{
while (IRIN); //等 IR 變?yōu)榈碗娖,如果是第一次采集跳過4.5ms高電平信號。
while (!IRIN); //等 IR 變?yōu)楦唠娖?br />
while (IRIN) //計(jì)算IR高電平時(shí)長 猶豫單片機(jī)的運(yùn)行 存在著計(jì)算時(shí)間
{
delay_us(280); //27M下大約300+us
N++;
if(N>=30)
{ EX0=1; //開中斷
return;} //0.14ms計(jì)數(shù)過長自動離開。
} //高電平計(jì)數(shù)完畢
IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補(bǔ)“0”
if (N>=6)
{IRCOM[j]=IRCOM[j] | 0x80;} //數(shù)據(jù)最高位補(bǔ)“1”
N=0;
}
}
if (IRCOM[2]!=~IRCOM[3]) //控制碼 控制反碼進(jìn)行比對 如果錯誤跳出
{ EX0=1;return; }
ma[1]=IRCOM[2] & 0x0F; //取鍵碼的低四位
ma[0]=IRCOM[2] >> 4; //右移4位 取高四位值
if(ma[1]>9)
ma[1]=ma[1]+0x37; //A 從65開始 十六進(jìn)制為0x41
else
ma[1]=ma[1]+0x30;
if(ma[0]>9)
ma[0]=ma[0]+0x37;
else
ma[0]=ma[0]+0x30;
hong=1; //打開標(biāo)志位
EX0 = 1; //開中斷
}
Keil代碼下載:
紅外解碼.zip
(214.92 KB, 下載次數(shù): 35)
2022-1-19 15:21 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|