找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2787|回复: 1
打印 上一主题 下一主题
收起左侧

stm32驱动MAX7912(io口模拟spi驱动8位数码管)

[复制链接]
跳转到指定楼层
楼主
ID:538157 发表于 2020-5-16 19:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  • 关于MAX7912驱动数码管的问题,论坛上基本找到的都会51驱动例程。
  • 实际上我测试过根据资料也没有什么问题,但是如果一旦移植到32,确发现不行。检查时序没有问题,百思不得其解,去网上找资料找到的都是硬件spi。
  • 看到spi速率的问题时突然想到8051和stm32单片机之间的区别,就是主频问题,f1主频71M,基本8051只有1M,max7912是否也有反应速率的问题呢?于是将模拟IO口的工作频率设置为10M,发现问题解决。
C文件



#include "max7219.h"

static void MAX7912_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        //CLK
        RCC_APB2PeriphClockCmd(Max7219_CS_GPIO_CLK , ENABLE);
        RCC_APB2PeriphClockCmd(Max7219_CLK_GPIO_CLK , ENABLE);
        RCC_APB2PeriphClockCmd(Max7219_DIN_GPIO_CLK , ENABLE);
        
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;//注意引脚的工作频率,太高反而无法接收数据
        
        GPIO_InitStruct.GPIO_Pin = Max7219_CS_GPIO_PIN;
        GPIO_Init(Max7219_CS_GPIO_PORT, &GPIO_InitStruct);
        
        GPIO_InitStruct.GPIO_Pin = Max7219_CLK_GPIO_PIN;
        GPIO_Init(Max7219_CLK_GPIO_PORT, &GPIO_InitStruct);
        
        GPIO_InitStruct.GPIO_Pin = Max7219_DIN_GPIO_PIN;
        GPIO_Init(Max7219_DIN_GPIO_PORT, &GPIO_InitStruct);
        
        Max7219_CS(0);
        Max7219_CLK(0);
        Max7219_DIN(0);
}

void Write7219(unsigned char address,unsigned char dat)
{  
    unsigned char i;
    Max7219_CS(0);    //拉低片选线,选中器件
    //发送地址
    for (i=0;i<8;i++)        //移位循环8次            
    {  
       Max7219_CLK(0);       //清零时钟总线
                         if((address&0x80))
                         {
                                 Max7219_DIN(1);
                         }
                                else
                                {
                                        Max7219_DIN(0);
                                }                                       
       address<<=1;             //左移一位
       Max7219_CLK(1);        //时钟上升沿,发送地址
    }
    //发送数据
    for (i=0;i<8;i++)              
    {  
       Max7219_CLK(0);
      if((dat&0x80))
                         {
                                 Max7219_DIN(1);
                         }
                                else
                                {
                                        Max7219_DIN(0);
                                }   
       dat<<=1;
       Max7219_CLK(1);         //时钟上升沿,发送数据
    }
    Max7219_CS(1);    //发送结束,上升沿锁存数据                     
}
//MAX7219初始化,设置MAX7219内部的控制寄存器
void Max7219Init(void)               
{
    MAX7912_GPIO_Config();
    Write7219(SHUT_DOWN,0x01);         //开启正常工作模式(0xX1)
    Write7219(DISPLAY_TEST,0x00);      //选择工作模式(0xX0)
    Write7219(DECODE_MODE,0xff);       //选用全译码模式
    Write7219(SCAN_LIMIT,0x07);        //8只LED全用
    Write7219(INTENSITY,0x04);          //设置初始亮度     
}
h文件


#ifndef _MAX7219_H
#define _MAX7219_H

#include "stm32f10x.h"

#define DECODE_MODE  0x09   //译码控制寄存器
#define INTENSITY    0x0A   //亮度控制寄存器
#define SCAN_LIMIT   0x0B   //扫描界限寄存器
#define SHUT_DOWN    0x0C   //关断模式寄存器
#define DISPLAY_TEST 0x0F   //测试控制寄存器

#define Max7219_CS_GPIO_PIN      GPIO_Pin_1//如果要修改引脚,修改宏定义即可
#define Max7219_CS_GPIO_PORT     GPIOA
#define Max7219_CS_GPIO_CLK      RCC_APB2Periph_GPIOA//

#define Max7219_CLK_GPIO_PIN      GPIO_Pin_0
#define Max7219_CLK_GPIO_PORT     GPIOA
#define Max7219_CLK_GPIO_CLK      RCC_APB2Periph_GPIOA//

#define Max7219_DIN_GPIO_PIN      GPIO_Pin_2
#define Max7219_DIN_GPIO_PORT     GPIOA
#define Max7219_DIN_GPIO_CLK      RCC_APB2Periph_GPIOA//

//  \续行符  后面不能有任何东西
#define Max7219_CS(a)   if(a)\
                                                                                                GPIO_SetBits(Max7219_CS_GPIO_PORT, Max7219_CS_GPIO_PIN);\
                                                                         else GPIO_ResetBits(Max7219_CS_GPIO_PORT, Max7219_CS_GPIO_PIN);

#define Max7219_CLK(a)   if(a)\
                                                                                                GPIO_SetBits(Max7219_CLK_GPIO_PORT, Max7219_CLK_GPIO_PIN);\
                                                                         else GPIO_ResetBits(Max7219_CLK_GPIO_PORT, Max7219_CLK_GPIO_PIN);

#define Max7219_DIN(a)   if(a)\
                                                                                                GPIO_SetBits(Max7219_DIN_GPIO_PORT, Max7219_DIN_GPIO_PIN);\
                                                                         else GPIO_ResetBits(Max7219_DIN_GPIO_PORT, Max7219_DIN_GPIO_PIN);

void Write7219(unsigned char address,unsigned char dat);
void Max7219Init(void) ;

#endif

全部资料51hei下载地址:
max7219.7z (176.56 KB, 下载次数: 48)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:922249 发表于 2021-11-17 16:44 | 只看该作者
题主你好,请问是7219还是7912呀?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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