打印

C51红外遥控跟按键实现同一功能出现问题

[复制链接]
639|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
十點半|  楼主 | 2022-6-11 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教一下各位大佬,下面的代码下载进去之后发现上电时按下按键第一次的时候直接跳过第一个“case 0x04:P1 = 0x01; break;      //打开红色LED”直接从第二行“case 0x05:P1 = 0x02; break;      //打开绿色LED”开始执行。当case循环一周之后就又正常了。重新上电之后又恢复到之前的问题
    哪位大佬知道原因烦请指点一下,谢谢
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

unsigned char irtime;//红外用全局变量

bit irpro_ok,irok;
bit key_ok;//<<<<<<<<<<<<<<<<<<<<<<<<<<<

unsigned char IRcord[4];//用来存放用户码、用户反码、数据码、数据反码
unsigned char irdata[33];//用来存放32位码值

typedef unsigned char u8;
typedef unsigned int u16;

u16 mode;

sbit key = P3^4;

void delay(u16 i)
{
        while(i--);
}

void tim0_isr()interrupt 1  //定时器0中断服务函数
{
        irtime++;
}

void ex0_isr()interrupt 0   //外部中断0服务函数
{
        static unsigned char i;
        static bit startflag;
        if(startflag)
        {
                if(irtime<53&&irtime>=32)
                 i=0;
                irdata=irtime;              
                irtime=0;
                i++;
                if(i==33)
                {
                        irok=1;
                        i=0;
                }
        }
        else
        {
                irtime=0;
                startflag=1;
        }
}

void TIM0init()//定时器0初始化
{
        TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
        TH0=0x00;
        TL0=0x00;
        EA=1;
        ET0=1;//开总中断
        TR0=1;

        IT0=1;
        EX0=1;

}
void Ircordpro()//红外码值处理函数(关键函数)
{
        unsigned char i,j,k=1;
        unsigned char cord,value;

        for(i=0; i<4; i++)              //处理4个字节
        {
                for(j=1; j<=8; j++)       //处理1个字节8位
                {
                        cord=irdata[k];
                        value=value>>1;
                        if(cord>7)value=value|0x80;//大于某值为1
                        k++;
                }
                IRcord=value;               
                value=0;
        }
        irpro_ok=1;//处理完毕标志位置1
}

void Key()                          //按键
{
        if(key==0)
        {
                delay(1000);
                if(key==0)
                {
                        key_ok = 1;//<<<<<<<<<<<<<<<<<<<<<<<<<<<
                        mode++;               
                        if(mode==7)
                        {
                                mode=0;
                        }               
                        while(!key);
                }
        }
}

void Led_Control()//<<<<<<<<<<<<<<<<<<<<<<<<<<<
{
                unsigned char Temp = 0;
//                static u8 Temp = 0;
                if(irok)
        {
                Ircordpro();
                irok=0;
        }
        if(irpro_ok)
        {
                irpro_ok = 0;
                Temp = IRcord[2];
        }
        if(key_ok)
        {
            key_ok = 0;
            Temp = mode+4;
        }   
        switch(Temp)
        {
                case 0x04:P1 = 0x01; break;      //打开红色LED
                case 0x05:P1 = 0x02; break;      //打开绿色LED
                case 0x06:P1 = 0x04; break;      //打开蓝色LED
                case 0x07:P1 = 0x07; break;      //打开白色LED
                case 0x08:P1 = 0x03; break;      //打开红绿色LED
                case 0x09:P1 = 0x05; break;      //打开红蓝色LED
                case 0x0a:P1 = 0x06; break;      //打开绿蓝色LED
                default:break;
        }
}
void main()
{
        P1 = 0x00;
        TIM0init();
        while(1)
        {
                Key();
                Led_Control();//<<<<<<<<<<<<<<<<<<<<<<<<<<<
        }
}

使用特权

评论回复

相关帖子

沙发
qwer345| | 2022-6-18 10:13 | 只看该作者
按键是不是需要加上拉啊!重启检测到按键低了

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