OpenEdv-开源电子网

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

寄存器输入,键盘扫描,不知道哪里错了

[复制链接]

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
发表于 2015-5-28 20:44:48 | 显示全部楼层 |阅读模式
5金钱
#include "key.h"
#include "delay.h"

void keyinit()
{
    RCC->APB2ENR|=(1<<2);    //开PA使能
    
    GPIOA->CRH|=0X80800000;  //设置PA13,15为输入,上拉/下拉模式
    GPIOA->ODR&=0X5FFF;                //初始化PA13,15
    GPIOA->ODR|=0XA000;                    //设置PA13,15上拉输入
    
    GPIOA->CRL|=0X00000008;    //设置PA0为输入,上拉/下拉模式
}
void keyscan()
{
            uint8_t num;
    if(!(GPIOA->IDR&(0X8000)))    //PA15   KEY1
    {
        delay_ms(10);
        if(!(GPIOA->IDR&(0X8000)))
            GPIOD->ODR=~GPIOD->ODR;
        while(!(GPIOA->IDR&(0X8000)));
    }
    
    else if(!(GPIOA->IDR&(0X2000)))    //PA13    KEY0    
    {
        delay_ms(10);
        if(!(GPIOA->IDR&(0X2000)))
            GPIOC->ODR=~GPIOC->ODR;
        while(!(GPIOA->IDR&(0X2000)));
    }
    else if(GPIOA->IDR&(0X0001))    //PA0        KEY2
    {
        delay_ms(10);

        if(GPIOA->IDR&(0X0001))
        {
            num++;
            if(num/2==0)
            {
                GPIOA->BRR|=0X0100;
            }
            else
            {
                GPIOA->BSRR|=(0X00000100);
            }
            if(num>=10)
            {
                num=0;
            }
        }
            while(GPIOA->IDR&(0X0001));    
    }
}



#include "led.h"
void LED_Init(void){
    RCC->APB2ENR|=(1<<2);  //A8
    RCC->APB2ENR|=1<<4;  //C12
    RCC->APB2ENR|=1<<5;  //D2
    
    GPIOA->CRH&=0xfffffff0;    //LED中
    GPIOA->CRH|=0x00000003;
  GPIOA->ODR|=(1<<8);
    
    GPIOC->CRH&=0xfff0ffff;            //LED右
    GPIOC->CRH|=0x00030000;
    GPIOC->ODR|=(1<<12);
    
    GPIOD->CRL&=0xfffff0ff;            //LED左
    GPIOD->CRL|=0x00000300;
    GPIOD->ODR|=(1<<2);
}
#include "led.h"
#include "delay.h"
#include "key.h"
int main(void)
{        
    uint8_t kk;
    Stm32_Clock_Init(9);//系统时钟设置    
    delay_init(72);          //延时初始化
    LED_Init();              //初始化与LED连接的硬件接口
    keyinit();      //键盘初始化
    while(1)
    {
        kk=keyscan();
        switch(kk)
        {
            case 1: GPIOC->ODR^=(1<<12);break;
            case 2: GPIOA->ODR^=(1<<8); break;
            case 3: GPIOD->ODR^=(1<<2); break;
        }
    }
}
为什么下拉输入不好使?

最佳答案

查看完整内容[请看2#楼]

读IO电平,是读IDR,楼主这错的乱七八糟的。。。 还是好好看看我们的按键例程再说吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-28 20:44:49 | 显示全部楼层
读IO电平,是读IDR,楼主这错的乱七八糟的。。。
还是好好看看我们的按键例程再说吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2015-5-28 21:51:09 | 显示全部楼层
帮顶。。。。
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
 楼主| 发表于 2015-5-29 16:07:54 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
噢噢,好的,原子哥
回复

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2015-5-26
在线时间
0 小时
 楼主| 发表于 2015-5-30 15:02:37 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,能帮我看看现在这个吗?为什么下拉输入不好使?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-30 22:51:48 | 显示全部楼层
回复【5楼】时代将军:
---------------------------------
我已回复。
另外,不要一个问题发多个帖子
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-7-1
在线时间
4 小时
发表于 2020-7-3 17:27:54 | 显示全部楼层
问题您的例程没有用寄存器进行按键扫描的代码啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 08:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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