1、STM32 硬件SPI max7219 8位数码管显示模块
数码管模块电路图
/*****************************************************************
Updated time: 12th,12,2015
Function:通过MAX7219驱动数码管
******************************************************************/
#include “delay.h”
#include “sys.h”
#include “usart.h”//串口通信
#define Max7219_pinCLK PAout(5)
#define Max7219_pinCS PAout(3)
#define Max7219_pinDIN PAout(7)
/****************************************************************************
* 名称:SPI1_Init(void)
* 功能:STM32_SPI1硬件配置初始化
* 入口参数:无
* 出口参数:无
* 说明:STM32_SPI1硬件配置初始化,使用3V3
****************************************************************************/
void SPI1_Init(void)
{
SPI_InitTypeDef SPI1_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//配置SPI1管脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽复用功能
GPIO_Init(GPIOA,&GPIO_InitStructure);
SPI1_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式;SPI设置为双线双向全双工
SPI1_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;//定义波特率预分频值;波特率预分频64
SPI1_InitStructure.SPI_DataSize=SPI_DataSize_8b;//设置SPI的数据大小;SPI发送接收8位帧结构
SPI1_InitStructure.SPI_Mode=SPI_Mode_Master;//设置SPI工作模式;设置为主SPI
SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿
SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft; //使用软件模式,
SPI1_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式
SPI_I2S_DeInit(SPI1);
SPI_Init(SPI1, &SPI1_InitStructure); //根据指定的参数初始化
SPI_Cmd(SPI1, ENABLE); //SPI使能
//--------------------------------------------
//功能:向MAX7219写入字节
//入口参数:DATA
//出口参数:无
//说明:
void Write_Max7219_byte(unsigned char DATA)
{
unsigned char i;
Max7219_pinCS=0;
for(i=8;i》=1;i--)
{
Max7219_pinCLK=0;
Max7219_pinDIN=DATA&0x80;
DATA=DATA《《1;
Max7219_pinCLK=1;
}
}
//-------------------------------------------
//功能:向MAX7219写入数据
//入口参数:address,dat
//出口参数:无
//说明:
void Write_Max7219(unsigned char address,unsigned char dat)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
SPI_I2S_SendData(SPI1, address); //写入地址,即数码管编号
delay_us(10);
SPI_I2S_SendData(SPI1, dat); //写入数据,即数码管显示数字
delay_us(10);
GPIO_SetBits(GPIOA, GPIO_Pin_3);
}
void Init_MAX7219(void)
{
Write_Max7219(0x09, 0xFF); //译码方式:BCD译码
Write_Max7219(0x0A, 0x03); //亮度
Write_Max7219(0x0B, 0x07); //扫描界限;8个数码管显示
Write_Max7219(0x0C, 0x01); //掉电模式:0;普通模式:1
Write_Max7219(0x0F, 0x00); //显示测试:1;测试结束,正常显示:0
}
int main(void)
{
unsigned char i,j;
delay_init();//延时初始化
SPI1_Init();//SPI初始化
NVIC_Configuration();//中断分组
uart_init(9600);//串口波特率9600
delay_ms(50);
Init_MAX7219();//初始化
Write_Max7219(0x01, 0x00); //1号数码管显示数字0
Write_Max7219(0x02, 0x01);
Write_Max7219(0x03, 0x02);
Write_Max7219(0x04, 0x03);
Write_Max7219(0x05, 0x04);
Write_Max7219(0x06, 0x05);
Write_Max7219(0x07, 0x06);
Write_Max7219(0x08, 0x07);
for(j=0;j《=9;j++)
{
Write_Max7219(0x04, j);
delay_ms(50);
}
}
spi通信配置
1、GPIO时钟使能,SPI时钟使能。
2、配置GPIO片选,推挽输出,上拉;SCLK、MOSI、MISO所用到的引脚为复用功能;SCLK下拉,MOSI推挽复用,MISO无推挽。
3、SPI初始化,配置工作模式为全双工,主机模式,SCLK闲时电平为低,第二个时钟沿(下降沿)采样数据,SCLK时钟128预分频,CRC校验置默认值0x07,内部从机选择软件管理模式。设置接收FIFO为四分之一,内部从机选择设置为主机(置1),使能SPI。
4、从机设备一般上电是默认写使能的,因此若需要读取数据先关闭写使能。
5,stm32f0在使能spi后,miso和mosi都被拉低,因此在读取从机数据时,需要先发送的无效数据为0x00。
51单片机+MAX7219数码管显示C程序#e#
2、51单片机+MAX7219数码管显示C程序
/**************************************************
*程序名称: MAX7219 C语言控制程序
*程序功能: 3线串行控制8位共阴数码管
*3线定义:DIN 串行数据输入
* LOAD 数据锁存
* CLK 时钟输入
***************************************************/
#include 《reg52.h》
#include 《intrins.h》
sbit pinDIN=P0^0; //串行数据输入端
sbit pinLOAD=P0^1; //数据锁存端
sbit pinCLK=P0^2; //时钟输入端
#define uchar unsigned char
uchar code LEDcode[]=
{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00 /*0,1,2,3,4,5,6,7,8,9,全灭*/
/* 0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff, */ }; /*A,B,C,D,E,F,P,U,全亮*/
/**************************************************
* 向MAX7219写入字节(8位)函数 *
***************************************************/
void sendbyte (uchar dat)
{
uchar i,temp;
_nop_();
for (i=0;i《8;i++)
{
temp=dat&0x80;
dat=dat《《1;
if(temp)
pinDIN=1;
else
pinDIN=0;
pinCLK=0;
_nop_();
pinCLK=1;
}
}
/**************************************************
* 向MAX7219写入地址和控制字(16位) *
***************************************************/
void sendword (uchar addr,uchar dat)
{
pinLOAD=0;
_nop_();
sendbyte (addr);
_nop_();
sendbyte (dat);
_nop_();
pinLOAD=1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失
}
/**************************************************
* MAX7219初始化 *
***************************************************/
void init7219 (void)
{
sendword (0x0c,0x01); /* 设置电源工作模式 */
sendword (0x0a,0x09); /* 设置亮度 19/32 */
sendword (0x0b,0x03); /* 设置扫描界限 */
sendword (0x09,0x00); /* 设置译码模式 */
sendword (0x0f,0x00); /*显示测试 00为正常工作状态*/
}
/**************************************************
* MAX7219清除显示 *
***************************************************/
void clear7219(void)
{
uchar i;
for(i=8;i》0;i--)
{
sendword(i,0x00);
}
}
/**************************************************
* MAX7219主函数 *
***************************************************/
/*void main(void)
{
init7219 ();
//clear7219();
while(1)
{
clear7219();
sendword(0x01,LEDcode[11]);
sendword(0x02,LEDcode[12]|0x80);
sendword(0x03,LEDcode[13]);
sendword(0x04,LEDcode[4]);
sendword(0x05,LEDcode[5]);
sendword(0x06,LEDcode[6]);
sendword(0x07,LEDcode[7]);
sendword(0x08,LEDcode[8]);
}
}*/