ARM1.2作业

发布时间:2024年01月02日

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

spi.h

#ifndef __SPI_H__
#define __SPI_H__
#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"

//MOSI对应的引脚输入高低电平的信号PE14
#define MOSI_OUTPUT_H()  do{GPIOE->ODR |= (0x1 << 14);}while(0)
#define MOSI_OUTPUT_L()  do{GPIOE->ODR &= (~(0x1 << 14));}while(0)

//对应595芯片的锁存引脚输出高低电平   PE11
#define NSS_OUTPUT_H()   do{GPIOE->ODR |= (0x1 <<11);}while(0)
#define NSS_OUTPUT_L()   do{GPIOE->ODR &= (~(0x1 <<11));}while(0)

//时钟信号对应的引脚输出高低电平  PE12
#define SCK_OUTPUT_H()  do{GPIOE->ODR |= (0x1 <<12);}while(0)
#define SCK_OUTPUT_L()  do{GPIOE->ODR &= (~(0x1 <<12));}while(0)


//SPI初始化函数,推挽输出,高速,禁止上拉和下拉
void SPI_init(void);
//SPI发送数据的函数
void SPI_write(unsigned char dat);
void delay_us1(unsigned int us);
#endif

spi.c

#include "spi.h"

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

void SPI_init(void)
{
    RCC->MP_AHB4ENSETR |= (0x1 << 4);
    //MOSI   PE14
    GPIOE->MODER &= (~(0x3 <<28));
    GPIOE->MODER |= (0x1 <<28);
    GPIOE->OTYPER &= (~(0x1 << 14));
    GPIOE->OSPEEDR &= (~(0X3 << 28));
    GPIOE->PUPDR &= (~(0X3 <<28));
    //MOSI   PE13
    GPIOE->MODER &= (~(0x3 <<26));
    GPIOE->OSPEEDR &= (~(0x3 << 26));
    GPIOE->PUPDR &= (~(0x3 <<26));
    //MOSI   PE12
    GPIOE->MODER &= (~(0x3 <<24));
    GPIOE->MODER |= (0x1 <<24);
    GPIOE->OTYPER &= (~(0x1 << 12));
    GPIOE->OSPEEDR &= (~(0X3 << 24));
    GPIOE->PUPDR &= (~(0X3 <<24));
    //MOSI   PE11
    GPIOE->MODER &= (~(0x3 <<22));
    GPIOE->MODER |= (0x1 <<22);
    GPIOE->OTYPER &= (~(0x1 << 11));
    GPIOE->OSPEEDR &= (~(0X3 << 22));
    GPIOE->PUPDR &= (~(0X3 <<22));
    NSS_OUTPUT_L();//595芯片的锁存引脚拉低
    SCK_OUTPUT_L();//SPI的时钟线拉低
}


void SPI_write(unsigned char dat)
{
    unsigned char i;
    for(i = 0;i<8;i++)
    {
        if(dat & 0x01)
        {
            MOSI_OUTPUT_H();//MOSI线写高
        }
        else
        {
            MOSI_OUTPUT_L();//MOSI线写低
        }
        dat >>=1;
        //时钟线从低电平到高电平的变化时,MOSI数据线上的数据
        //被写到595芯片的移位寄存器中
        SCK_OUTPUT_L();
        delay_us1(10);
        SCK_OUTPUT_H();
        delay_us1(10);
    }
}

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 num2[4] = {0x80,0x40,0x20,0x10};

	int main(void)

	{

		unsigned char i;

		SPI_init();

		//si7006_init();

		while(1)

		{

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

			{

				SPI_write(num2[i]);//发送数码管的位

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

				NSS_OUTPUT_L();

				delay_ms(1);

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

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

				delay_ms(5);

			}

		}

		return 0;

	}



将温湿度数据显示到数码

main.c

#include "spi.h"

#include "si7006.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 num2[4] = {0x80,0x40,0x20,0x10};

	int arr[4];

	 unsigned short hum;

	 short tem;

	int main(void)

	{

		unsigned char i;

		SPI_init();

		si7006_init();

		while(1)

		{

			

				tem=si7006_read_temp_data(0X40,0XE3);

				tem=175.72*tem/65536-46.85;

				hum=si7006_read_hum_data(0X40,0XE5);

				hum=125*hum/65536-6;

				arr[0]=tem/10;

				arr[1]=tem%10;

				arr[2]=hum/10;

				arr[3]=hum%10;

		for(int j=0;j<1000;j++)

		{

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

			{

				SPI_write(num2[i]);//发送数码管的位

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

				NSS_OUTPUT_L();

				delay_ms(1);

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

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

				

			}

		}

	}

		return 0;

}

文章来源:https://blog.csdn.net/zhuyu0828/article/details/135348774
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。