OpenEdv-开源电子网

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

4X4矩阵键盘+74HC595+数码管

[复制链接]

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
发表于 2011-4-25 21:41:18 | 显示全部楼层 |阅读模式
小弟已郁闷两天,底层驱动用的原子哥的SYS,USART,DELAY,用寄存器写的4X4矩阵键盘,按0键在数码管上显示0,以此类推。。软件仿真结果都正确,但就是实际出不来。以下附上原理图和主程序及矩阵键盘驱动。
原理图:



主程序:
#include <stm32f10x.h>
#include "sys.h"
#include "usart.h"  
#include "delay.h" 
#include "io.h"
#include "key4_4.h"
/*==================================================================================================*/
//LED控制位,共阳数码管,0亮      
//数码管控制(位选四位,段选8位)共13位(有一位为LED灯控制位),17个状态
uint8_t  seg[17][13]={              
     {1,  0,0,0,0, 1,  1,0,0,0,0,0,0},   //0       
     {1,  0,0,0,0, 1,  1,1,1,1,0,0,1},   //1     
     {1,  0,0,0,0, 1,  0,1,0,0,1,0,0},   //2
     {1,  0,0,0,0, 1,  0,1,1,0,0,0,0},   //3
     {1,  0,0,0,0, 1,  0,0,1,1,0,0,1},   //4
     {1,  0,0,0,0, 1,  0,0,1,0,0,1,0},   //5
     {1,  0,0,0,0, 1,  0,0,0,0,0,1,0},   //6
     {1,  0,0,0,0, 1,  1,1,1,1,0,0,0},   //7
     {1,  0,0,0,0, 1,  0,0,0,0,0,0,0},   //8
     {1,  0,0,0,0, 1,  0,0,1,0,0,0,0},   //9
     {1,  0,0,0,0, 1,  0,0,0,1,0,0,0},    //A
     {1,  0,0,0,0, 1,  0,0,0,0,0,1,1},    //B
     {1,  0,0,0,0, 1,  1,0,0,0,1,1,0},    //B
     {1,  0,0,0,0, 1,  0,1,0,0,0,0,1},    //D
     {1,  0,0,0,0, 1,  0,0,0,0,1,1,0},    //E
     {1,  0,0,0,0, 1,  0,0,0,1,1,1,0},   //F
     {1,  1,1,1,1, 1,  1,1,1,1,1,1,1},    //全灭
     };
