嵌入式ARM作业5

作业要求:实现数码管不同位显示不同的数字

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));
    // MISO    PE13
    GPIOE->MODER &= (~(0x3 << 26));
    GPIOE->OSPEEDR &= (~(0x3 << 26));
    GPIOE->PUPDR &= (~(0x3 << 26));
    // SCK     PE12 
    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));
    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();   // SCK拉低
        delay_us1(10);
        SCK_OUTPUT_H();   // SCK拉高
        delay_us1(10);
    }
}

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);
 
 
#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 < 1000; j++);

}   

 

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

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

int num2[4] = {0x80,0x40,0x20,0x10};

int main(void)

{

    unsigned char i;

    SPI_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(10);

        }

 

    }

 

    return 0;

}

将温湿度数据显示到数码管

main.c

#include "spi.h"

#include"si7006.h"



void delay_ms(int ms)

{

    int i,j;

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

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

} 



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;

 

}
相关推荐
TeYiToKu11 小时前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
w微信150135078121 天前
小华一级 代理商 HC32F005C6PA-TSSOP20 HC32F005系列
c语言·arm开发·单片机·嵌入式硬件
憧憬一下1 天前
Pinctrl子系统中Pincontroller和client驱动程序的编写
arm开发·嵌入式·c/c++·linux驱动开发
上海知从科技2 天前
知从科技受邀出席ARM日产技术日
arm开发·科技
极客小张3 天前
基于STM32的智能温室环境监测与控制系统设计(代码示例)
c语言·arm开发·stm32·单片机·嵌入式硬件·物联网·毕业设计
TeYiToKu3 天前
笔记整理—linux驱动开发部分(6)platform平台总线
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件
飞腾开发者3 天前
飞腾平台Arm ComputeLibrary编译安装指南
linux·服务器·arm开发·后端·性能优化
CodingCos4 天前
【ARM Linux 系统稳定性分析入门及渐进 1.1 -- Crash 工具功能概述】
linux·arm开发·crash tools·linux crash·crash 工具使用
@haihi5 天前
IIC和SPI的区别和相同之处
arm开发·stm32·mcu
@@庆5 天前
FreeRTOS 数据传输方法(环形buffer,队列的本质)队列实验—多设备玩游戏
arm开发·stm32·单片机·嵌入式硬件·freertos