数码管不同位显示不同的数字

main.c



#include "spi.h"

extern void printf(const char *fmt, ...);

void delay_ms(int ms)

{

    int i,j;

    for(i = 0; i < ms;i++)

        for (j = 0; j < 1800; j++);

}   



//保存0-9编码的数组

int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};



int main(void)

{

    unsigned char i,j;

    SPI_init();

    while(1)

    {

   for ( j = 0; j<2000; j++)

      {

           for(i = 0; i < 10; i++)

        {

            SPI_write(0x80);  // 发送数码管的位 

            SPI_write(num[i]);  // 发送数码管的段

            NSS_OUTPUT_L();

            delay_ms(10);

            NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化

                            // 将移位寄存器中的数据锁存到锁存寄存器中



            SPI_write(0x40);  // 发送数码管的位 

            SPI_write(num[i]);  // 发送数码管的段

            NSS_OUTPUT_L();

            delay_ms(10);

            NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化

                            // 将移位寄存器中的数据锁存到锁存寄存器中



            SPI_write(0x20);  // 发送数码管的位 

            SPI_write(num[i]);  // 发送数码管的段

            NSS_OUTPUT_L();

            delay_  ms(10);

            NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化

                            // 将移位寄存器中的数据锁存到锁存寄存器中



            SPI_write(0x10);  // 发送数码管的位 

            SPI_write(num[i]);  // 发送数码管的段

            NSS_OUTPUT_L();

            delay_ms(10);

            NSS_OUTPUT_H();   // 锁存的时钟从低到高的变化

                            // 将移位寄存器中的数据锁存到锁存寄存器中

        }

      }

    }



    return 0;

}

spi.c

#include "spi.h"

void delay_us1(unsigned int us)
{
    int i,j;
    for ( i = 0; i < us; i++)
    {
        for ( j = 0; j < us; j++);
    }
}

void    SPI_init(void)
{
    //1.使能GPIOE时钟
    RCC->MP_AHB4ENSETR |= (0x1 << 4);    
    //2.MOSI管脚PE14 设置其输入的属性
    GPIOE->MODER &= (~(0x3 << 28));
    GPIOE->MODER |= (0x1 << 28);
    GPIOE->OTYPER &= (~(0x1 << 14));
    GPIOE ->OSPEEDR &= (~(0X3 << 28));
    GPIOE ->PUPDR &= (~(0x3 << 28));

    //PE13 MISO
    GPIOE->MODER &= (~(0x3 << 24));
    GPIOE->MODER |= (0x1 << 24);
    GPIOE->OTYPER &= (~(0x1 << 12));
    GPIOE ->OSPEEDR &= (~(0X3 << 24));
    GPIOE ->PUPDR &= (~(0x3 << 24));

    //NSS  PE11
    GPIOE->MODER &= (~(0x3 << 22));
    GPIOE->MODER |= (0x1 << 22);
    GPIOE->OTYPER &= (~(0x1 << 11));
    GPIOE ->OSPEEDR &= (~(0X3 << 22));
    GPIOE ->PUPDR &= (~(0x3 << 22));

}

void SPI_write(unsigned char dat)
{
    unsigned int i;
    for(i=0;i<8;i++)
    {
        if (dat&0x01)
        {
            /* 输出高电平*/
            MOSI_OUTPUT_H();

        }
        else
        {
            /* 输出低电平 */
            MOSI_OUTPUT_L();
        }
        dat >>= 1;
        //产生上升沿
        //时钟线从低电平到高电平的变化时,MOSI数据线上的数据
        //被写到595芯片的移位寄存器中
        SCK_OUTPUT_L(); //SCK拉低
        delay_us1(20);
        SCK_OUTPUT_H(); //SCK拉高
        delay_us1(20);
    }
}



你可能感兴趣的:(单片机,嵌入式硬件)