红外遥控解码+LCD1602显示

发布者:朝霞暮雨最新更新时间:2016-10-23 来源: eefocus关键字:红外遥控解码  LCD1602显示 手机看文章 扫描二维码
随时随地手机看文章
#include

#define uint unsigned int
#define uchar unsigned char


sbit ir=P3^3;//红外端口
sbit dm=P1^4;//数码管段码控制位
sbit wm=P1^5;//数码管位码控制位
sbit led_cs=P1^6;//LED控制位
sbit rs=P3^5;//1602数据命令选择端
sbit en=P3^4;//1602使能信号

uchar num;
uchar key_code=0;//遥控键值
uchar new_code=0;//有无新按键
uint  buf_key_code=0;//键值暂存
uchar key_bit_count=0;//键编码脉冲计数
uint count=0;//定时中断次数计数
uint buf_count=0;//定时中断计数暂存
uchar common_code_count=0;//前导码脉冲计数
uchar ir_status=0;//脉冲接收器所处的状态,0:无信号,1:系统码接收区,2:数据编码接收区
uchar code table[]="EE01 DEMO:IR";
uchar code table1[]="code:";
uchar code table2[]={'0','1','2','3','4','5','6','7','8','9',};

void delay_10us(unsigned char y)///延时子程序10us
  {
    unsigned char x;
    for(x=y;x>0;x--);
  }
void delay_ms(uint z)//延时子程序1ms
  {
    uint x,y;
    for(x=z;x>0;x--)
      for(y=113;y>0;y--);
  }


void init(void)/////初始化
  {
  ir=1;                //红外端口写1
  led_cs=0;              //关闭LED
  EA=1;                  //开总中断
  TMOD=0x02;            //定时器0,模式2,8位自动装载模式
  TH0=0Xd1;              //定时50us
  TL0=0Xd1;
  IT1=1;                //INT1下降沿触发
  ET0=1;                //允许定时器中断
  EX1=1;                //允许外部中断
  }


/***********************************************
  定时器中断

***********************************************/
void time0() interrupt 1///定时器中断
{  
    count++;//定时器中断次数累加
}


/**********************************************
  外部中断,红外解码程序
**********************************************/
void int1() interrupt 2///外部中断
{
  
    TR0=1;//开定时器中断
    if(count>12&&count<270)//如果信号合法,则放入buf_count,count清0,对下一个脉冲信号计时
    {
      buf_count=count;
      count=0;
      }
    delay_10us(10);//延时100us以消除下降沿跳变抖动
    if(ir==0)//INT1引脚稳定为低电平,则表法确实是信号,count重新计时,因上面延时了50us,故要补偿1次TO中断
      {
        count=2;
      }
    if(buf_count>12&&buf_count<270)//若收到的信号合法,则再进行信号分析
      {
      if(ir_status==0)//如果之前未收到引导码
        {
        if(buf_count>210&&buf_count<270)//判断是否引导码13.5ms
          {
            ir_status=1;//系统标记
            buf_count=0;//
          }
        }
    else if(ir_status==1)///收到引导码
      { 
      
        if(common_code_count>=25)//若收完26个脉冲
            {
              
              ir_status=2;//数据解码标记
              common_code_count=0;//系统码计算清零
              buf_count=0;//中断计数暂存清0
              } 
    
          else if((buf_count>40&&buf_count<70)||(buf_count>12&&buf_count<32))
            {
              buf_count=0;
              common_code_count++;//每收到一个信号自加1
            }
      
      }
  
    else if(ir_status==2)//进入数据编码接收
        { 
          if(key_bit_count<8)//收到数据少于8位,则将收到的数据写入buf_key_code
          {
            
            if(buf_count>40&&buf_count<70)
            {
            buf_count=0;
            buf_key_code>>=1;
            buf_key_code|=0x80;//收到1
            key_bit_count++;//数据脉冲累加
            }
            else if(buf_count>12&&buf_count<32)//收到0
            {
            buf_count=0;
            buf_key_code>>=1;//收到0
            key_bit_count++;
            }
          }
        
        else //若收完8位数据则做以下处理
        {  
          
            ir_status=0;//接收状态返回到空闲
            key_code=buf_key_code;
            key_bit_count=0;
            buf_key_code=0;
            buf_count=0;
            TR0=0;
            new_code=1;
            
          
          }
      }
    }
}

/**********************************************
1062驱动程序
**********************************************/


void wirte_cmd(uchar cmd)//写命令
{
  rs=0;
  P0=cmd;
  en=1;
  delay_ms(5);
  en=0;

}

