找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3914|回复: 0
收起左侧

msp430单片机 ir.c红外驱动文件

[复制链接]
ID:76127 发表于 2015-4-18 03:30 | 显示全部楼层 |阅读模式

  1. /********************************************************************
  2. //DM430-L型核心板红外遥控器解码参考程序,对遥控器按键进行识别,然后将键值显示到数码管上
  3. //红外遥控器为NEC编码格式,38K调制,解码时直接读取键值,用户码00FF
  4. //由于采取的是IO电平直接判断方式读取,会有不稳定的现象,按键时频率不要过快
  5. //键值直接显示在LED灯上,二进制代码的形式显示,比如00,LED灯全亮,01,D1灭,其余全亮
  6. //时间:2014.03.01
  7. ********************************************************************/
  8. #include <msp430x16x.h>
  9. #include "Config.h"                  //开发板配置头文件,主要配置IO端口信息
  10. #include"1602.c"
  11. //***********************************************************************
  12. //   遥控器键码
  13. //***********************************************************************
  14. #define KEY_0     0x16                 //键0
  15. #define KEY_1     0x0C                 //键1
  16. #define KEY_2     0x18                 //键2
  17. #define KEY_3     0x5E                 //键3
  18. #define KEY_4     0x08                 //键4
  19. #define KEY_5     0x1C                 //键5
  20. #define KEY_6     0x5A                 //键6
  21. #define KEY_7     0x42                 //键7
  22. #define KEY_8     0x52                 //键8
  23. #define KEY_9     0x4A                 //键9
  24. #define prex      0x44                 //电源
  25. #define nex       0x40                 //模式
  26. #define play_pause 0x43                 //静音
  27. #define ch_       0x45                //模式
  28. #define ch        0x46
  29. #define cha       0x47                 //模式
  30. #define __         0x07
  31. #define _a        0x15
  32. #define eq        0x09
  33. #define _100a      0x19
  34. #define _200a      0x0d
  35. uchar KEY_VAL=0;
  36. uchar code_value=0;
  37. uchar key_code[4];
  38. uchar x=5,y=0, code[21];
  39. uchar a=5,b=5,c=5,d=0;
  40. ulong shu;
  41. //***********************************************************************
  42. //               MSP430IO口初始化
  43. //***********************************************************************
  44. void Port_Init1()
  45. {
  46. //  LED8DIR  = 0xFF;                      //设置IO口方向为输出
  47. //  LED8 = 0xFF;                      //P2口初始设置为FF
  48.   
  49.   RED_L;
  50.   RED_IN;
  51. }
  52. //*************************************************************************
  53. //   遥控器键值赋功能值子程序
  54. //*************************************************************************
  55. void Key_Icode(void)
  56. {void  Display_Key1();
  57.   void Display_Key();
  58.   void find();
  59.    switch(key_code[2])                    //第3个字节是数据,第4个字节是反码
  60.    {                                      //为了更稳定,可以加上第4个字节数据的判断
  61.    case KEY_0:KEY_VAL=0; Display_Key(KEY_VAL); break;
  62.    case KEY_1:KEY_VAL=1; Display_Key(KEY_VAL); break;
  63.    case KEY_2:KEY_VAL=2; Display_Key(KEY_VAL); break;
  64.    case KEY_3:KEY_VAL=3; Display_Key(KEY_VAL); break;
  65.    case KEY_4:KEY_VAL=4; Display_Key(KEY_VAL); break;
  66.    case KEY_5:KEY_VAL=5; Display_Key(KEY_VAL); break;
  67.    case KEY_6:KEY_VAL=6;  Display_Key(KEY_VAL); ;break;
  68.    case KEY_7:KEY_VAL=7; Display_Key(KEY_VAL); break;
  69.    case KEY_8:KEY_VAL=8; Display_Key(KEY_VAL); break;
  70.    case KEY_9:KEY_VAL=9; Display_Key(KEY_VAL); break;
  71.    case prex:LCD_write_str(0,0,"prex:");break;
  72.    case nex :LCD_write_str(0,0,"next:");break;
  73.    case play_pause:LCD_init();break;
  74.    case ch_:code[5]='/';Display_Key1(code[5]); break;
  75.    case ch: code[5]='=';Display_Key1(code[5]);break;
  76.    case cha:code[5]='*';Display_Key1(code[5]);break;
  77.    case eq: LCD_init();LCD_write_str(0,0,"start");x=5;break;
  78.    case _a:code[5]='+';Display_Key1(code[5]);break;
  79.    case __:code[5]='-';Display_Key1(code[5]);break;
  80.    case _100a:code[5]=0xa2;LCD_write_str(x,y,"100+");x+=4;find();break;
  81.    case _200a:code[5]=0xa3;LCD_write_str(x,y,"200+");x+=4;find();break;
  82.    default:KEY_VAL=10;break;
  83.    }
  84.   
  85. }
  86. void cauculate()
  87. {if(a==0)a=5;
  88. if(b==0)b=5;
  89. if(c==0)c=5;
  90. if(d==21)d=0;
  91. }
  92. //*************************************************************************
  93. //     显示采集到的数据到LED灯
  94. //*************************************************************************
  95. void Display_Key(uint data_KEY)
  96. {
  97.   LCD_write_char(x,y,KEY_VAL+0x30); delay_ms(5);      //键值显示到LED灯上,二进制的形式显示,只识别0~9  
  98.   x++;
  99.   if((x==16)&(y==0))
  100.   { x=0;y=1;}
  101.   if((x==16)&(y==1))
  102.   {x=5;y=0;LCD_init();
  103.   }
  104. }
  105. void Display_Key1(uint data_KEY)
  106. {
  107.   LCD_write_char(x,y,code[5]); delay_ms(5);      //键值显示到LED灯上,二进制的形式显示,只识别0~9  
  108.   if((x==16)&(y==0))
  109.   { x=0;y=1;}
  110.   if((x==16)&(y==1))
  111.   {x=5;y=0;LCD_init();
  112.   }
  113. }
  114. void find()
  115. {if((x==16)&(y==0)){x=0;y=1;}
  116. if((x==16)&(y==1)){x=5;y=0;}
  117. }
  118. //*************************************************************************
  119. // 遥控器解码子程序
  120. //*************************************************************************
  121. void Red_Code()
  122. {
  123. uchar i,j,k = 0;
  124. for(i = 0;i < 19;i++)
  125. {
  126.   delay_us(400);           //延时400us
  127.   if(RED_R)                //9ms内有高电平,则判断为干扰,退出处理程序
  128.   {
  129.       return;
  130.   }
  131. }
  132. while(!RED_R);            //等待9ms低电平过去

  133. for(i=0;i<5;i++)          //是否连发码
  134. {
  135.   delay_us(500);
  136.   if(!RED_R)
  137.    {
  138.      return;
  139.    }
  140. }

  141. while(RED_R);               //等待4.5ms高电平过去
  142. for(i = 0;i < 4;i++)        //接收4个字节的数据
  143. {
  144.   for(j = 0;j < 8;j++)      //每个字节的数据8位
  145.   {
  146.   
  147.    while(!RED_R);           //等待变高电平
  148.    while(RED_R)             //计算高电平时间
  149.    {
  150.     delay_us(100);
  151.     k++;
  152.     if(k >22)               //高电平时间过长,则退出处理程序
  153.     {
  154.      return;        
  155.     }
  156.    
  157.    }
  158.    code_value>>=1;          //接受一位数据
  159.    if(k >= 7)
  160.    {
  161.     code_value|=0x80;       //高电平时间大于0.56,则为数据1
  162.    }
  163.    k = 0;                  //计时清零
  164.   }
  165.   key_code[i]=code_value;  //四个字节的数据
  166. }
  167.   Key_Icode();             //调用赋值函数
  168. // Display_Key(KEY_VAL);     //显示按键值

  169.   delay_ms(50);
  170. }
  171. //***********************************************************************
  172. //            主程序
  173. //***********************************************************************
  174. void main(void)
  175. {   
  176.   WDT_Init();                         //看门狗初始化
  177.   Clock_Init();                       //时钟初始化
  178.   Port_Init();
  179.    Port_Init1();
  180.   //端口初始化,用于控制IO口输入或输出
  181. // ADC_Init();                         //初始化ADC配置
  182.   delay_ms(100);                      //延时100ms
  183.   LCD_init();                         //液晶参数初始化设置
  184.   LCD_clear();                        //清屏
  185.   LCD_Desk();
  186.   _EINT();  

  187.     while(1)
  188. {
  189.     Red_Code();                       //调用遥控器解码子程序
  190. }
  191. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表