|
|
普的板用起來呵呵呵呵,也見過TX的暴內幕,估計天下的板都差不太多。 想知道這個也很簡單,自己編個小程序讀就可以了,有顯示的開發板(包括自制的)都可以做到。以前還有用中九機讀后在電視上顯示的程序,網上太多太多隨便找個用用就可以。 樓上已貼了方法和鍵值,估計你的也差不多就這,兩塊錢的遙控器牛屎都差不多一個樣。 |
| 普中科技的吧 我也想知道 開發板配了紅外但又沒教程 沒資料 怪 |
2019-11-04_11.05.44.jpg (1009.33 KB, 下載次數: 74)
|
我這里有個程序,可以讓單片機顯示出你的遙控器的鍵值,再記錄下來就好了。 1602的驅動程序:lcd.c: #include"lcd.h" /******************************************************************************* * 函 數 名 : Lcd1602_Delay1ms * 函數功能 : 延時函數,延時1ms * 輸 入 : c * 輸 出 : 無 * 說 名 : 該函數是在12MHZ晶振下,12分頻單片機的延時。 *******************************************************************************/ void Lcd1602_Delay1ms(uint c) //誤差 0us { uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 數 名 : LcdWriteCom * 函數功能 : 向LCD寫入一個字節的命令 * 輸 入 : com * 輸 出 : 無 *******************************************************************************/ #ifndef LCD1602_4PINS //當沒有定義這個LCD1602_4PINS時 void LcdWriteCom(uchar com) //寫入命令 { LCD1602_E = 0; //使能 LCD1602_RS = 0; //選擇發送命令 LCD1602_RW = 0; //選擇寫入 LCD1602_DATAPINS = com; //放入命令 Lcd1602_Delay1ms(1); //等待數據穩定 LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); //保持時間 LCD1602_E = 0; } #else void LcdWriteCom(uchar com) //寫入命令 { LCD1602_E = 0; //使能清零 LCD1602_RS = 0; //選擇寫入命令 LCD1602_RW = 0; //選擇寫入 LCD1602_DATAPINS = com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); LCD1602_E = 0; // Lcd1602_Delay1ms(1); LCD1602_DATAPINS = com << 4; //發送低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); LCD1602_E = 0; } #endif /******************************************************************************* * 函 數 名 : LcdWriteData * 函數功能 : 向LCD寫入一個字節的數據 * 輸 入 : dat * 輸 出 : 無 *******************************************************************************/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat) //寫入數據 { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //選擇輸入數據 LCD1602_RW = 0; //選擇寫入 LCD1602_DATAPINS = dat; //寫入數據 Lcd1602_Delay1ms(1); LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); //保持時間 LCD1602_E = 0; } #else void LcdWriteData(uchar dat) //寫入數據 { LCD1602_E = 0; //使能清零 LCD1602_RS = 1; //選擇寫入數據 LCD1602_RW = 0; //選擇寫入 LCD1602_DATAPINS = dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); LCD1602_E = 0; LCD1602_DATAPINS = dat << 4; //寫入低四位 Lcd1602_Delay1ms(1); LCD1602_E = 1; //寫入時序 Lcd1602_Delay1ms(5); LCD1602_E = 0; } #endif /******************************************************************************* * 函 數 名 : LcdInit() * 函數功能 : 初始化LCD屏 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ #ifndef LCD1602_4PINS void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x38); //開顯示 LcdWriteCom(0x0c); //開顯示不顯示光標 LcdWriteCom(0x06); //寫一個指針加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //設置數據指針起點 } #else void LcdInit() //LCD初始化子程序 { LcdWriteCom(0x32); //將8位總線轉為4位總線 LcdWriteCom(0x28); //在四位線下的初始化 LcdWriteCom(0x0c); //開顯示不顯示光標 LcdWriteCom(0x06); //寫一個指針加1 LcdWriteCom(0x01); //清屏 LcdWriteCom(0x80); //設置數據指針起點 } #endif 1602的驅動頭文件lcd.h: #ifndef __LCD_H_ #define __LCD_H_ /********************************** 當使用的是4位數據傳輸的時候定義, 使用8位取消這個定義 **********************************/ #define LCD1602_4PINS /********************************** 包含頭文件 **********************************/ #include<reg51.h> //---重定義關鍵詞---// #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif /********************************** PIN口定義 **********************************/ #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6; /********************************** 函數聲明 **********************************/ /*在51單片機12MHZ時鐘下的延時函數*/ void Lcd1602_Delay1ms(uint c); //誤差 0us /*LCD1602寫入8位命令子函數*/ void LcdWriteCom(uchar com); /*LCD1602寫入8位數據子函數*/ void LcdWriteData(uchar dat) ; /*LCD1602初始化子程序*/ void LcdInit(); #endif 主程序: /******************************************************************************* * 實驗名 : 1602顯示紅外線值實驗 * 使用的IO : 電機用P1口,鍵盤使用P3.0、P3.1、P3.2、P3.3 * 實驗效果 : LCD1602顯示出讀取到的紅外線的值 * 注意 : *******************************************************************************/ #include<reg51.h> #include"lcd.h" sbit IRIN=P3^2; unsigned char code CDIS1[13]={" Red Control "}; unsigned char code CDIS2[13]={" IR-CODE:--H "}; unsigned char IrValue[6]; unsigned char Time; void IrInit(); void DelayMs(unsigned int ); /******************************************************************************* * 函數名 : main * 函數功能 : 主函數 * 輸入 : 無 * 輸出 : 無 *******************************************************************************/ void main() { unsigned char i; IrInit(); LcdInit(); LcdWriteCom(0x80); for(i=0;i<13;i++) { LcdWriteData(CDIS1); } LcdWriteCom(0x80+0x40); for(i=0;i<13;i++) { LcdWriteData(CDIS2); } while(1) { IrValue[4]=IrValue[2]>>4; //高位 IrValue[5]=IrValue[2]&0x0f; //低位 if(IrValue[4]>9) { LcdWriteCom(0xc0+0x09); //設置顯示位置 LcdWriteData(0x37+IrValue[4]); //將數值轉換為該顯示的ASCII碼 } else { LcdWriteCom(0xc0+0x09); LcdWriteData(IrValue[4]+0x30); //將數值轉換為該顯示的ASCII碼 } if(IrValue[5]>9) { LcdWriteCom(0xc0+0x0a); LcdWriteData(IrValue[5]+0x37); //將數值轉換為該顯示的ASCII碼 } else { LcdWriteCom(0xc0+0x0a); LcdWriteData(IrValue[5]+0x30); //將數值轉換為該顯示的ASCII碼 } } } /******************************************************************************* * 函數名 : DelayMs() * 函數功能 : 延時 * 輸入 : x * 輸出 : 無 *******************************************************************************/ void DelayMs(unsigned int x) //0.14ms誤差 0us { unsigned char i; while(x--) { for (i = 0; i<13; i++) {} } } /******************************************************************************* * 函數名 : IrInit() * 函數功能 : 初始化紅外線接收 * 輸入 : 無 * 輸出 : 無 *******************************************************************************/ void IrInit() { IT0=1;//下降沿觸發 EX0=1;//打開中斷0允許 EA=1; //打開總中斷 IRIN=1;//初始化端口 } /******************************************************************************* * 函數名 : ReadIr() * 函數功能 : 讀取紅外數值的中斷函數 * 輸入 : 無 * 輸出 : 無 *******************************************************************************/ void ReadIr() interrupt 0 { unsigned char j,k; unsigned int err; Time=0; DelayMs(70); if(IRIN==0) //確認是否真的接收到正確的信號 { err=1000; //1000*10us=10ms,超過說明接收到錯誤的信號 /*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時 侯,程序死在這里*/ while((IRIN==0)&&(err>0)) //等待前面9ms的低電平過去 { DelayMs(1); err--; } if(IRIN==1) //如果正確等到9ms低電平 { err=500; while((IRIN==1)&&(err>0)) //等待4.5ms的起始高電平過去 { DelayMs(1); err--; } for(k=0;k<4;k++) //共有4組數據 { for(j=0;j<8;j++) //接收一組數據 { err=60; while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去 // while (!IRIN) { DelayMs(1); err--; } err=500; while((IRIN==1)&&(err>0)) //計算高電平的時間長度。 { DelayMs(1);//0.14ms Time++; err--; if(Time>30) { EX0=1; return; } } IrValue[k]>>=1; //k表示第幾組數據 if(Time>=8) //如果高電平出現大于565us,那么是1 { IrValue[k]|=0x80; } Time=0; //用完時間要重新賦值 } } } if(IrValue[2]!=~IrValue[3]) { return; } } }
以下是我得到的結果:(很可能跟你的一樣)
|
|
一般賣家有鍵碼值,有的不想給你 以前我筆記中記錄有這么幾個,不知道你的是不是一樣 0 - 16 1 - 0C 2 - 18 3 - 5E 4 - 08 5 - 1C 6 - 5A 7 - 42 8 - 52 9 - 4A |
| 這個可以看網上的一些手冊 |
| 用數碼管把顯示的數抄下來,換成十進制,數碼管顯示的一般是16進制,再把兩個數字組合一下 |