- 关于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, 下载次数: 49)
|