打印

弄了好久的矩阵键盘,晒出来给大家学习学习,我已经好累了。

[复制链接]
376|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
电子学长|  楼主 | 2020-4-23 19:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
借鉴水友,并仿照,写的两种,保证已经实现。第一种其实也是4*4   只是将另外一行删除了  做成了4行3列
#include "KEY.h"
#include        "delay.h"
void KEY_Init(void)
{
         GPIO_InitTypeDef  GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      
        GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//áD
  GPIO_Init(GPIOB,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;      
        GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;//DD

  GPIO_Init(GPIOB,&GPIO_InitStructure);               
}
int KEY_Scan(void)
{
        u8 KeyVal=16;         
        GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x000f));
        
        if((GPIOB->IDR & 0xf000)==0x0000)  
                return -1;
        else
        {        
            delay_ms(5);   
            if((GPIOB->IDR & 0xf000)==0x0000)
            return -1;
        }

        GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0001));        

                switch(GPIOB->IDR & 0xf000)
                        {
                                case 0x1000: KeyVal=15; break;
                                case 0x2000: KeyVal=11;        break;
                                case 0x4000: KeyVal=7;        break;
                                case 0x8000: KeyVal=3;        break;
                        }
        while((GPIOB->IDR & 0xf000)!=0x0000);                 

        GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0002));        
                switch(GPIOB->IDR & 0xf000)                     
                {
                        case 0x1000: KeyVal=14;        break;
                        case 0x2000: KeyVal=10;        break;
                        case 0x4000: KeyVal=6;        break;
                        case 0x8000: KeyVal=2;        break;
                }
        while((GPIOB->IDR & 0xf000)!=0x0000);                 

        GPIO_Write(GPIOB,((GPIOB->ODR & 0xfff0) | 0x0004));        
                switch(GPIOB->IDR & 0xf000)                       
                {
                        case 0x1000: KeyVal=13;        break;
                        case 0x2000: KeyVal=9;        break;
                        case 0x4000: KeyVal=5;        break;
                        case 0x8000: KeyVal=1;        break;
                }
        while((GPIOB->IDR & 0xf000)!=0x0000);                 
               
        return KeyVal;               
}

使用特权

评论回复

相关帖子

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

本版积分规则

424

主题

447

帖子

1

粉丝