OpenEdv-开源电子网

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

矩阵键盘问题求助

[复制链接]

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
发表于 2015-12-6 11:12:46 | 显示全部楼层 |阅读模式
5金钱
#include "key.h"
#include "delay.h" 
   
//按键初始化函数
void KEY_Init(void)
{
RCC->APB2ENR|=1<<7;     //使能PORTF时钟
    GPIOF->CRL&=0X0000FFFF; //F4-F7输入
GPIOF->CRL|=0X88880000; //默认下拉
// GPIOF->IDR&=0X0000; //  F4-7下拉输入

GPIOF->CRL&=0XFFFF0000;
GPIOF->CRL|=0X00003333; //F0-F3推挽输出


//按键处理函数
//返回按键值
u8 KEY_Scan(void)
{  
   u8  keyval;
   u32 temp;
   GPIOF->ODR&=0XFFF0;
   GPIOF->ODR|=0X000F;
   /*一次性去抖动*/
   if((GPIOF->IDR&0X00F0)==0X0000) //没有按键按下返回-1
      return '\0';
   else
   {
     delay_ms(5);
 if((GPIOF->IDR&0X00F0)==0X0000)//去抖后还是没有按键按下,说明刚刚else电位变化是抖动产生的。
    return '\0';
   }
   /*第四列输出*/
   GPIOF->ODR&=0XFFF0;
   GPIOF->ODR|=0X0001; //PF3--PF0输出0001
   switch(GPIOF->IDR&0X00F0)
   {
     case 0X0080:keyval='A';break;
 case 0X0040:keyval='B';break;
 case 0X0020:keyval='C';break;
 case 0X0010:keyval='D';break;
   }
   do
   {
     temp=GPIOF->IDR;
 temp=temp|0XFF0F;
   }while(temp!=0XFF0F);

   /*第三列输出*/
   GPIOF->ODR&=0XFFF0;
   GPIOF->ODR|=0X0002; //PF3--PF0输出0010
   switch(GPIOF->IDR&0X00F0)
   {
     case 0X0080:keyval='3';break;
 case 0X0040:keyval='6';break;
 case 0X0020:keyval='9';break;
 case 0X0010:keyval='#';break;
   }
   do
   {
     temp=GPIOF->IDR;
 temp=temp|0XFF0F;
   }while(temp!=0XFF0F);

   /*第二列输出*/
   GPIOF->ODR&=0XFFF0;
   GPIOF->ODR|=0X0004; //pc3--pc0输出0100
   switch(GPIOF->IDR&0X00F0)
   {
     case 0X0080:keyval='2';break;
 case 0X0040:keyval='5';break;
 case 0X0020:keyval='8';break;
 case 0X0010:keyval='0';break;
   }
   do
   {
    temp=GPIOF->IDR;
temp=temp|0XFF0F;
   }while(temp!=0XFF0F);

   /*第一列输出*/
   GPIOF->ODR&=0XFFF0;
   GPIOF->ODR|=0X0008; //pc3--pc0输出1000
   switch(GPIOF->IDR&0X00F0)
   {
     case 0X0080:keyval='1';break;
 case 0X0040:keyval='4';break;
 case 0X0020:keyval='7';break;
 case 0X0010:keyval='*';break;
   }
   do
   {
    temp=GPIOF->IDR;
temp=temp|0XFF0F;
   }while(temp!=0XFF0F);
   return keyval;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
 楼主| 发表于 2015-12-6 11:17:34 | 显示全部楼层
为什么输入没有反应呢?
回复

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
 楼主| 发表于 2015-12-6 11:24:08 | 显示全部楼层
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h" 
#include "beep.h"    
#include "key.h"    
#include "exti.h"    
#include "wdg.h"   
#include "timer.h"    
#include "tpad.h"
#include "oled.h"    
#include "lcd.h"
#include "string.h"
#include "malloc.h"    
//ALIENTEK战舰STM32开发板实验13
//TFTLCD显示实验  
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司 
int main(void)
{
    u8 n=0;
    u8 x;
    u8 tt[20]={'\0'};//二维码里面的数据
delay_init(72);       //延时函数初始化   
// NVIC_Configuration();   //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(72,9600);   //串口初始化为9600
LCD_Init();
KEY_Init();
while(1)
{

     x=KEY_Scan();  //得到键值  
switch(x)
{
case '0':
   tt[n]='0';
 n++;
       break;
case '1':
   tt[n]='1';
 n++;
       break;
case '2':
   tt[n]='2';
 n++;
       break;
case '3':
   tt[n]='3';
 n++;
       break;
case '4':
  tt[n]='4';
n++;
       break;
case '5':
  tt[n]='5';
n++;
       break;
case '6':
  tt[n]='6';
n++;
       break;
case '7':
  tt[n]='7';
n++;
       break;
case '8':
  tt[n]='8';
n++;
       break;
case '9':
  tt[n]='9';
n++;
       break;
    case 'A':
  tt[n]='A';
n++;
       break;
case 'B':
  tt[n]='B';
n++;
       break;
case 'C':
  tt[n]='C';
n++;
       break;
   case 'D':
 tt[n]='D';
     n++;
       break;
case '#':
 tt[n]='#';
 n++;
       break;
case '*':
     strlen((const char*)tt);
 mymemset(tt, 0x00, sizeof (char) * 20);
 n=0;
 LCD_Clear(WHITE);
     break;
}
    LCD_ShowString(10,10,100,16,16,tt);
  }
}
这是主函数
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-12-6 11:53:36 | 显示全部楼层
看到你注释的   // GPIOF->IDR&=0X0000; //  F4-7下拉输入   这段没耐心向下看了,先把LED、KEY实验学习好再说
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
 楼主| 发表于 2015-12-6 14:16:32 | 显示全部楼层
这段是我注释了的
回复

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
 楼主| 发表于 2015-12-6 21:56:14 | 显示全部楼层
为什么用库函数写的可以,用寄存器写的,却一点反应都没有呢?
回复

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
 楼主| 发表于 2015-12-7 16:49:58 | 显示全部楼层
求助啊,怎么没人来看呢?
回复

使用道具 举报

1

主题

374

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2014-7-23
在线时间
422 小时
发表于 2015-12-7 17:41:02 | 显示全部楼层
看看配置有木有问题,库函数都可以,寄存器不行问题很明确了,4x4键盘扫描还有很大改进空间。。。。。
回复

使用道具 举报

16

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-9-16
在线时间
2 小时
 楼主| 发表于 2015-12-7 20:27:24 | 显示全部楼层
配置貌似也没有问题啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 01:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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