打印
[应用相关]

stm32 4x4 薄膜按键为什么第一列识别不了啊

[复制链接]
759|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stormwind123|  楼主 | 2021-11-18 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <STM32f10x.h>
#include <delay.h>
#include <stdio.h>
uint8_t key,k=-1;
void usart_configuration(void)
{
    USART_InitTypeDef usart1_init;
    GPIO_InitTypeDef io;
    RCC_APB2PeriphclockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
    USART_DeInit(USART1);
    //USART1_RX      PA.9
    io.GPIO_Pin = GPIO_Pin_9; //PA.9
  io.GPIO_Speed = GPIO_Speed_50MHz;
  io.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  GPIO_Init(GPIOA, &io); //初始化PA9
  //USART1_RX      PA.10
  io.GPIO_Pin = GPIO_Pin_10;//PA.10
  io.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA, &io);  //初始化PA10
    usart1_init.USART_BaudRate=9600;
    usart1_init.USART_WordLength=USART_WordLength_8b;
    usart1_init.USART_StopBits=USART_StopBits_1;
    usart1_init.USART_Parity=USART_Parity_No;
    usart1_init.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    usart1_init.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    USART_Init(USART1,&usart1_init);
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
    USART_Cmd(USART1,ENABLE);
    USART_CleaRFlag(USART1,USART_FLAG_TC);
}
void NVIC_configuration(void)
{
    NVIC_InitTypeDef nvic_init;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    nvic_init.NVIC_IRQChannel=USART1_IRQn;
    nvic_init.NVIC_IRQChannelPreemptionPriority = 0;
    nvic_init.NVIC_IRQChannelSubPriority = 1;
    nvic_init.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvic_init);
}
void key_Init1(void)
{
    GPIO_InitTypeDef io;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOC的时钟
    io.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
    io.GPIO_Speed=GPIO_Speed_50MHz;
    io.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;
    GPIO_Init(GPIOB,&io);
    io.GPIO_Mode=GPIO_Mode_IPD;
    io.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_15;
    GPIO_Init(GPIOB,&io);
    GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3);
}
void key_Init2(void)
{
    GPIO_InitTypeDef io;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOC的时钟
    io.GPIO_Mode=GPIO_Mode_Out_PP;//通用推挽输出
    io.GPIO_Speed=GPIO_Speed_50MHz;
    io.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_15;
    GPIO_Init(GPIOB,&io);
    io.GPIO_Mode=GPIO_Mode_IPD;
    io.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;
    GPIO_Init(GPIOB,&io);
    GPIO_SetBits(GPIOB,GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_15);
}
uint8_t key_Scan(void)
{
    uint8_t i;
    key_Init1();
    for(i=0;i<4;i++)
    switch(i)
    {
        case 0:if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)==1)
        {
                        key_Init2();
                  if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==1)return '*';
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1)return 'D';
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)return '#';
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==1)return 0;
        }
        break;
        case 1:if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_8)==1)
        {
                        key_Init2();
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1)return 'C';
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)return 9;
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==1)return 8;
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==1)return 7;
        }
        break;
        case 2:if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9)==1)
        {
                        key_Init2();
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1)return 'B';
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)return 6;
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==1)return 5;
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==1)return 4;
        }
        break;
        case 3:if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==1)
        {
                        key_Init2();
                        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6)==1)return 'A';
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==1)return 3;
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==1)return 2;
                        else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==1)return 1;
        }
        break;
    }
  return k;
    //return 0;//用于松手检测
}
int main()
{
    delay_init();
    NVIC_configuration();
    usart_configuration();
    while(1)
    {
        key=key_Scan();
        if(key!=k){
            if(key=='A')
            {
                printf("A");
            }
            
            if(key=='B')
            {
                printf("B");
            }
            if(key=='C')
            {
                printf("C");
            }
            if(key=='D')
            {
                printf("D");
            }
            if(key=='*')
            {
                printf("*");
            }
            if(key=='#')
            {
                printf("#");
            }
                if(key!='A'||key!='B'||key!='C'||key!='D'||key!='*'||key!='#'){
                    printf("%d\n",key);
            
            }
        delay_ms(300);
    key=k;
        }
    }
}



使用特权

评论回复
沙发
koala889| | 2021-11-18 13:26 | 只看该作者
没有电路图么

使用特权

评论回复
板凳
drer| | 2021-12-10 21:07 | 只看该作者
用万用表量量  信号拉低或者拉高了没有

使用特权

评论回复
地板
gwsan| | 2021-12-10 21:07 | 只看该作者
是不是接触不好

使用特权

评论回复
5
kxsi| | 2021-12-10 21:10 | 只看该作者
如果有第二个膜的话换上试试看

使用特权

评论回复
6
nawu| | 2021-12-10 21:11 | 只看该作者
一直都是这一列吗

使用特权

评论回复
7
qcliu| | 2021-12-10 21:16 | 只看该作者
换一个引脚试试看

使用特权

评论回复
8
match007| | 2021-12-11 10:54 | 只看该作者
量一下引脚电平

使用特权

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

本版积分规则

297

主题

1206

帖子

1

粉丝