打印

saa3010红外解码的问题

[复制链接]
1750|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
472666GAQ|  楼主 | 2009-10-20 07:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的这个程序是红外解码(芯片是saa3010)就是在解码的过程中有按两个不一样的键但是显示一个数值  还有就是按有的按键会导致液晶显示胡混乱   比如应该显示a0 他会显示成a00   还有的就是会在1602的第二行显示数字      有时会导致1602不显示了
这是为啥  大家帮帮忙了  (有的按键就行)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar num,count;
uchar table[3];
uchar code GAQ[16]={'0','1','2','3','4',
'5','6','7','8','9','A','B','C','D','E','F'};
sbit IR=P3^2;
sbit rs=P2^4;    //液晶
sbit rw=P2^5;
sbit e=P2^6;
void delayms(uchar x)
{   
    uchar j,k;
for(j=240;j>0;j--)
  for(k=x;k>0;k--);
}

void delayus(uint data gaq)  
{
while(gaq--);
}
/*-----------------------------------------
          1602的读写函数
-----------------------------------------*/
void write1602_step(uchar step)    //lcd写指令子程序
{
     rs=0;
        rw=0;
        e=1;
        P0=step;
        e=0;
        delayus(4);      
}
void write1602_date(uchar date)   //lcd写数据子程序
{
     rs=1;
        rw=0;
        e=1;
        P0=date;
        e=0;
        delayus(4);
}
void init1602()
{   
      e=0;
      delayus(1400);//延时10ms用于液晶上电自动初始化
      write1602_step(0x38);   
      write1602_step(0x0c);
      write1602_step(0x06);
      write1602_step(0x01);
      delayus(160);
}
void init_IR()
{
    TMOD=0x01; //定时器0工作方式1  
    IR=1;      //置int0位高电平下降沿触发
    IT0=1;     //外部中断下降沿触发
    EX0=1;     //开启外部中断
ET0=1;    //开启定时器0的中断
    EA=1;      //开启总中断
}
void main()
{   
   init1602();
    init_IR();
while(1)
{
  P1=table[2];
     write1602_step(0x80);   
     write1602_date(GAQ[table[2]/16]);    //取高位
     write1602_step(0x81);   
        write1602_date(GAQ[table[2]&0x0f]);  //取低位
}
}
void IR_INT0() interrupt 0 using 0
{   
    TL0=0x86;  //赋低位
TR0=1;     //开启定时器0
    TH0=0xfe;   //赋高位
    EX0=0;     //关闭外部中断
    table[0]=table[1]=table[2]=0;  
num=0;
    count=0;  
}
void time0() interrupt 1 using 0
{   
    bit in=~IR;
    TL0=0x85;  //赋初值
TH0=0xf9;
if(count==3) //滤掉多余的脉冲
{  
     TR0=0; //关闭定时器0
  IR=1;  //复位
  delayms(168);//延时避开重复按键的时间80ms
        IE0=0;
  TF0=0;
  EX0=1;  //开启外部中断
  return;
}
    num++;
   if(num==3)
    {
  count=1;
    }
    else if(num==8)
    {
     count=2;
    }
    else if(num==14)
    {
     count=3;
    }
    else if(count!=3)
    {
  table[count]=table[count]|in;
        table[count]<<=1;
}
}

相关帖子

沙发
duojinian| | 2009-10-20 11:33 | 只看该作者
刷新显示最好在中断中。屏蔽按钮干扰。

使用特权

评论回复
板凳
duojinian| | 2009-10-20 11:33 | 只看该作者
刷新显示最好在中断中。屏蔽按钮干扰。

使用特权

评论回复
地板
duojinian| | 2009-10-20 11:34 | 只看该作者
或者在等待确认开关按下的延时等待中刷新显示

使用特权

评论回复
5
472666GAQ|  楼主 | 2009-10-20 13:39 | 只看该作者
是不是这样会破坏  1602的读写时序么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

285

帖子

2

粉丝