OpenEdv-开源电子网

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

stm32f103rct6利用max7219驱动数码管显示

[复制链接]

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-12-10
在线时间
0 小时
发表于 2015-1-3 08:41:25 | 显示全部楼层 |阅读模式
5金钱
stm32的PA4连接Max7219的LOAD,PA5连接MAX7219的CLK,PA7连接MAX7219的DIN,
自己移植的程序是参照CSDN上面下载的例程,有文件有缺失,结果数码管并没有点亮。
下载的那个文件是ALIENTEK MINISTM开发例程,主控芯片是STM32F101C8T6 ,不知道大家有没有完整的例程,
原理图,求大侠救一救我

最佳答案

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

回复【2楼】正点原子: --------------------------------- 嗯啊 谢谢你  已经写出来了 我使用软件模拟SPI的方式,主要是数据保持延时时间长短有问题。现在已经可以正常显示了。另外还有一个关于继电器驱动的问题 我马上就要发帖子了 还望您多指点一下。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-12-10
在线时间
0 小时
 楼主| 发表于 2015-1-3 08:41:26 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
嗯啊 谢谢你  已经写出来了 我使用软件模拟SPI的方式,主要是数据保持延时时间长短有问题。现在已经可以正常显示了。另外还有一个关于继电器驱动的问题 我马上就要发帖子了 还望您多指点一下。
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-12-10
在线时间
0 小时
 楼主| 发表于 2015-1-3 08:41:26 | 显示全部楼层
