- /********************************************************************
- //DM430-L型核心板紅外遙控器解碼參考程序,對遙控器按鍵進行識別,然后將鍵值顯示到數碼管上
- //紅外遙控器為NEC編碼格式,38K調制,解碼時直接讀取鍵值,用戶碼00FF
- //由于采取的是IO電平直接判斷方式讀取,會有不穩定的現象,按鍵時頻率不要過快
- //鍵值直接顯示在LED燈上,二進制代碼的形式顯示,比如00,LED燈全亮,01,D1滅,其余全亮
- //時間:2014.03.01
- ********************************************************************/
- #include <msp430x16x.h>
- #include "Config.h" //開發板配置頭文件,主要配置IO端口信息
- #include"1602.c"
- //***********************************************************************
- // 遙控器鍵碼
- //***********************************************************************
- #define KEY_0 0x16 //鍵0
- #define KEY_1 0x0C //鍵1
- #define KEY_2 0x18 //鍵2
- #define KEY_3 0x5E //鍵3
- #define KEY_4 0x08 //鍵4
- #define KEY_5 0x1C //鍵5
- #define KEY_6 0x5A //鍵6
- #define KEY_7 0x42 //鍵7
- #define KEY_8 0x52 //鍵8
- #define KEY_9 0x4A //鍵9
- #define prex 0x44 //電源
- #define nex 0x40 //模式
- #define play_pause 0x43 //靜音
- #define ch_ 0x45 //模式
- #define ch 0x46
- #define cha 0x47 //模式
- #define __ 0x07
- #define _a 0x15
- #define eq 0x09
- #define _100a 0x19
- #define _200a 0x0d
- uchar KEY_VAL=0;
- uchar code_value=0;
- uchar key_code[4];
- uchar x=5,y=0, code[21];
- uchar a=5,b=5,c=5,d=0;
- ulong shu;
- //***********************************************************************
- // MSP430IO口初始化
- //***********************************************************************
- void Port_Init1()
- {
- // LED8DIR = 0xFF; //設置IO口方向為輸出
- // LED8 = 0xFF; //P2口初始設置為FF
-
- RED_L;
- RED_IN;
- }
- //*************************************************************************
- // 遙控器鍵值賦功能值子程序
- //*************************************************************************
- void Key_Icode(void)
- {void Display_Key1();
- void Display_Key();
- void find();
- switch(key_code[2]) //第3個字節是數據,第4個字節是反碼
- { //為了更穩定,可以加上第4個字節數據的判斷
- case KEY_0:KEY_VAL=0; Display_Key(KEY_VAL); break;
- case KEY_1:KEY_VAL=1; Display_Key(KEY_VAL); break;
- case KEY_2:KEY_VAL=2; Display_Key(KEY_VAL); break;
- case KEY_3:KEY_VAL=3; Display_Key(KEY_VAL); break;
- case KEY_4:KEY_VAL=4; Display_Key(KEY_VAL); break;
- case KEY_5:KEY_VAL=5; Display_Key(KEY_VAL); break;
- case KEY_6:KEY_VAL=6; Display_Key(KEY_VAL); ;break;
- case KEY_7:KEY_VAL=7; Display_Key(KEY_VAL); break;
- case KEY_8:KEY_VAL=8; Display_Key(KEY_VAL); break;
- case KEY_9:KEY_VAL=9; Display_Key(KEY_VAL); break;
- case prex:LCD_write_str(0,0,"prex:");break;
- case nex :LCD_write_str(0,0,"next:");break;
- case play_pause:LCD_init();break;
- case ch_:code[5]='/';Display_Key1(code[5]); break;
- case ch: code[5]='=';Display_Key1(code[5]);break;
- case cha:code[5]='*';Display_Key1(code[5]);break;
- case eq: LCD_init();LCD_write_str(0,0,"start");x=5;break;
- case _a:code[5]='+';Display_Key1(code[5]);break;
- case __:code[5]='-';Display_Key1(code[5]);break;
- case _100a:code[5]=0xa2;LCD_write_str(x,y,"100+");x+=4;find();break;
- case _200a:code[5]=0xa3;LCD_write_str(x,y,"200+");x+=4;find();break;
- default:KEY_VAL=10;break;
- }
-
- }
- void cauculate()
- {if(a==0)a=5;
- if(b==0)b=5;
- if(c==0)c=5;
- if(d==21)d=0;
- }
- //*************************************************************************
- // 顯示采集到的數據到LED燈
- //*************************************************************************
- void Display_Key(uint data_KEY)
- {
- LCD_write_char(x,y,KEY_VAL+0x30); delay_ms(5); //鍵值顯示到LED燈上,二進制的形式顯示,只識別0~9
- x++;
- if((x==16)&(y==0))
- { x=0;y=1;}
- if((x==16)&(y==1))
- {x=5;y=0;LCD_init();
- }
- }
- void Display_Key1(uint data_KEY)
- {
- LCD_write_char(x,y,code[5]); delay_ms(5); //鍵值顯示到LED燈上,二進制的形式顯示,只識別0~9
- if((x==16)&(y==0))
- { x=0;y=1;}
- if((x==16)&(y==1))
- {x=5;y=0;LCD_init();
- }
- }
- void find()
- {if((x==16)&(y==0)){x=0;y=1;}
- if((x==16)&(y==1)){x=5;y=0;}
- }
- //*************************************************************************
- // 遙控器解碼子程序
- //*************************************************************************
- void Red_Code()
- {
- uchar i,j,k = 0;
- for(i = 0;i < 19;i++)
- {
- delay_us(400); //延時400us
- if(RED_R) //9ms內有高電平,則判斷為干擾,退出處理程序
- {
- return;
- }
- }
- while(!RED_R); //等待9ms低電平過去
-
- for(i=0;i<5;i++) //是否連發碼
- {
- delay_us(500);
- if(!RED_R)
- {
- return;
- }
- }
- while(RED_R); //等待4.5ms高電平過去
- for(i = 0;i < 4;i++) //接收4個字節的數據
- {
- for(j = 0;j < 8;j++) //每個字節的數據8位
- {
-
- while(!RED_R); //等待變高電平
- while(RED_R) //計算高電平時間
- {
- delay_us(100);
- k++;
- if(k >22) //高電平時間過長,則退出處理程序
- {
- return;
- }
-
- }
- code_value>>=1; //接受一位數據
- if(k >= 7)
- {
- code_value|=0x80; //高電平時間大于0.56,則為數據1
- }
- k = 0; //計時清零
- }
- key_code[i]=code_value; //四個字節的數據
- }
- Key_Icode(); //調用賦值函數
- // Display_Key(KEY_VAL); //顯示按鍵值
-
- delay_ms(50);
- }
- //***********************************************************************
- // 主程序
- //***********************************************************************
- void main(void)
- {
- WDT_Init(); //看門狗初始化
- Clock_Init(); //時鐘初始化
- Port_Init();
- Port_Init1();
- //端口初始化,用于控制IO口輸入或輸出
- // ADC_Init(); //初始化ADC配置
- delay_ms(100); //延時100ms
- LCD_init(); //液晶參數初始化設置
- LCD_clear(); //清屏
- LCD_Desk();
- _EINT();
-
- while(1)
- {
- Red_Code(); //調用遙控器解碼子程序
- }
- }
復制代碼
|