OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2883|回复: 3

键盘经常出错码

[复制链接]

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
发表于 2016-6-15 11:11:58 | 显示全部楼层 |阅读模式
3金钱
键盘经常出现 j=5 的情况,调试了很久始终不能解决,请帮忙指点下。
u8 check_Key(void)
{   
    u16 cord_h,cord_l;//行列值中间变量  高位为行 ,低位为列;
    u8 i=5,j=5;
    u8 const Key_Tab[4][4]= //键盘编码表  4x4
    {
   
      {'3','7','+','#'},     
      {'2','6','.','*'},   
      {'1','5','9','!'},      
      {'0','4','8','-'}
    };                     //#代表电源开关,*代表复位,!代表回车


    GPIO_InitTypeDef  GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG,ENABLE);//使能PORTB,G功能时钟
    JTAG_Set(JTAG_SWD_DISABLE);            //由于JTAG口用到PB3-PB4,与键盘冲突,所以要先关掉
    GPIO_InitStruct.GPIO_Pin= GPIO_Pin_15;    //G口的15脚上拉输入
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOG, &GPIO_InitStruct);

     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;    //B口的3-5脚上拉输入
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

       GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;    //B口的pin6-pin9脚推挽输出
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

   

    delay_us(1);
   

    GPIO_SetBits(GPIOG,GPIO_Pin_15);
    GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);
    GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);
    delay_us(1);         //现改为1ms,未解决连按的问题
   
    cord_h = GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_15);
    cord_h =cord_h +((GPIOB->IDR & 0x0038)>>2);
    if(cord_h != 0x000F)    //先检测有无按键按下     //1000 0000 0011 1000     GPIOG15....GPIOB3-5  
    {
        //Delay_Nms(100);        //去抖
          delay_ms(100);//去抖动      原为10ms,后改为100
        cord_h = (GPIOG->IDR & 0x8000)>>15;     //读入行线G口PIN15值   //1000 0000 0000 0000
        cord_h = cord_h + ((GPIOB->IDR & 0x0038)>>2);     //读入行线B口PIN3-5值   //0000 0000 0011 1000
        if(cord_h != 0x000F)  // 1000 0000 0011 1000
        {   
        
           switch(cord_h)
           {
             case 0x000e:i=0;break;   //0x0e  0000_1110
             case 0x000d:i=1;break; //0x0d  0000_1101
             case 0x000b:i=2;break; //0xb0  0000_1011
             case 0x0007:i=3;break;    //0x70  0000-0111
             default:break;
           }   
           printf("i is %d\r\n",i);
                                                
            
     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_15;    //G口的p15推挽输出
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOG, &GPIO_InitStruct);
     delay_us(1);         //现改为1ms,未解决连按的问题


       GPIO_InitStruct.GPIO_Pin= GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;    //B口的pin3-pin5脚推挽输出
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);


     GPIO_InitStruct.GPIO_Pin= GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;    //B口的pin6-pin9上拉输入
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    delay_us(1);  //原来为1us
       GPIO_ResetBits(GPIOG,GPIO_Pin_15);              //G口PIN15输出0

    GPIO_ResetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);       // B口PIN3-5清0

       GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9);  //B口pin6-pin9设置为1

            delay_ms(1);// 此延时比不可少;    原为3,后改为30,现改为100(反应慢),改为50

   cord_l = (GPIOB->IDR&0x03C0)>>2;      

              switch(cord_l)
              {
                 case 0x00e0:j=0;break;         
                 case 0x00d0:j=1;break;         
                 case 0x00b0:j=2;break;         
                 case 0x0070:j=3;break;         
                 default:break;
              }
            printf("j is %d\r\n",j);     //这句经常 j=5,说明键盘没有捕捉到
            return (Key_Tab[j]);
        }
    }

    return 0xFF;     //返回该值
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-6-15 20:43:15 | 显示全部楼层
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
 楼主| 发表于 2016-6-16 22:46:28 | 显示全部楼层
哪位好心人帮看看
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
 楼主| 发表于 2016-6-22 11:46:39 | 显示全部楼层

给点提示吧,从哪里找问题?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 10:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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