OpenEdv-开源电子网

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

基于stm32使用74hc164驱动三位数码管

[复制链接]

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
发表于 2023-3-26 21:39:15 | 显示全部楼层 |阅读模式
1金钱
/**********************
请教大佬,帮我指正一下代码的错误

**********************/
#include "Display.h"
#include "stm32f10x.h"
#include "key.h"
#include "LED.h"
#include "sys.h"
#include "delay.h"


//显示函数初始化
void Display_init(void)
{
       
        GPIO_InitTypeDef GPIO_Struct;
       
        KEYinit();                                                //按键GPIO端口初始化
        LED_init();
       
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOG,ENABLE);
       
       
        GPIO_Struct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Struct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
        GPIO_Struct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOG,&GPIO_Struct);
       
       
       
}

//74hc164发送数据函数
void send_data(uint8_t data,uint8_t m)
{
        uint8_t i;
  for(i = 0; i < 8;i ++)
        {
                if(data & 0x80)
                        GPIO_WriteBit(GPIOG,GPIO_Pin_3,1);
                else
                        GPIO_WriteBit(GPIOG,GPIO_Pin_3,0);
          data <<= 1;
//          GPIO_ResetBits(GPIOG,GPIO_Pin_4);
                GPIO_WriteBit(GPIOG,GPIO_Pin_4,0);
//          GPIO_SetBits(GPIOG,GPIO_Pin_4);
                GPIO_WriteBit(GPIOG,GPIO_Pin_4,1);
               
        }
       
        if(m)
                switch(m)
                {
                        case 1:
                                GPIO_WriteBit(GPIOD,GPIO_Pin_8,0);
                        break;
                        case 2:
                                GPIO_WriteBit(GPIOB,GPIO_Pin_15,0);
                        break;
                        case 3:
                                GPIO_WriteBit(GPIOB,GPIO_Pin_14,0);
                        break;
               
                }
}

uint8_t num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

//显示的数据
void display_data(unsigned int x,unsigned int y)  //x为输入数据号
{
        static unsigned int hundred_bit, ten_bit, single_bit;
        hundred_bit = x /100;
        ten_bit = (x % 100) / 10;
        single_bit = x % 10;
        if(y == 1)
                send_data(num[hundred_bit],1);
        else if(y == 2)
                send_data(num[ten_bit],2);
        else if(y == 3)
                send_data(num[single_bit],3);
       
}
/****************************
下面是主函数的代码
****************************/
                display_data(321,1);
                printf("OK\r\n");
                display_data(321,2);
                display_data(321,3);


最佳答案

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

首先,确定你的IO是按你的想法来动作,比如,你就只写一句:GPIO_WriteBit(GPIOG,GPIO_Pin_3,1); 然后用万用表测量这个脚的电压对不对. 用到的所有脚都测一下: PG3\PG4\PD8\PB15\PB14;写1写0都测一下; 对了,我只看到你对PD8\PB15\PB14写0,那它们是否需要在某个时候写1呢?也没看到初始化代码. 当引脚都按想法来动作后,检查74HC164的输出是否正常,给它写入一个数据,万用表测一下它的输出是否正确.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-3-26 21:39:16 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-3-27 10:51 编辑
openresistance 发表于 2023-3-27 10:35
我的显示程序没用,我还尝试了直接给段码和位码赋值,但是也是一样,数码管不亮。

首先,确定你的IO是按你的想法来动作,比如,你就只写一句:GPIO_WriteBit(GPIOG,GPIO_Pin_3,1);
然后用万用表测量这个脚的电压对不对.

用到的所有脚都测一下: PG3\PG4\PD8\PB15\PB14;写1写0都测一下;
对了,我只看到你对PD8\PB15\PB14写0,那它们是否需要在某个时候写1呢?也没看到初始化代码.
当引脚都按想法来动作后,检查74HC164的输出是否正常,给它写入一个数据,万用表测一下它的输出是否正确.
专治疑难杂症
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-3-27 10:15:15 | 显示全部楼层
不如直接说你遇到了什么问题?
专治疑难杂症
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-3-27 10:35:54 | 显示全部楼层
本帖最后由 openresistance 于 2023-3-27 10:44 编辑
LcwSwust 发表于 2023-3-27 10:15
不如直接说你遇到了什么问题?

我的显示程序没用,我还尝试了直接给段码和位码赋值,但是也是一样,数码管不亮。
微信图片_20230327103506.png
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-3-27 12:31:45 | 显示全部楼层
LcwSwust 发表于 2023-3-27 10:49
首先,确定你的IO是按你的想法来动作,比如,你就只写一句:GPIO_WriteBit(GPIOG,GPIO_Pin_3,1);
然后用万用 ...

好的,大佬。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-3-27 13:40:21 | 显示全部楼层
LcwSwust 发表于 2023-3-27 10:49
首先,确定你的IO是按你的想法来动作,比如,你就只写一句:GPIO_WriteBit(GPIOG,GPIO_Pin_3,1);
然后用万用 ...

PD8\PB15\PB14,因为之前点灯和按键有用到GPIOD和GPIOB,所以我直接在那边定义了。之前我就是把所有用到的GPIO都定义在显示函数程序里的,但是好像是因为定义了两次,整个端口都用不了了。
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-3-27 13:58:28 | 显示全部楼层
openresistance 发表于 2023-3-27 13:40
PD8\PB15\PB14,因为之前点灯和按键有用到GPIOD和GPIOB,所以我直接在那边定义了。之前我就是把所有用到的 ...

定义了两次就用不了了?不会的.
仔细检查代码.
专治疑难杂症
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-3-27 14:09:07 | 显示全部楼层
LcwSwust 发表于 2023-3-27 13:58
定义了两次就用不了了?不会的.
仔细检查代码.

是开启了两次时钟。比如说,我可以在led'的程序里面开启GPIOB时钟并初始化PB4/5,然后在display程序里面初始化PB14/15吗?
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-3-27 14:15:05 | 显示全部楼层
openresistance 发表于 2023-3-27 14:09
是开启了两次时钟。比如说,我可以在led'的程序里面开启GPIOB时钟并初始化PB4/5,然后在display程序里面 ...

可以,但不建议这么做,因为display较频繁,
建议对外设的初始化只执行一次.
专治疑难杂症
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-3-27 14:29:00 | 显示全部楼层
LcwSwust 发表于 2023-3-27 14:15
可以,但不建议这么做,因为display较频繁,
建议对外设的初始化只执行一次.

ok,知道了。谢谢大佬。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2023-3-26
在线时间
16 小时
 楼主| 发表于 2023-3-28 10:56:52 | 显示全部楼层
LcwSwust 发表于 2023-3-27 14:15
可以,但不建议这么做,因为display较频繁,
建议对外设的初始化只执行一次.

谢谢大佬,搞定了,GPIO执行没问题,照大佬说的我测了一下74hc164的输出,用在数码管的那块坏了,换了个新的164,改了一下代码可以正常显示了。
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-3-28 11:00:33 | 显示全部楼层
openresistance 发表于 2023-3-28 10:56
谢谢大佬,搞定了,GPIO执行没问题,照大佬说的我测了一下74hc164的输出,用在数码管的那块坏了,换了个 ...

        
专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 12:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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