打印

STM8S207_22.1184晶振_矩陈键盘抖动

[复制链接]
1977|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
swcore|  楼主 | 2011-1-26 21:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
你好  我自己做的   STM8S  电路板  为什么做矩陈键盘的时候  全是抖动  根本没法用  有时候手到线的边上   键盘就有动作  简直成了   感应按扭了
沙发
swcore|  楼主 | 2011-1-26 21:30 | 只看该作者
这是源码


void KeyPortInit(){
//键盘输出口
PG_DDR|=0x03;//PG0  PG1
//PG_CR1|=0x03;//PG0  PG1
PG_CR1&=~(0x03);//PG0  PG1
PG_CR2&=~(0x03);
PC_DDR|=0xC0;//PC7  Pc6
//PC_CR1|=0xC0;//PC7  Pc6
PC_CR1&=~(0xC0);//PC7  Pc6
PC_CR2&=~(0xC0);

//键盘输入口
PC_DDR&=~(0x2E);//PC  12345
PC_CR1|=(0x2E);//PC  12345
//PC_CR1&=~(0x2E);
PC_CR2&=~(0x2E);//PC  12345
//PC_ODR|=(0x2E);//PC  12345

PG_ODR|=0x03;
PC_ODR|=0xC0;
}
u8 KeyScan(){
u8 keyValue=0xFF;//默认键值为0xFF 全为11  也就是没有键被按下
u8 keyValueTmp=0;
//拉低第一引脚
PC_ODR&=~(1<<6);//PC6
Delay_Us(5);
if((PC_IDR&0x2E)!=0x2E){
  Delay_Ms(20);//延时8MS
  keyValueTmp=PC_IDR&0x2E;
  if(keyValueTmp!=0x2E){
   //有键被按下
   switch(keyValueTmp){
    case 0x0E : keyValue='1';
     while(1){
      if((PC_IDR&0x2E)!=0x0E){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x0E){
        return keyValue;
       }
      }
     }
     break;
    case 0x26 : keyValue='2';
     while(1){
      if((PC_IDR&0x2E)!=0x26){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x26){
        return keyValue;
       }
      }
     }
     break;
    case 0x2A : keyValue='3';
     while(1){
      if((PC_IDR&0x2E)!=0x2A){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x2A){
        return keyValue;
       }
      }
     }
     break;
    case 0x2C : keyValue='A';
     while(1){
      if((PC_IDR&0x2E)!=0x2C){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x2C){
        return keyValue;
       }
      }
     }
     break;
   }
  }
}
//拉高第一引脚
PC_ODR|=(1<<6);//PC6
Delay_Us(5);
//拉低第二引脚
PC_ODR&=~(1<<7);
Delay_Us(5);
if((PC_IDR&0x2E)!=0x2E){
  Delay_Ms(20);//延时8MS
  keyValueTmp=PC_IDR&0x2E;
  if(keyValueTmp!=0x2E){
   //有键被按下
   switch(keyValueTmp){
    case 0x0E : keyValue='4';
    //while((PC_IDR&0x3F)==0x0E);
     while(1){
      if((PC_IDR&0x2E)!=0x0E){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x0E){
        return keyValue;
       }
      }
     }
     break;
    case 0x26 : keyValue='5';
     while(1){
      if((PC_IDR&0x2E)!=0x26){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x26){
        return keyValue;
       }
      }
     }
     break;
    case 0x2A : keyValue='6';
     while(1){
      if((PC_IDR&0x2E)!=0x2A){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x2A){
        return keyValue;
       }
      }
     }
     break;
    case 0x2C : keyValue='B';
     while(1){
      if((PC_IDR&0x2E)!=0x2C){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x2C){
        return keyValue;
       }
      }
     }
     break;
   }
  }
}
//拉高第二引脚
PC_ODR|=(1<<7);
Delay_Us(5);
//拉低第三引脚
PG_ODR&=~(1<<0);//PG0
Delay_Us(5);
if((PC_IDR&0x2E)!=0x2E){
  Delay_Ms(20);//延时8MS
  keyValueTmp=PC_IDR&0x2E;
  if(keyValueTmp!=0x2E){
   //有键被按下
   switch(keyValueTmp){
    case 0x0E : keyValue='7';
    //while((PC_IDR&0x3F)==0x0E);
     while(1){
      if((PC_IDR&0x2E)!=0x0E){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x0E){
        return keyValue;
       }
      }
     }
     break;
    case 0x26 : keyValue='8';
     while(1){
      if((PC_IDR&0x2E)!=0x26){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x26){
        return keyValue;
       }
      }
     }
     break;
    case 0x2A : keyValue='9';
     while(1){
      if((PC_IDR&0x2E)!=0x2A){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x2A){
        return keyValue;
       }
      }
     }
     break;
    case 0x2C : keyValue='C';
     while(1){
      if((PC_IDR&0x2E)!=0x2C){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x2C){
        return keyValue;
       }
      }
     }
     break;
   }
  }
}
//拉高第三引脚
PG_ODR|=(1<<0);//PG0
Delay_Us(5);
//拉低第四引脚
PG_ODR&=~(1<<1);//PG1
Delay_Us(5);
if((PC_IDR&0x2E)!=0x2E){
  Delay_Ms(20);//延时8MS
  keyValueTmp=PC_IDR&0x2E;
  if(keyValueTmp!=0x2E){
   //有键被按下
   switch(keyValueTmp){
    case 0x0E : keyValue='*';
    //while((PC_IDR&0x3F)==0x0E);
     while(1){
      if((PC_IDR&0x2E)!=0x0E){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x0E){
        return keyValue;
       }
      }
     }
     break;
    case 0x26 : keyValue='0';
     while(1){
      if((PC_IDR&0x2E)!=0x26){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x26){
        return keyValue;
       }
      }
     }
     break;
    case 0x2A : keyValue='#';
     while(1){
      if((PC_IDR&0x2E)!=0x2A){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x2A){
        return keyValue;
       }
      }
     }
     break;
    case 0x2C : keyValue='D';
     while(1){
      if((PC_IDR&0x2E)!=0x2C){
       Delay_Ms(20);
       if((PC_IDR&0x2E)!=0x2C){
        return keyValue;
       }
      }
     }
     break;
   }
  }
}
  //拉高第四引脚
PG_ODR|=(1<<1);//PG1
return keyValue;

}

使用特权

评论回复
板凳
swcore|  楼主 | 2011-1-26 21:33 | 只看该作者
本帖最后由 swcore 于 2011-1-26 21:35 编辑

这是  电路图

电路.jpg (53.34 KB )

电路.jpg

电路.jpg (55.52 KB )

电路.jpg

使用特权

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

本版积分规则

0

主题

4

帖子

1

粉丝