/*==================================================================================================*/     
int main(void)

     uint8_t i,key=16;   
     Stm32_Clock_Init(9); //系统时钟设置,外部高速时钟HSE,9倍频
     Delay_Init(72);      //延时初始化,设置在系统时钟下,必须始终初始化一致
     IO_Init();      //初始化IO接口
     while(1)//死循环
     {
           key=KEY_Scan();  //读取键盘信息
           for(i=0;i<13;i++)
           {
                    SER=seg[key];   
                    SHCLK=1;
                    Delay_Us(1); 
                     SHCLK=0;
                     Delay_Us(1);
           }    
           STCLK=1;
           Delay_Us(1);
           STCLK=0;
           Delay_Us(1);  
     } 
}
矩阵键盘驱动源程序:
#include <stm32f10x.h>
#include "key4_4.h"
#include "delay.h"
/*===================================================================================================*/
void KEY_Init1(void)
{
 RCC->APB2ENR|=0x2<<2;      //使能PORTA.B时钟
 GPIOA->CRL&=0x00000FFF;  //清空PA3.4.5.6.7模式
 GPIOA->CRL|=0x83333000;  //设置PA7上拉/下拉输入,PA3.4.5.6推挽输出
 GPIOB->CRL&=0xFFFFF000;  //清空PB0.1.2模式
 GPIOB->CRL|=0x00000888;     //设置PB0.1.2上拉/下拉输入
 GPIOA->ODR|=1<<7;      //PA7上拉
 GPIOB->ODR|=0x7<<0;      //PB0.1.2上拉
// GPIOA->ODR|=0xf<<3;   //PA3.4.5.6置高
}
void KEY_Init2(void)
{
 RCC->APB2ENR|=0x2<<2;      //使能PORTA.B时钟
 GPIOA->CRL&=0x00000FFF;  //清空PA3.4.5.6.7模式
 GPIOA->CRL|=0x38888000;  //设置PA7推挽输出,PA3.4.5.6上拉/下拉输入
 GPIOB->CRL&=0xFFFFF000;  //清空PB0.1.2模式
 GPIOB->CRL|=0x00000333;     //设置PB0.1.2推挽输出上拉/下拉输入
 GPIOA->ODR|=0xf<<3;      //PA3.4.5.6上拉
// GPIOA->ODR|=1<<7;      //PA7置高
// GPIOB->ODR|=0x7<<0;      //PB0.1.2置高  
}
/*==================================================================================================*/
uint8_t KEY_Scan(void)
 {  
  uint8_t key;
  uint8_t temp=0;
  KEY_Init1();
 //行为高电平,列为低电平
 GPIOA->ODR&=~(0xf<<3);  //PA3.4.5.6置低
 Delay_Us(1);
 if(KEY_H1==0) temp=1;
 if(KEY_H2==0) temp=2;
 if(KEY_H3==0) temp=4;
 if(KEY_H4==0) temp=8;
    if(temp==1)   // PA7被拉低
        key=0;
    else
  if(temp==2)   // PB0被拉低
         key=4;
     else
   if(temp==4)   // PB1被拉低
          key=8;
      else
    if(temp==8)   // PB2被拉低
            key=12;
       else
           key=16;
 KEY_Init2();              
    temp=0;   
 //列为高电平,行为低电平
 GPIOA->ODR&=~(1<<7);     //PA7置低
 GPIOB->ODR&=~(0x7<<0);     //PB0.1.2置低
 Delay_Us(1);
 if(KEY_L1==0) temp=1;
 if(KEY_L2==0) temp=2;
 if(KEY_L3==0) temp=4;
 if(KEY_L4==0) temp=8;
 if(temp==1)  // PA6被拉低
  key=key;
 else
  if(temp==2)  // PA5被拉低
         key=key+1;
     else
   if(temp==4)  // PA4被拉低
          key=key+2;
      else
    if(temp==8)  // PA3被拉低
           key=key+3;
       else
           key=16;
 return key; 
 }
矩阵键盘驱动头文件程序:
#ifndef __KEY4_4_H
#define __KEY4_4_H
#include "sys.h"
/*==================================================================================================*/
//矩阵键盘行列接口,HA7,PB0.1.2   LA3.4.5.6
#define KEY_L4 PAin(3)    //PA3
#define KEY_L3 PAin(4)  //PA4
#define KEY_L2 PAin(5)  //PA5
#define KEY_L1 PAin(6)    //PA6
#define KEY_H1 PAin(7)  //PA7
#define KEY_H2 PBin(0)  //PB0
#define KEY_H3 PBin(1)    //PB1
#define KEY_H4 PBin(2)  //PB2
/*==================================================================================================*/
//void KEY_Init1(void);//按键1初始化
//void KEY_Init2(void);//按键2初始化
uint8_t KEY_Scan(void); //按键扫描函数        
#endif
请各位大神看看。。。郁闷啊!!软件仿真明明都对的。。找不出问题
人生苦短,及时行乐!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
 楼主| 发表于 2011-4-25 21:45:41 | 显示全部楼层
自己顶一下。。原子哥哥。。各位大神
人生苦短,及时行乐!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-4-25 22:15:12 | 显示全部楼层
你现在的实际情况是什么?什么情况?
按键无反应?
还是数码管无显示?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
 楼主| 发表于 2011-4-25 22:18:00 | 显示全部楼层
回复【3楼】正点原子:
-------------------------------
数码管无显示,按键有没有无反应不知啊。我用库函数写的是可以的。
人生苦短,及时行乐!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-4-25 23:22:06 | 显示全部楼层
用库函数是可以的,那就好办了.肯定是你寄存器操作的时候,某些地方没设置正确.
1,看时钟.
2,看IO口位的设置.

还有,最好用软仿真看看,到底设置如何.最好和库的对比,这样很容易找出原因的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
 楼主| 发表于 2011-4-25 23:33:56 | 显示全部楼层
回复【5楼】正点原子:
-------------------------------
不应该啊,现在发现11键和16键有反应~能显示。。其他不行。。我仔细再对对
人生苦短,及时行乐!!
回复 支持 反对

使用道具 举报

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
 楼主| 发表于 2011-4-26 09:24:05 | 显示全部楼层
