STM32+l两个74HC595控制16个LED,程序该如何写?

2019-07-14 23:25发布

请问主函数该怎么操作,求各路大神
L55OF[PKI1C$8Y0}5UU8RSK.jpg
XLM4D4MP)]_}H~($L_80CLR.jpg
keil4程序测试.zip 下载积分: 积分 -1 分
649.85 KB, 下载次数: 805, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
zhaowwll133
2019-07-15 14:41
#include  "drivehc595.h"
#include  "delay.h"

//*****************************************
/*µãÁÁ¶ÔÓ¦µÆ*/
void Drive_Hc595(u32 dat_status, u16 ledstatus)
{
    u32 i,tmp32;
    u16 tmp16;
   
    RCK_L();
    for(i=0;i<32;i++)
    {
        SCK_L();
        Delay(0x10);
        tmp32 = (dat_status & 0x80000000);
        if(tmp32) { DAT_OUT_H(); }
        else      { DAT_OUT_L(); }
        Delay(0x10);
        SCK_H();
        Delay(0x10);
        dat_status <<= 1;
    }
    Delay(0x10);
   
    for(i=0;i<16;i++)
    {
        SCK_L();
        Delay(0x10);
        tmp16 = (ledstatus & 0x8000);
        if(tmp16) { DAT_OUT_H(); }
        else      { DAT_OUT_L(); }
        Delay(0x10);
        SCK_H();
        Delay(0x10);
        ledstatus <<= 1;
    }
    Delay(0x10);
   
    RCK_H();
    Delay(0x10);
   
    SCK_L();
    RCK_L();
    DAT_OUT_L();
}   


// Çý¶¯HC595µÄ¹Ü½Å³õʼ»¯
void Init_HC595_GPIO(void)
{
    GPIO_InitTypeDef   GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_GPIO_HC595, ENABLE); /*ʹÄÜHC595ʹÓõÄGPIOʱÖÓ*/
    GPIO_InitStructure.GPIO_Pin = DAT_PIN | SCK_PIN | RCK_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIO_HC595_PORT, &GPIO_InitStructure);
    RCK_L();
    SCK_L();
    DAT_OUT_L();
}

////////////
#ifndef __DRIVEHC595_H
#define __DRIVEHC595_H
   
#include  "sys.h"


////////////////////////////////////////////////////////
#define    RCC_GPIO_HC595        RCC_APB2Periph_GPIOF  //HC595ʹÓõÄGPIOʱÖÓ
#define    GPIO_HC595_PORT       GPIOF                 // HC595 Çý¶¯Òý½ÅËùÔڵĶ˿Ú

#define    SCK_PIN               GPIO_Pin_13           //HC595 ÒÆλÐźÅÒý½Å
#define    pinSCK                PIN13
#define    RCK_PIN               GPIO_Pin_12           //HC595 Ëø´æÐźÅÒý½Å
#define    pinRCK                PIN12
#define    DAT_PIN               GPIO_Pin_11           //HC595 Êý¾ÝÐźÅÒý½Å
#define    pinDAT                PIN11

////////////////////////////////////////////////////////
#define    SCK_H()               PFout(pinSCK)=1
#define    SCK_L()               PFout(pinSCK)=0
#define    SCK_XOR()             PFout(pinSCK)=!PFout(pinSCK)

#define    RCK_H()               PFout(pinRCK)=1
#define    RCK_L()               PFout(pinRCK)=0
#define    RCK_XOR()             PFout(pinRCK)=!PFout(pinRCK)

#define    DAT_OUT_H()           PFout(pinDAT)=1
#define    DAT_OUT_L()           PFout(pinDAT)=0

////////////////////////////////////////////////////////
void  Drive_Hc595(u32 dat_status, u16 ledstatus);
void  Init_HC595_GPIO(void);
#endif

//////////////////
#ifndef __SYS_H
#define __SYS_H

#include "stm32f10x.h"

//////////////////////////////////////////////////////////////////////////////////

typedef enum
{
    FALSE = 0,
    TRUE     ,
}BOOL;

typedef enum
{
    OFF = 0,
    ON     ,
}ONorOFF;

typedef enum{
    MODE_INPUT     = 0x0,
    MODE_OUT_10MHz = 0x01,
    MODE_OUT_2MHz  = 0x02,
    MODE_OUT_50MHz = 0x03,
}IOMode;

typedef enum{
    ANALOG_INPUT   = 0x00,
    FLOATING_INPUT = 0x04,
    UP_DOWN_INPUT  = 0x08,
    REVERSE_INPUT  = 0x0c,
}InputMode_InMode;

typedef enum{
    PP_OUTPUT      = 0,
    OD_OUTPUT      = 0x04,
    AFIO_PP_OUTPUT = 0x08,
    AFIO_OD_OUTPUT = 0x0c,
}OutputMode_OutMode;


//////////////////////////////////////////////////////////////////////////////////
#define    PIN0      0
#define    PIN1      1
#define    PIN2      2
#define    PIN3      3
#define    PIN4      4
#define    PIN5      5
#define    PIN6      6
#define    PIN7      7
#define    PIN8      8
#define    PIN9      9
#define    PIN10     10
#define    PIN11     11
#define    PIN12     12
#define    PIN13     13
#define    PIN14     14
#define    PIN15     15
//////////////////////////////////////////////////////////////////////////////////         

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
//IO¿ÚµØÖ·Ó³Éä
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C   
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C   

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08

//////////////////////////////////////////////////////////////////
//IO¿Ú²Ù×÷,Ö»¶Ôµ¥Ò»µÄIO¿Ú!
//È·±£nµÄֵСÓÚ16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //Êä³ö
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //ÊäÈë

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //Êä³ö
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //ÊäÈë

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //Êä³ö
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //ÊäÈë

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //Êä³ö
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //ÊäÈë

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //Êä³ö
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //ÊäÈë

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //Êä³ö
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //ÊäÈë

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //Êä³ö
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //ÊäÈë
#endif

评分

参与人数 1积分 +5 收起 理由 ElecFans小喇叭 + 5 您的付出是论坛的动力,感谢您一直支持!.

查看全部评分

一周热门 更多>