回复【5楼】xiaodu2014:
---------------------------------
//控制命令和数据同时发送到max7219芯片
void Write_Max7219(uint8_t address,uint8_t data)
{
uint8_t i;
LOAD=0;//拉低片选线,选中器件
Delayxms(3);
//一共有十六位,先发送地址,再发送数据,其实可以直接发送16位,但是感觉那样不是很友好
for(i=0;i<8;i++)
{
Delayxms(3);
CLK=0; //拉低时钟信号线
DIN=((address>>7)&0x01);//每次取字节的最高位,屏蔽掉了低7位
Delayxms(5);//考虑到光耦的转换速率
address<<=1;//次高位移到最高位
CLK=1; // 时钟上升沿,发送地址
}
//发送数据
for(i=0;i<8;i++)
{
Delayxms(3);
CLK=0;
DIN=((data>>7)&0x01);
Delayxms(5);//考虑到光耦的转换速率
data<<=1;
CLK=1;
}
Delayxms(3);
LOAD=1; //地址和数据的16位都发送完毕,拉高片选信号,将16位数据锁存到MAX7219的寄存器中
Delayxms(3);




就是这个函数里面的延时时间的选取,要参照芯片的技术手册来。我用的是延时3ms,数码管是可以亮的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-1-4 01:02:48 | 显示全部楼层
没这个例子,这个楼主自己看7219的数据手册写一下代码吧,应该不难啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-12-10
在线时间
0 小时
 楼主| 发表于 2015-1-9 09:35:58 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
主要max7219驱动部分程序如下:
#include "max7219.h"

//只用的到0-9这几个数码下面的代码时根据自己的硬件定制的数码,别的不见得适合使用
//如何才能够使用MAX7219自带的译码工具,
uint8_t table2[10]={0xdb,0x09,0xb3,0x3b,0x69,0x7a,0xfa,0x0b,0xfb,0x7b};

//max7219与stm32硬件连接为GPIOA4[SPINSS],GPIOA5[SPISCK],GPIOA7[SPIMOSI]
void Config_Max7219(void)
{
 
RCC->APB2ENR|=1<<2;    //IO口A时钟使能,因为用来和max7219相互连接的几根信号线全部在A口上
     
GPIOA->CRL&=0X0F00FFFF; //用到了第7位,第5位,第4位,将这四个引脚设置为推挽输出模式,功能保留
GPIOA->CRL|=0X30330000;//11,设置的上述几个引脚的的输出模式为最大输出速度50MHz

  GPIOA->ODR|=1<<4;      //PA4 输出高 LOAD
  GPIOA->ODR|=1<<5;      //PA5 输出高 CLK
  GPIOA->ODR|=1<<7;      //PA7 输出高 DIN
}


//控制命令和数据同时发送到max7219芯片
void Write_Max7219(uint8_t address,uint8_t data)
{
uint8_t i;
LOAD=0;//拉低片选线,选中器件
Delayxms(3);
//一共有十六位,先发送地址,再发送数据,其实可以直接发送16位,但是感觉那样不是很友好
for(i=0;i<8;i++)
{
Delayxms(3);
CLK=0; //拉低时钟信号线
DIN=((address>>7)&0x01);//每次取字节的最高位,屏蔽掉了低7位
Delayxms(5);//考虑到光耦的转换速率
address<<=1;//次高位移到最高位
CLK=1; // 时钟上升沿,发送地址
}
//发送数据
for(i=0;i<8;i++)
{
Delayxms(3);
CLK=0;
DIN=((data>>7)&0x01);
Delayxms(5);//考虑到光耦的转换速率
data<<=1;
CLK=1;
}
Delayxms(3);
LOAD=1; //地址和数据的16位都发送完毕,拉高片选信号,将16位数据锁存到MAX7219的寄存器中
Delayxms(3);
}


//max7219使用前的初始化操作,写入相应的控制命令
void Init_Max7219(void)
{
Write_Max7219(SHUT_DOWN,0x01); //01开启正常工作模式,00开启关断模式
Write_Max7219(DISPLAY_TEST,0x00); //选择测试模式
Write_Max7219(DECODE_MODE,0x00); //因为硬件连接上面的原因,没有办法使用全译码方式,只能自己编码
Write_Max7219(SCAN_LIMIT,0x03); //2支LED全用
Write_Max7219(INTENSITY,0x0a); //设置初始亮度
}

void Display(uint8_t shi,uint8_t ge)
{
Write_Max7219(1,table2[ge]);
Write_Max7219(2,table2[shi]);
}
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-3-12
在线时间
1 小时
发表于 2015-3-10 12:08:42 | 显示全部楼层
你好,我用的的PB口的其他管脚,程序如下
void Max7219_port(void)
{
 
RCC->APB2ENR|=1<<3;//PB   使能  
     
GPIOB->CRH&=0XFFFFFFFF;//PB 9/10/11 
GPIOB->CRH|=0X00003330;//PB 9/10/11  推挽输出     
   GPIOB->ODR|=1<<9;      //PB 9  输出高
GPIOB->ODR|=1<<10;      //PB 10  输出高
GPIOB->ODR|=1<<11;      //PB 11   输出高

}
但是,数码管不亮,这里是软件模仿SPI总线的,难道必须要用你程序中PA那几个管脚吗?谢谢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-3-10 23:05:01 | 显示全部楼层
回复【4楼】playergatsby:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-12-10
在线时间
0 小时
 楼主| 发表于 2015-3-22 10:07:54 | 显示全部楼层
回复【5楼】xiaodu2014:
---------------------------------
我用PA的几个引脚是因为这几个引脚是管脚复用的,可以配置STM32片上外设SPI的寄存器,就可以通过这几个引脚来操控SPI从设备。
如果用软件模拟的方式的话,应该和是那几个引脚没有关系,只要是GPIO功能的都可以吧。问题会不会出现在时序或者延时上?我最初就是因为延时时间太短导致数据没有写入芯片,数码管也因此没有被驱动显示。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-3-12
在线时间
1 小时
发表于 2015-6-2 21:39:37 | 显示全部楼层
回复【8楼】playergatsby:
---------------------------------
谢谢你,主要原因是源程序中“GPIOB->CRH&=0XFFFFFFFF;//PB 9/10/11  ”写错啦,应该为GPIOB->CRH&=0XFFFF000F;
回复

使用道具 举报

8

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2015-11-12
在线时间
46 小时
发表于 2016-4-14 20:28:13 | 显示全部楼层
楼主能不能分享下源码,谢谢了
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2014-11-14
在线时间
9 小时
发表于 2016-6-21 22:38:36 | 显示全部楼层
可以发下完整的工程吗  楼主
回复

使用道具 举报

0

主题

25

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-6
在线时间
43 小时
发表于 2016-8-19 16:42:55 | 显示全部楼层
我用STM32F103RC带MAX7219驱动8位数码管,用寄存器方式已经成功,但改成库函数方式后就不行。而程序的其他功能却都能从寄存器方式转到库函数,唯独数码管显示这部分不行。
程序完全一样也不行。我把寄存器方式的代码,原封不动放到库函数方式的代码里了,还是不行。
事在人为,顺势而为。
回复

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-10-24
在线时间
18 小时
发表于 2021-2-9 09:08:38 | 显示全部楼层
感谢楼主
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2021-7-6
在线时间
0 小时
发表于 2021-7-6 10:19:14 | 显示全部楼层
playergatsby 发表于 2015-1-3 08:41
回复【2楼】正点原子:
---------------------------------
嗯啊&nbsp;谢谢你&nbsp;&nbsp;已经写出来了&nbsp ...

楼主你是控制的一个还是两个7219模块,我自己写的点不亮,按照你分享的还是不行,可以指导指导不
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 10:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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