OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3851|回复: 1

SPI驱动74HC595与数码管,此程序编译可以通过,但没有调试通过,请教大神!!!拜托了

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-5-15
在线时间
2 小时
发表于 2016-8-22 22:17:37 | 显示全部楼层 |阅读模式
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;  //&#209;&#161;&#212;&#241B.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;  //&#209;&#161;&#212;&#241E.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);
                }

截图01.png
IMG_20160822_220453.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

133

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
408
金钱
408
注册时间
2016-1-27
在线时间
63 小时
发表于 2016-8-23 14:49:40 | 显示全部楼层
我用GPIO模拟SPI驱动595做数码管控制,只调了个把小时就显示了,很简单的。你先弄明白595时序。
Mob:150 0032 0863
QQ:276204039
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 13:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表