回复【5楼】正点原子:
-------------------------------
终于改正了一点。。“RCC->APB2ENR|=0x3<<2; //使能PORTA.B时钟”开始只使能了PB,天哪。。太粗心了!改正了后,问题是前两行依次显示89ab,后两行显示cdef,本来应该是0123,4567,89ab,cdef,只有最后一行是对的...。。寻找问题中!
人生苦短,及时行乐!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-4-26 09:29:21 | 显示全部楼层
回复【7楼】RR子海:
-------------------------------
还是先细分.
现在显示 没问题了,只是顺序的问题.这个你就慢慢改,一个个对,把其他的干扰因素都去掉(屏蔽),先测试这里通过了再说.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
 楼主| 发表于 2011-4-26 09:32:05 | 显示全部楼层
回复【8楼】正点原子:
-------------------------------
搜噶。。懂了。。谢谢原子哥~
人生苦短,及时行乐!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-4-26 09:34:43 | 显示全部楼层
回复【9楼】RR子海:
-------------------------------
解决问题,要学学毛爷爷. 化整为零,各个击破.
不能显示?那就让他显示.显示不正确?那就让他正确.
按键不灵?那就让他灵.....

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
 楼主| 发表于 2011-4-26 10:36:59 | 显示全部楼层
回复【8楼】正点原子:
-------------------------------
原子哥。搞定啦~输出拉低后的Delay_Us(1),不知什么时候被注释掉了~重新写入就好了~~一个使能一个延时。。要命啊!
人生苦短,及时行乐!!
回复 支持 反对

使用道具 举报

7

主题

53

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-4-20
在线时间
0 小时
 楼主| 发表于 2011-4-26 10:38:41 | 显示全部楼层
回复【10楼】正点原子:
-------------------------------
各个击破啊。。学习毛爷爷、、哈哈。。感谢原子哥的指引啊~
人生苦短,及时行乐!!
回复 支持 反对

使用道具 举报

10

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2012-4-23
在线时间
0 小时
发表于 2012-4-23 16:04:38 | 显示全部楼层
楼主您好!最近在学习用STM32与74HC595编写数码管显示的程序,能否帮您的程序发给我参考一下。纠结了好久!谢谢哈!332473775@qq.com
生活就像心电图,若是一帆风顺的话,那么证明你已经挂了!!
回复 支持 反对

使用道具 举报

13

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-3-21
在线时间
5 小时
发表于 2012-4-23 17:26:27 | 显示全部楼层
楼主好啊~~~能不能把你的程序也给俺发一份啊,小弟也想学习一下,非常感谢哦~~~
我的邮箱 2451 866 53@qq.com
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2012-5-30
在线时间
4 小时
发表于 2012-5-30 23:00:08 | 显示全部楼层
楼主,小弟正在用这个STM32+595实现控制,可以发个程序给我参考下吗?  275073884@qq.com
回复 支持 反对

使用道具 举报

11

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2012-4-10
在线时间
0 小时
发表于 2012-6-2 07:43:50 | 显示全部楼层
楼主。同求你的程序 315626796@qq.com  谢谢了
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2012-8-9
在线时间
4 小时
发表于 2012-8-9 11:06:33 | 显示全部楼层
楼主,我也想看看,用库函数写的。虽然作为伸手党有点可恶,但是真心不会,谢谢楼主。lkg198601@126.com谢谢楼主
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2012-9-5
在线时间
0 小时
发表于 2012-9-6 08:38:35 | 显示全部楼层
楼主,最近正在学习这方面的,能否共享一下,xiaohuren2@yeah.net
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-9-21
在线时间
0 小时
发表于 2012-9-21 09:03:35 | 显示全部楼层
楼主,我很希望可以参考你的程序,可否共享下,valkyriezhou@163.com
回复 支持 反对

使用道具 举报

38

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2013-8-19
在线时间
0 小时
发表于 2013-8-21 22:45:11 | 显示全部楼层
回复【7楼】RR子海:

回复【5楼】正点原子:
-------------------------------
终于改正了一点。。“RCC->APB2ENR|=0x3<<2; //使能PORTA.B时钟”开始只使能了PB,天哪。。太粗心了!改正了后,问题是前两行依次显示89ab,后两行显示cdef,本来应该是0123,4567,89ab,cdef,只有最后一行是对的...。。寻找问题中!

