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