ARM1.2作业
实现数码管不同位显示不同的数字
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 PE14GPIOE->MODER &= (~(0x3 <<28));GPIOE->MODER |= (0x1 <<28);GPIOE->OTYPER &= (~(0x1 << 14));GPIOE->OSPEEDR &= (~(0X3 << 28));GPIOE->PUPDR &= (~(0X3 <<28));//MOSI PE13GPIOE->MODER &= (~(0x3 <<26));GPIOE->OSPEEDR &= (~(0x3 << 26));GPIOE->PUPDR &= (~(0x3 <<26));//MOSI PE12GPIOE->MODER &= (~(0x3 <<24));GPIOE->MODER |= (0x1 <<24);GPIOE->OTYPER &= (~(0x1 << 12));GPIOE->OSPEEDR &= (~(0X3 << 24));GPIOE->PUPDR &= (~(0X3 <<24));//MOSI PE11GPIOE->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;}

相关文章:
ARM1.2作业
实现数码管不同位显示不同的数字 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);}whi…...
【算法专题】递归算法
递归 递归1. 汉诺塔问题2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点5. Pow(x, n) --- 快速幂 递归 在解决⼀个规模为 n 的问题时,如果满足以下条件,我们可以使用递归来解决: 问题可以被划分为规模更小的子问题,并且…...
不停止业务的情况下优化 Elasticsearch Reindex
在使用 Elasticsearch 时,我们总有需要修改索引映射的时候,这时我们只能进行 _reindex。事实上,这是一个相当昂贵的操作,因为根据数据量和分片数量,完整复制一个索引可能需要几个小时。 花费的时间不是大问题,但更严重的是,它会影响生产环境的性能甚至功能。 相信大家…...
PB 按Excel动态创建对应字段
/* > Function: w_cwjk_xhyy.wf_dw_init >-------------------------------------------------------------------- > 描述: 按excel表格列名,创建对应字段,用于部分接口对应字段导出文件 >-------------------------------------------------------------------- …...
数据结构——红黑树 and B-树
红黑树 根据平衡条件第4、5两点 最短路径,都是黑色 最长路径,红黑相间 最长是最短的两倍 B-树...
Android中线程间的通信-Handler
Handler机制在Android中主要用于线程间的通信,特别是处理从子线程向主线程(UI线程)传递消息和更新界面。 Handler中的四个关键对象及其作用: Message: Message 是在线程间传递的数据载体,它包含了需要处理…...
Spring Boot Admin健康检查引起的Spring Boot服务假死
问题现象 最近在spring boot项目中引入了 spring-boot-starter-actuator 后,测试环境开始出现服务假死的现象, 且这个问题十分怪异,只在多个微服务中的简称A的这个服务中出现,其他服务都没有出现这个问题, 之所以说…...
java企业人事信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java Web企业人事信息管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境 为TOMCAT7.0,Myeclipse8.5开发,数据库为M…...
如何通过 useMemo 和 useCallback 提升你的 React 应用性能
背景 在 React 中,useMemo 和 useCallback 这两个 hook 是我们优化应用性能的有力工具。它们会返回 memoized 版本的值或函数,只在依赖项发生变化时才进行重新计算或定义。 Hook 介绍 useMemo useMemo 的作用是返回一个 memoized 值,它接…...
ArkTS - @Prop、@Link
一、作用 Prop 装饰器 和Link装饰器都是父组件向子组件传递参数,子组件接收父组件参数的时候用的,变量前边需要加上Prop或者Link装饰器即可。(跟前端vue中父组件向子组件传递参数类似) // 子组件 Component struct SonCom {Prop…...
Python中matplotlib库的使用1
1 matplotlib库简介 matplotlib是一个数学绘图库,可以将数据通过图形的方式显示出来,也就是数据可视化。 2 matplotlib库的安装 2.1 打开cmd窗口 点击键盘的“Win”“R”键,在弹出的“运行”对话框的“打开”栏中输入“cmd”,…...
位乘积计数-蓝桥
题目链接:1.位乘积计数 - 蓝桥云课 (lanqiao.cn) 解题思路:10的5次数量级暴力居然过了,看来测试样例很水,直接1遍历到n,再用一个循环判断每位数相乘乘机是否等于m即可。 下面是c代码: #include <iost…...
HCIA-Datacom题库(自己整理分类的)——OSPF协议判断
1.路由表中某条路由信息的Proto为OSPF则此路由的优先级一定为10。√ 2.如果网络管理员没有配置骨干区域,则路由器会自动创建骨干区域? 路由表中某条路由信息的Proto为OSPF,则此路由的优先级一定为10。 当两台OSPF路由器形成2-WAY邻居关系时࿰…...
【FPGA/verilog -入门学习16】fpga状态机实现
需求: 用两段式状态机设计序列码检测机。这个序列码检测机用于检索连续输入的 1bit 数据 (每个时钟周期输入 1bit),当检测到一串“101100”的输入数据时,产生一个时钟周期的 高脉冲指示信号 状态图 //实现状态机切…...
记chrome的hackbar无法post php://input的问题
尽管hackbar支持post请求体,但是当请求体里面没有等于号的时候,无法post出去,这样如果需要使用php://input绕过waf的时候就没法做。 在开发人员工具的网络里面可以看到不使用等于号的情况下没有荷载。 之后在这里看到了解决方法,…...
相机解析驱动小记
用过了几款相机,对使用相机也有了一点心得,在此记录。 当你得到一款相机,你需要做的: 第一件事:在datasheet中阅读配置单,知道怎么配置、配置完输出来是什么。 配置输出尺寸;传输模式…...
EasyExcel判断导入时是否符合给定模板
问题描述 在做系统的导入导出模块时需要在导入时判断用户导入的表格是否符合给定的模板,该系统导入导出使用的是EasyExcel,因此在实现该功能时是基于EasyExcel的 解决方案 创建Spring Boot项目,并添加如下依赖 <dependency><group…...
BDD - Python Behave Retry 机制
BDD - Python Behave Retry 机制 引言Behave RetryBehave Retry 应用feature 文件创建 step 文件Retry运行 Behave 并生成 rerun 文件重新运行失败的场景 引言 在日常运行测试用例,有时因为环境不稳定造成一些测试用例跑失败了,如果能将这些失败的测试用…...
链 表
3_1 删除链表中的节点 Answer-将被删节点下一个val复制到待删除节点,然后将待删节点直接连接到下下一个节点即可。 学到: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) …...
一个可以用于生产环境得PHP上传函数
上传表单 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>文件上传</title> </head> <body><h1>选择要上传的文件</h1><!-- 定义一个包含文件输入字段的表单 --…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
