目录
温湿度数据通过中断处理显示到数码管中 (左边温度,右边湿度)
温湿度数据通过中断处理显示到数码管中 (左边温度,右边湿度)
作业要求:
代码运行效果图:
数码管不同位显示不同数字
温湿度数据通过中断处理显示到数码管中 (左边温度,右边湿度)

代码:
数码管不同位显示不同数字
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)
{
//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->OSPEEDR |= (0X2<<28);
GPIOE->PUPDR &= (~(0X3<<28));
//3.MISO管脚PE13 设置输入的属性
GPIOE->MODER &= (~(0X3<<26));
//4.SCK管脚PE12 设置输出的属性
GPIOE->MODER &= (~(0X3<<24));
GPIOE->MODER |= (0x1<<24);
GPIOE->OTYPER &= (~(0X1<<12));
GPIOE->OSPEEDR &= (~(0X3<<24));
GPIOE->OSPEEDR |= (0X2<<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->OSPEEDR |= (0X2<<22);
GPIOE->PUPDR &= (~(0X3<<22));
//默认PE12和PE11输出低电平,方便产生上升沿
NSS_OUTPUT_L();
SCK_OUTPUT_L();
}
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(1);
SCK_OUTPUT_H();
}
}
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);
#endif // __SPI_H__
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)
{
int i;
SPI_init();
int n = 0;
while (1)
{
if (n == 0)
{
for (i = 0; i < 10; i++)
{
SPI_write(0xF0); // 发送数码管的位
SPI_write(num[i]); // 发送数码管的段
NSS_OUTPUT_L();
delay_ms(1);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
delay_ms(500);
}
n++;
}
if (n == 1)
{
for (i = 0; i < 10; i++)
{
SPI_write(0x80); // 发送数码管的位
SPI_write(num[i]); // 发送数码管的段
NSS_OUTPUT_L();
delay_ms(1);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
delay_ms(500);
}
n++;
}
if (n == 2)
{
for (i = 0; i < 10; i++)
{
SPI_write(0x40); // 发送数码管的位
SPI_write(num[i]); // 发送数码管的段
NSS_OUTPUT_L();
delay_ms(1);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
delay_ms(500);
}
n++;
}
if (n == 3)
{
for (i = 0; i < 10; i++)
{
SPI_write(0x20); // 发送数码管的位
SPI_write(num[i]); // 发送数码管的段
NSS_OUTPUT_L();
delay_ms(1);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
delay_ms(500);
}
n++;
}
if (n == 4)
{
for (i = 0; i < 10; i++)
{
SPI_write(0x10); // 发送数码管的位
SPI_write(num[i]); // 发送数码管的段
NSS_OUTPUT_L();
delay_ms(1);
NSS_OUTPUT_H(); // 锁存的时钟从低到高的变化
// 将移位寄存器中的数据锁存到锁存寄存器中
delay_ms(500);
}
n = 0;
}
}
return 0;
}
温湿度数据通过中断处理显示到数码管中 (左边温度,右边湿度)
main.c
#include "key_it.h"
int main()
{
//初始化按键
key1_it_config();
key2_it_config();
key3_it_config();
while (1)
{
printf("do main...\n");
delay(1000);
}
}
spi.c
#include"spi.h"
void delay_us1(unsigned int us)
{
int i,

该博客围绕作业展开,作业要求实现数码管不同位显示不同数字,以及将温湿度数据通过中断处理显示到数码管(左温度右湿度)。展示了代码运行效果图,并列出了相关代码文件,最后还提及模拟面试。


最低0.47元/天 解锁文章
1345





