新手上路
积分 20
金钱 20
注册时间 2016-5-15
在线时间 2 小时
1 金钱
#ifndef __SPI_H
#define __SPI_H
#include "sys.h"
#define HC595_nCS GPIO_Pin_0 //HC595_nCS=PA0
#define HC595_RCK GPIO_Pin_1 //HC595_RCK=PA1
#define SEG_A1 GPIO_Pin_8 //SEG_A1=PC8
#define SEG_A2 GPIO_Pin_15 //SEG_A2=PB15
#define SEG_A3 GPIO_Pin_9 //SEG_A3=PC9
#define SEG_A4 GPIO_Pin_8 //SEG_A4=PE8
void Delay_MS(u16 dly);
void SPI1_Init(void);
void SEG_BitSelect(u8 data);
void SEG_Display(u16 data,u8 radix_Point);
void SEG_POWEROFF(void);
//void SPI2_Init(void);
//void SPI2_SetSpeed(u8 SpeedSet);
//u8 SPI2_ReadWriteByte(u8 TxData);
#endif
#include "stm32f10x.h"
#include "spi.h"
//TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_ocInitTypeDef TIM_ocInitStructure;
//ErrorStatus HSEStartUpStatus;
int main(void)
{
Delay_MS(10);
// u8 i,data;
// #ifdef DEBUG
// debug();
// #endif
SPI1_Init();
while(1)
{
SEG_Display(1235,3); //表示要显示12.35
}
}
#include "usart.h"
#include "sys.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "spi.h"
u8 const NumberTube_TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管0-9
void Delay_MS(u16 dly)
{
u16 i,j;
for(i=0;i<dly;i++)
for(j=1000;j>0;j--);
}
void SPI1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI1_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_InitStructure.GPIO_Pin = HC595_nCS | HC595_RCK;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SEG_A2; //Ñ¡Ôñ B.15
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SEG_A1 | SEG_A3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SEG_A4; //Ñ¡Ôñ E.8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7;
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;
SPI1_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI1_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //4种时序都试过了,还是不行
SPI1_InitStructure.SPI_NSS = SPI_NSS_Hard;
SPI1_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
SPI1_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI1_InitStructure.SPI_CRCPolynomial = 7;
SPI_I2S_DeInit(SPI1);
SPI_Init(SPI1, &SPI1_InitStructure);
SPI_Cmd(SPI1,ENABLE);
GPIO_ResetBits(GPIOA,HC595_nCS); //片选置0
}
void SEG_BitSelect(u8 data)
{
if((data & 0x01) !=0) GPIO_ResetBits(GPIOE,SEG_A4); //位控制
else GPIO_SetBits(GPIOE,SEG_A4);
if((data & 0x02) !=0) GPIO_ResetBits(GPIOC,SEG_A3);
else GPIO_SetBits(GPIOC,SEG_A3);
if((data & 0x04) !=0) GPIO_ResetBits(GPIOB,SEG_A2);
else GPIO_SetBits(GPIOB,SEG_A2);
if((data & 0x08) !=0) GPIO_ResetBits(GPIOC,SEG_A1);
else GPIO_SetBits(GPIOC,SEG_A1);
}
void SEG_Display(u16 data,u8 radix_Point) //data=1235, radix_Point=3;
{
u16 j,one,ten,hundred,thousand;
thousand = data / 1000;
if(thousand != 0) data -= thousand*1000;
hundred = data /100;
if(hundred != 0) data -= hundred*100;
ten = data /10;
if(ten != 0) data -= ten*10;
one = data%10;
GPIO_ResetBits(GPIOA,HC595_RCK);
if(radix_Point==4) SPI_I2S_SendData(SPI1,NumberTube_TAB[thousand] & 0x7f);
else SPI_I2S_SendData(SPI1,NumberTube_TAB[thousand]);
GPIO_SetBits(GPIOA,HC595_RCK);
SEG_BitSelect(0x08);
for(j=0;j<500;j++); //
SEG_BitSelect(0x00);
GPIO_ResetBits(GPIOA,HC595_RCK);
if(radix_Point==3) SPI_I2S_SendData(SPI1,NumberTube_TAB[hundred] & 0x7f);
else SPI_I2S_SendData(SPI1,NumberTube_TAB[hundred]);
GPIO_SetBits(GPIOA,HC595_RCK);
SEG_BitSelect(0x01); //打开数码管位
for(j=0;j<500;j++); //相当于延时刷屏,防止数码管抖动
SEG_BitSelect(0x00); //关闭显示
GPIO_ResetBits(GPIOA,HC595_RCK);
if(radix_Point==2) SPI_I2S_SendData(SPI1,NumberTube_TAB[ten] & 0x7f);
else SPI_I2S_SendData(SPI1,NumberTube_TAB[ten]);
GPIO_SetBits(GPIOA,HC595_RCK);
SEG_BitSelect(0x02);
for(j=0;j<500;j++);
SEG_BitSelect(0x00);
GPIO_ResetBits(GPIOA,HC595_RCK);
SPI_I2S_SendData(SPI1,NumberTube_TAB[one]);
GPIO_SetBits(GPIOA,HC595_RCK);
SEG_BitSelect(0x04);
for(j=0;j<500;j++);
SEG_BitSelect(0x00);
}
void SEG_POWEROFF(void) //关闭数码管
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, DISABLE);
GPIO_SetBits(GPIOC,SEG_A1);
GPIO_SetBits(GPIOB,SEG_A2);
GPIO_SetBits(GPIOC,SEG_A3);
GPIO_SetBits(GPIOE,SEG_A4);
}
我来回答