---------------------------------
你好,我正在做你这个案例,套用你的程序,我该做点亮LED灯,不过按键似乎没有响应。方便的话,可以把你的程序发给我看看么。谢谢
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-10-8
在线时间
0 小时
发表于 2013-11-1 09:58:02 | 显示全部楼层
回复【13楼】qiwei31229:
---------------------------------
哥们你好  我现在和你一样用到了STM32与74HC595编写数码管显示的程序,能否把您的程序发给我参考一下。十分感谢!2416384971@qq.com
回复 支持 反对

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
发表于 2014-4-1 09:44:50 | 显示全部楼层
我想说,,这个代码可以发回复【21楼】love1evol:
---------------------------------


哥们,,你的那个关于74HC595的程序可以发我借鉴一下吗??就那么简单的程序,,就是调不通,,输出都不行。。。方便的话发我邮箱,,谢谢了     1786094591@qq.com
避免犯错本是错误所在,我错故我在……
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-4-1
在线时间
0 小时
发表于 2014-4-9 09:48:28 | 显示全部楼层
楼主你好,你的程序源码能让我观摩一下么,谢谢了,我邮箱地址是364006124@qq.com
回复 支持 反对

使用道具 举报

13

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
2014-2-22
在线时间
2 小时
发表于 2014-4-14 16:04:10 | 显示全部楼层
楼主你好,急求你的程序啊,能发我一份么,谢谢了,我邮箱是646583626@qq.com
绝望的下一秒就是机遇和希望!
回复 支持 反对

使用道具 举报

4

主题

9

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-4-9
在线时间
0 小时
发表于 2014-4-14 19:17:12 | 显示全部楼层
回复【4楼】RR子海:
---------------------------------
这位大哥,能不能把你用库函数写的矩阵键盘程序发我一份啊,我用库函数写的老师不对,求参考参考!1484629578@qq.com
回复 支持 反对

使用道具 举报

6

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2013-9-15
在线时间
0 小时
发表于 2014-5-25 00:42:57 | 显示全部楼层
楼主,这么多人想学习,可否开源你的代码让大家学习下,我准备做一个4*4的键盘楼主可否共享下寄存器版本的源码学习下
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-9-30
在线时间
0 小时
发表于 2014-11-20 11:36:05 | 显示全部楼层
同求源码,希望楼主帮忙
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2014-9-30
在线时间
0 小时
发表于 2014-11-20 11:36:42 | 显示全部楼层
回复【27楼】兰陵男男生:
---------------------------------
我的邮箱是1564932044@qq.com
回复 支持 反对

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2015-8-18
在线时间
10 小时
发表于 2016-2-24 12:57:45 | 显示全部楼层
LZ   能不能给我发一份库函数版本的  946120508@qq.com
回复 支持 反对

使用道具 举报

172

主题

539

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3449
金钱
3449
注册时间
2015-10-5
在线时间
492 小时
发表于 2016-4-13 15:00:25 | 显示全部楼层
RR子海 发表于 2011-4-26 09:24
回复【5楼】正点原子:
-------------------------------
终于改正了一点。。“RCC-&gt;APB2ENR|=0x3&lt;&lt;2; ...

能把源程序发我吗?我想研究一下,谢谢了
认真做好笔记....
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2016-3-24
在线时间
28 小时
发表于 2016-5-12 15:10:16 | 显示全部楼层
楼主你好!我按照你的程序自己写了一个,发觉矩阵键盘这里好像没有反应。我想问你一个问题:你的   IO_Init();      //初始化IO接口  这一部分是怎么配置的?是全部配置为上拉输入,还是说4个为上拉推挽输出,四个为输入的。其他方面的没问题我觉得我的程序应该就是这一块没有配置正确。希望知道的大神们能否给指点一下啊。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2016-9-19
在线时间
9 小时
发表于 2016-9-22 08:03:06 | 显示全部楼层
楼主,我也想看看,用库函数写的。虽然作为伸手党有点可恶,但是真心不会,谢谢楼主。windloose@126.com,谢谢楼主!非常感谢!!
回复 支持 反对

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2020-8-4
在线时间
15 小时
发表于 2020-8-17 12:00:06 | 显示全部楼层
我估计楼主已经忘记这个账号的密码了,你们一个个都要程序
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-11 08:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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