温湿度数据通过中断处理显示到数码管中
main.c
#include "spi.h"#include"si7006.h"int main(){int i=0,j=0,m=0,n=0;int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};SPI_init();unsigned short hum;short tem;//进行si7006的初始化si7006_init();while(1){//读取湿度hum=si7006_read_hum_data(0X40,0XE5);//读取温度tem=si7006_read_temp_data(0X40,0XE3);//将温度数据和湿度数据按照转换公式进行转换hum=125*hum/65536-6;tem=175.72*tem/65536-46.85;//将获取到的数据打印到串口i=hum/10;j=hum%10;m=tem/10;n=tem%10;for(int s=0;s<5000;s++){SPI_write(0x80); // 发送数码管的位 SPI_write(num[i]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化SPI_write(0x40); // 发送数码管的位 SPI_write(num[j]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化SPI_write(0x20); // 发送数码管的位 SPI_write(num[m]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化SPI_write(0x10); // 发送数码管的位 SPI_write(num[n]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);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<1;j++);}
}
void delay_ms(int ms)
{int i,j;for(i = 0; i < ms;i++)for (j = 0; j < 1800; 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));//3.MISO管脚PE13 设置输入的属性GPIOE->MODER &=(~(0x3<<26));GPIOE->OSPEEDR &= (~(0x3 << 26));GPIOE->PUPDR &= (~(0x3 << 26));//4.SCK管脚PE12 设置输出的属性GPIOE->MODER &=(~(0x3<<24));GPIOE->MODER |=(0x1<<24);GPIOE->OTYPER &= (~(0x1 << 12));GPIOE->OSPEEDR &= (~(0x3 << 24));GPIOE->PUPDR &= (~(0x3 << 24));//5.RCK(NSS)管脚 设置输出的属性GPIOE->MODER &=(~(0x3<<22));GPIOE->MODER |=(0x1<<22);GPIOE->OTYPER &= (~(0x1 << 11));GPIOE->OSPEEDR &= (~(0x3 << 22));GPIOE->PUPDR &= (~(0x3 << 22));//默认PE12和PE11输出低电平,方便产生上升沿GPIOE->ODR |=(~(0x3<<11));
}
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;//产生上升沿SCK_OUTPUT_L();delay_us1(5);SCK_OUTPUT_H();delay_us1(5);}}
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发送数据的函数* 函数参数:dat : 要发送的数据* 函数返回值:无*
*/
void SPI_write(unsigned char dat);void delay_us1(unsigned int us);
void delay_ms(int ms);
#endif // __SPI_H__
数码管不同位显示不同数字---计时器
main.c
#include "spi.h"#include"si7006.h"int main(){int i=0,j=0,m=0,n=0;int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};SPI_init();while(1){for(int s=0;s<260;s++){SPI_write(0x80); // 发送数码管的位 SPI_write(num[i]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化SPI_write(0x40); // 发送数码管的位 SPI_write(num[j]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化SPI_write(0x20); // 发送数码管的位 SPI_write(num[m]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化SPI_write(0x10); // 发送数码管的位 SPI_write(num[n]); // 发送数码管的段NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化}n++;if(n>9){n=0;m++;}}return 0;}