void wirte_data(uchar dat)//写数据
{
  rs=1;
  P0=dat;
  en=1;
  delay_ms(5);
  en=0;

}
void wirte_string(const unsigned char *s)//在第二行第5个字开始写字符串
{
  wirte_cmd(0x80+0x40+0x05);
  while(*s)
    {
      wirte_data(*s);
      s++;
      }
  }
void init_1602()///1602初始化


  dm=0;
  wm=0;
  led_cs=0;
  wirte_cmd(0x38);
  delay_ms(5);
  wirte_cmd(0x0c);
  delay_ms(5);
  wirte_cmd(0x06);

}
/*************************************
  主程序
*************************************/
void main()
{  
  init();        ///初始化
  init_1602();  //1602初始化
  while(!new_code);//判断是否有新按键,如果有则执行下面程序,没有则一直循环
  wirte_cmd(0x01);//1602清屏
  delay_ms(5);
  wirte_cmd(0x80);//在第一行写入EE01 DEMO:IR
  for(num=0;num<12;num++)
  {
    wirte_data(table[num]);
    delay_ms(1);
    }
  wirte_cmd(0x80+0x40);//在第二行写入code:
  for(num=0;num<5;num++)
    {
    wirte_data(table1[num]);
    delay_ms(1);
    }

  if(key_code<10)//如果按鍵小于10则写入相应的数字
  {
    
    wirte_data(table2[key_code]);
    delay_ms(2);
  }
  else if(key_code<50)//大于10则写入字符,与遥控器对应
  {
    
    switch(key_code)
    {
      case 21:wirte_string("mute");break;
      case 28:wirte_string("power");break;
      case 10:wirte_string("-/--");break;
      case 14:wirte_cmd(0x80+0x40+0x05);wirte_data(0x7f);wirte_data(0x7e);break;//先写字符位置,然后写字符,
      case 25:wirte_string("SLEEP");break;
      case 19:wirte_string("P.P");break;
      case 15:wirte_string("TV/AV");break;
      case 30:wirte_string("VOL-");break;
      case 31:wirte_string("VOL+");break;
      case 27:wirte_string("P+");break;
      case 26:wirte_string("P-");break;
      case 16:wirte_string("MENU");break;
      case 24:wirte_string("A-MODE");break;
      case 13:wirte_string("SYS");break;
      case 12:wirte_string("GAME");break;
      case 20:wirte_string("DISP");break;
      delay_ms(2);
      
    }
    new_code=0;
  
  }
  
  }

关键字:红外遥控解码  LCD1602显示 引用地址:红外遥控解码+LCD1602显示

上一篇:51单片机的边沿触发及电平触发的区别
下一篇:基于SD2300的定时采集存储系统设计

推荐阅读最新更新时间:2024-03-16 15:17

