做红外线实验时,我想按某个键让某个数加一,但按了一次,它连加了好几次,究竟是什么问题,有哪位大神帮忙一下,谢谢

2019-08-14 20:12发布

int main(void)
{
         u8 a,d=0;
        u8 key;
        //u8 t=0;       
        u8 *str=0;        
        delay_init();                     //延时函数初始?
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2          
        uart_init(9600);                 //串口初始化为9600
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();
        Remote_Init();                        //红外接收初始化         
        POINT_COLOR=RED;//设置字体为红 {MOD}
        LCD_ShowString(60,50,200,16,16,"Mini STM32");       
        LCD_ShowString(60,70,200,16,16,"REMOTE TEST");       
        LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
        //LCD_ShowString(60,110,200,16,16,"2014/3/12");

           LCD_ShowString(60,130,200,16,16,"KEYVAL:");       
           LCD_ShowString(60,150,200,16,16,"KEYCNT:");       
           LCD_ShowString(60,170,200,16,16,"SYMBOL:");                                                                                                                   
        while(1)
        {
                key=Remote_Scan();       
                if(key)
                {         
                        LCD_ShowNum(116,130,key,3,16);                //显示键值
                        LCD_ShowNum(116,150,RmtCnt,3,16);        //显示按键次数                  
                        switch(key)
                        {
                                case 0:str="ERROR";break;                          
                                case 162:str="POWER";break;            
                                case 98:str="UP";break;            
                                case 2:str="PLAY";break;                 
                                case 226:str="ALIENTEK";break;                  
                                case 194:str="RIGHT";break;          
                                case 34:str="LEFT";break;                  
                                case 224:str="VOL-";break;                  
                                case 168:str="DOWN";break;                  
                                case 144:str="VOL+";d++;key=1;break;        //这里按一次,屏幕上显示d连加了好几次            
                                case 104:str="1";break;                  
                                case 152:str="2";break;          
                                case 176:str="3";break;            
                                case 48:str="4";break;                    
                                case 24:str="5";break;                    
                                case 122:str="6";break;                  
                                case 16:str="7";break;                                                                  
                                case 56:str="8";break;         
                                case 90:str="9";break;
                                case 66:str="0";break;
                                case 82:str="DELETE";break;                 
                        }
                        LCD_Fill(116,170,116+8*8,170+16,WHITE);        //清楚之前的显示
                        LCD_ShowString(116,170,200,16,16,str);        //显示SYMBOL
                        LCD_ShowNum(60,110,d,3,16);
                }
                if(key==104)a=1;
                if(key==66)a=0;
                if(a==1)
                {
                       
                        LED0=0;
                        LED1=1;
                        delay_ms(300);
                        LED0=1;
                        LED1=0;
                       
                }
        }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
电子情人
1楼-- · 2019-08-15 15:24
需要看你的按键扫描函数,当没有按下按键时key的返回值是否是零,或者是你根本没更新key的值,还是上一次按键的值。
斌老弟
2楼-- · 2019-08-15 16:01
在remate.c文件中的Remote_Scan函数最后加上RmtSta&=0<<6;
zzqasim
3楼-- · 2019-08-15 17:03
支持松手检测,需要连按的自己话改一下


u8 Remote_Scan(void)
{        
    u8 sta=0;      
    u8 t1,t2;  
    if(RmtSta&(1<<6))//得到一个按键的所有信息了
    {
        t1=RmtRec>>24;            //得到地址码
        t2=(RmtRec>>16)&0xff;    //得到地址反码
         if((t1==(u8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址
        {
            t1=RmtRec>>8;
            t2=RmtRec;     
            if(t1==(u8)~t2)sta=t1;//键值正确               
        }   
        if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了
        {
             RmtSta&=~(1<<6);//清除接收到有效按键标识
            RmtCnt=0;        //清除按键次数计数器
            return sta;  
        }
    }

        return 0;  
}
大楠神
4楼-- · 2019-08-15 21:51
zzqasim 发表于 2016-12-3 18:47
支持松手检测,需要连按的自己话改一下

谢谢 很有用

一周热门 更多>