1、STM32 硬件SPI max7219 8位數(shù)碼管顯示模塊
數(shù)碼管模塊電路圖
/*****************************************************************
Updated time: 12th,12,2015
Function:通過MAX7219驅(qū)動數(shù)碼管
******************************************************************/
#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硬件配置初始化
* 入口參數(shù):無
* 出口參數(shù):無
* 說明: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相關(guān)引腳
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;//設(shè)置SPI單向或者雙向的數(shù)據(jù)模式;SPI設(shè)置為雙線雙向全雙工
SPI1_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;//定義波特率預(yù)分頻值;波特率預(yù)分頻64
SPI1_InitStructure.SPI_DataSize=SPI_DataSize_8b;//設(shè)置SPI的數(shù)據(jù)大??;SPI發(fā)送接收8位幀結(jié)構(gòu)
SPI1_InitStructure.SPI_Mode=SPI_Mode_Master;//設(shè)置SPI工作模式;設(shè)置為主SPI
SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //選擇了串行時鐘的穩(wěn)態(tài),時鐘懸空高
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//數(shù)據(jù)捕獲于第二個時鐘沿
SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft; //使用軟件模式,
SPI1_InitStructure.SPI_CRCPolynomial = 7;//CRC值計算的多項式
SPI_I2S_DeInit(SPI1);
SPI_Init(SPI1, &SPI1_InitStructure); //根據(jù)指定的參數(shù)初始化
SPI_Cmd(SPI1, ENABLE); //SPI使能
//--------------------------------------------
//功能:向MAX7219寫入字節(jié)
//入口參數(shù):DATA
//出口參數(shù):無
//說明:
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寫入數(shù)據(jù)
//入口參數(shù):address,dat
//出口參數(shù):無
//說明:
void Write_Max7219(unsigned char address,unsigned char dat)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
SPI_I2S_SendData(SPI1, address); //寫入地址,即數(shù)碼管編號
delay_us(10);
SPI_I2S_SendData(SPI1, dat); //寫入數(shù)據(jù),即數(shù)碼管顯示數(shù)字
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個數(shù)碼管顯示
Write_Max7219(0x0C, 0x01); //掉電模式:0;普通模式:1
Write_Max7219(0x0F, 0x00); //顯示測試:1;測試結(jié)束,正常顯示: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號數(shù)碼管顯示數(shù)字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閑時電平為低,第二個時鐘沿(下降沿)采樣數(shù)據(jù),SCLK時鐘128預(yù)分頻,CRC校驗置默認值0x07,內(nèi)部從機選擇軟件管理模式。設(shè)置接收FIFO為四分之一,內(nèi)部從機選擇設(shè)置為主機(置1),使能SPI。
4、從機設(shè)備一般上電是默認寫使能的,因此若需要讀取數(shù)據(jù)先關(guān)閉寫使能。
5,stm32f0在使能spi后,miso和mosi都被拉低,因此在讀取從機數(shù)據(jù)時,需要先發(fā)送的無效數(shù)據(jù)為0x00。
51單片機+MAX7219數(shù)碼管顯示C程序#e#
2、51單片機+MAX7219數(shù)碼管顯示C程序
/**************************************************
*程序名稱: MAX7219 C語言控制程序
*程序功能: 3線串行控制8位共陰數(shù)碼管
*3線定義:DIN 串行數(shù)據(jù)輸入
* LOAD 數(shù)據(jù)鎖存
* CLK 時鐘輸入
***************************************************/
#include 《reg52.h》
#include 《intrins.h》
sbit pinDIN=P0^0; //串行數(shù)據(jù)輸入端
sbit pinLOAD=P0^1; //數(shù)據(jù)鎖存端
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(xiàn),P,U,全亮*/
/**************************************************
* 向MAX7219寫入字節(jié)(8位)函數(shù) *
***************************************************/
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置高,否則數(shù)據(jù)丟失
}
/**************************************************
* MAX7219初始化 *
***************************************************/
void init7219 (void)
{
sendword (0x0c,0x01); /* 設(shè)置電源工作模式 */
sendword (0x0a,0x09); /* 設(shè)置亮度 19/32 */
sendword (0x0b,0x03); /* 設(shè)置掃描界限 */
sendword (0x09,0x00); /* 設(shè)置譯碼模式 */
sendword (0x0f,0x00); /*顯示測試 00為正常工作狀態(tài)*/
}
/**************************************************
* MAX7219清除顯示 *
***************************************************/
void clear7219(void)
{
uchar i;
for(i=8;i》0;i--)
{
sendword(i,0x00);
}
}
/**************************************************
* MAX7219主函數(shù) *
***************************************************/
/*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]);
}
}*/
評論