PIC单片机实现LCD1602显示字母A
PIC单片机LCD1602显示单个A字程序 STATUS EQU 3H ;定义状态寄存器地址 PORTA EQU 5H ;定义RA口数据寄存器地址 PORTC EQU 7H ;定义RC口数据寄存器地 PORTD EQU 8H ;定义RD口数据寄存器地址 TRISA EQU 85H ;定义RA口方向控制寄存器地址 TRISC EQU 87H ;定义RC口方向控制寄存器地址 TRISD EQU 88H ;定义RD口方向控制寄存器地址 ADCON1 EQU 9FH ;定义ADC模块控制寄存器1的地址 ;******************** Z EQU 2 ;定义0状态位的位地址 RP0 EQU 5 ;定义页选位RP0的位地址
[单片机]
PIC单片机实现<font color='red'>LCD1602</font><font color='red'>显示</font>字母A
单片机控制LCD1602显示屏动态显示字符串
仿真电路图: 仿真实验结果: C语言程序代码: //------------------------------------------------*/ #include reg52.h //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include intrins.h sbit RS = P2^4; //定义端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0
[单片机]
单片机控制<font color='red'>LCD1602</font><font color='red'>显示</font>屏动态<font color='red'>显示</font>字符串
PIC单片机红外遥控编码与解码的问题分享
一般常用的红外遥控器编码规则都差不多,基本上都同6221原理一样 PIC单片机接收时: 如果用54,57这类片子做的话有一定的难度(假如要做成实时控制的;比如说你还要驱动显示,驱动步进电机,在加上几个按键)原因就是这类片子没有中断 例程如下(用来解6221;分频比为256) RF: BTFSC PORTB,2;;B2口用做接收口 GOTO RF1 BTFSS DOWNBIT;;检测下降沿标制 CLRF RTCCOUNT BSF DOWNBIT;制下降沿标制 BTFSS UPBIT;;检测上升沿标制 RETLW 0 BTFSC IDBIT;;检测码头标制 GOTO RF3 MOVLW 2AH SUBWF
[工业控制]
C51编程21-应用篇(LCD1602显示-2)
LCD的写模式操作 对LCD1602,具有四种基本的操作,读命令,写命令,读数据,写数据。由于主要是让LCD1602显示数据,我们只需要用到写命令与写数据即可。 写数据和写命令为称之为写模式 在LCD1602中, RS引脚的高低电平 控制是数据或者命令,高电平为数据,低电平为命令。 R/W引脚的高低电平控制是读模式或者写模式,高电平为读,低电平为写; E引脚控制数据与命令使能,使操作生效,高电平写入数据,低电平生效。 下面时序图为写模式的时序图 由于单片机运行的机器周期最快速度为1us,超过400ns,因此执行指令时可以不需要额外的延时。 写命令可以这样操作。 RS = 0; R/W =0
[单片机]
C51编程21-应用篇(<font color='red'>LCD1602</font><font color='red'>显示</font>-2)
keil c51红外遥控解码程序
本keil c51程序适用uPC1621/uPC1622及兼容的红外遥控器芯片,占用外部中断0和定时器1,以中断方式解码,节省系统资源,以查询方式检测遥控信号是否有效. 解码思路: 红外线经一体化接受头解码放到后送到单片机的外部中断0,单片机设置外部中断下降沿触发,T0和T1为16位定时器,T0在系统启动后定时5ms.T1在外部中断0启动后开始定时,初值为0,每次在INT0中断后先读T1计数值,并重设初值为0,而且判断T1的计数值, 代码 //Fosc=11.0592MHz //statesforandvariablesIRdataprocessing typedefenum{ IR_idle, IR_waitsta
[单片机]
51单片机驱动 LCD1602液晶显示系统
废话不多说先上实物图 LCD1602+51单片机最小系统应用仿真及制作 好了,接下来正式进入制作环节: 第一步:仿真 绘制好原理图,仿真时单片机最小系统只放一个单片机就可以了,但实际电路中需要加上电源模块、复位模块。如下图: 原理图文件请在附件中找。 原理图绘制好后,编写代码并生成hex文件。参考代码如下: /*功能/ /使用外部中断INTO改变LED状态,并且用1602显示出其状态/ #include reg51.h #include intrins.h #define uint unsigned int #define uchar unsigned char uchar code table = H
[单片机]
51单片机驱动 <font color='red'>LCD1602</font>液晶<font color='red'>显示</font>系统
LCD1602屏幕显示邮箱手机号(滚动和闪烁显示程序Proteus仿真)
学习了LCD用来显示两行邮箱和手机号 三种显示方式: 直接显示 滚动显示 闪烁显示 仿真原理图如下 单片机源程序如下: #include reg51.h sbit rs=P2^0; sbit rw=P2^1; sbit en=P2^2; #define uint unsigned int #define uchar unsigned char uchar code tab1 ={ 123456@163.com }; uchar code tab2 ={ tel:1234567891 }; void delay(unsigned int xms); void write_com(uchar com) { rw=0; r
[单片机]
<font color='red'>LCD1602</font>屏幕<font color='red'>显示</font>邮箱手机号(滚动和闪烁<font color='red'>显示</font>程序Proteus仿真)
51单片机学习笔记———14.LCD1602工业显示
LCD1602工业显示屏 LCD工业显示屏解读: 共有16个引脚,其中D0~D7为收发数据引脚,为双向并行数据接口。 16代表每一行能够显示16个空格 2代表总共两行 因为每一个字节能够显示0和1,有两种可能,所以要将32位全部显示完全的话,至少需要2^5,也就是5位,所以我们可以设置8位,也就是一个字节来发送数据,这样比较方便 其中第四脚比较特殊,用来决定是用来确定位置还是发送我们想要显示的数据 RS=0确定位置 RS=1确认数据 显示数据的步骤: 初始化LCD1602 发送指令(RS=0) ----确定位置 发送数据(RS=1)-----确认数据 `RS`为低电平时为发送指令 指令:决定
[单片机]
51单片机学习笔记———14.<font color='red'>LCD1602</font>工业<font color='red'>显示</font>屏
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved