打印

STM32F103系列I/O口矩阵键盘扫描。

[复制链接]
4822|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2012-3-12 13:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
系统7个引脚做矩阵键盘扫描,可以做12个键盘;输入引脚为上拉输入,输出引脚为推挽输出;当改变输出引脚的状态后不加延时的时候,居然有时候按一个按键会扫描出其他按键来,加了适当延时后就没有出现过;这个是否解释为输出速度跟不上MCU程序执行速度?
沙发
yzzly|  楼主 | 2012-3-12 13:40 | 只看该作者
即使把输出速度由10M改为50M也没有用,基本可以验证我的结论。

使用特权

评论回复
板凳
香水城| | 2012-3-12 14:00 | 只看该作者
1)上电路图
2)上扫描流程图

使用特权

评论回复
地板
yzzly|  楼主 | 2012-3-12 14:50 | 只看该作者
本帖最后由 yzzly 于 2012-3-12 14:57 编辑

void KeyScan(void)
{
        Uint16 KeySta;
        GPIOE->ODR = GPIOE->ODR & 0xFFF8 | 0x0078;          //整体扫描,使KeyC0~C2为0,KeyR0~KeyR3为1
        DelayUs(5);
        KeySta = GPIOE->IDR & 0x78;
        if((KeySta != 0x78)&&(KeySta != LastKey))          //整体扫描发现有键按下则置扫描次数
        {
          if(ScanCnt++>4)                //扫描次数到则置位扫描标志
          {
                   ScanCnt=0;
                   LastKey=KeySta;
                   Flags.ScanBit=1;
           }
        }
        else
        {
           LastKey=KeySta;
        }
        if(Flags.ScanBit)                //位扫描
        {
            Flags.ScanBit=0;
            if(KeyValue==0)
            {
                 KEYC2=1;KEYC1=1;KEYC0=0;
                 DelayUs(5);
                 KeySta = GPIOE->IDR & 0x7F;
                 if((KeySta & 0x7F) != 0x7E)
                 {
                       Flags.KeyFlag=1;
                       KeyValue=KeySta & 0x7F;
                 }
            }
           if(KeyValue==0)
           {
                 KEYC2=1;KEYC1=0;KEYC0=1;
                 DelayUs(5);
                 KeySta = GPIOE->IDR & 0x7F;
                 if((KeySta & 0x7F) != 0x7D)
                {
                      Flags.KeyFlag=1;
                      KeyValue=KeySta & 0x7F;
                 }
             }
            if(KeyValue==0)
           {
                 KEYC2=0;KEYC1=1;KEYC0=1;
                 DelayUs(5);
                 KeySta = GPIOE->IDR & 0x7F;
                 if((KeySta & 0x7F) != 0x7B)
                {
                       Flags.KeyFlag=1;
                       KeyValue=KeySta & 0x7F;
                }
           }
          Flags.KeyScan=0;
}
扫描思路是:先整体扫描,如果发现有变化且时间够长,则进行位扫描,确定是哪一个按键按下。

CPU.PNG (31.24 KB )

CPU.PNG

KEY.PNG (15.92 KB )

KEY.PNG

使用特权

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

本版积分规则

427

主题

1178

帖子

3

粉丝