- 關于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)
2020-5-17 04:09 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|