arm学习stm32之spi总线数码管倒计时,裸机开发,soc

news2024/11/22 19:56:38

由于时间没有用时间计时器操作,有些误差,后续有空会翻新计时器版本

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++);
}
int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
int main()
{
	int i,j,k,l,m;
	SPI_init();
	//先发送位
	//在发送段
	while(1)
	{
		/*
		for(i=0;i<10;i++){
			SPI_write(0xF0);//发送位
			SPI_write(num[i]);//发送段
			NSS_OUTPUT_L();
			delay_ms(1);
			NSS_OUTPUT_H();
			delay_ms(1000);
		}*/
		for(i=5;i>=0;i--){
		for(j=9;j>=0;j--){
		for(k=5;k>=0;k--){
		for(l=9;l>=0;l--){
			for(m=200;m>=0;m--){
			//显示分钟十位
			SPI_write(0x80);
			SPI_write(num[i]);
			NSS_OUTPUT_L();
			delay_ms(1);
			NSS_OUTPUT_H();
			//delay_ms(1000);
			//显示分钟个位
				SPI_write(0x40);
				SPI_write(num[j]);
				NSS_OUTPUT_L();
				delay_ms(1);
				NSS_OUTPUT_H();
			//	delay_ms(1000);
				//显示秒钟十位
					SPI_write(0x20);
					SPI_write(num[k]);
					NSS_OUTPUT_L();
					delay_ms(1);
					NSS_OUTPUT_H();
				//	delay_ms(1000);
					//显示秒钟个位		
						SPI_write(0x10);
						SPI_write(num[l]);
						NSS_OUTPUT_L();
						delay_ms(1);
						NSS_OUTPUT_H();
						//delay_ms(1000);
					}
				}
				}
			}
		}
	}
	return 0;
}

spi.c

#include "spi.h"
/* SPI4_NSS 	---->   PE11
 * SPI4_SCK     ---->   PE12
 * SPI4_MOSI    ---->   PE14
 * SPI4_MISO    ---->   PE13
 * */

/* 数码管的编码, 先发送低位,在发送高位
 * A B C D E F G DP
 * 1 1 1 1 1 1 0 0    0xFC   0
 * 0 1 1 0 0 0 0 0    0x60   1
 * 1 1 0 1 1 0 1 0    0xDA   2
 * 1 1 1 1 0 0 1 0    0xF2   3
 * 0 1 1 0 0 1 1 0    0x66   4
 * 1 0 1 1 0 1 1 0    0xB6   5 
 * 1 0 1 1 1 1 1 0    0xBE   6
 * 1 1 1 0 0 0 0 0    0xE0   7
 * 1 1 1 1 1 1 1 0    0xFE   8
 * 1 1 1 1 0 1 1 0    0xF6   9
 * */
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++){
		//先发送低位再发送高位	
		//	判断条件写1写0
		if(dat & 0x1){
			MOSI_OUTPUT_H();
		}else{
			MOSI_OUTPUT_L();
		}
		dat >>=1;
		//	上升沿
		SCK_OUTPUT_L();
		delay_us1(10);
		SCK_OUTPUT_H();
		delay_us1(10);
	}
}

spi.h

#ifndef __SPI_H__
#define __SPI_H__

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pdf怎么进行分割,三个实用的方法!

许多朋友在使用PDF文件时&#xff0c;常常遇到需要拆分文件的问题。那么该如何进行操作呢&#xff1f;实际上&#xff0c;我们通常所说的拆分也可以理解为分割&#xff0c;即将一个PDF文件分成两个或多个部分。现在&#xff0c;我将推荐三款工具&#xff0c;通过记灵在线工具&a…

漏洞复现 || eGroupWare spellchecker.php 远程命令执行漏洞

0x01 阅读须知 我爱林的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用…

Java-通过IP获取真实地址

文章目录 前言功能实现测试 前言 最近写了一个日志系统&#xff0c;需要通过访问的 IP 地址来获取真实的地址&#xff0c;并且存到数据库中&#xff0c;我也是在网上看了一些文章&#xff0c;遂即整理了一下供大家参考。 功能实现 这个是获取正确 IP 地址的方法&#xff0c;可…

chinese_lite ocr使用教程

一、简介 超轻量级中文ocr&#xff0c;支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) crnn(2.5M) anglenet(378KB)) 总模型仅4.7M 二、环境 python3.6linux/macos/windows 三、项目地址 https://github.com/DayBreak-u/chineseocr_lite 下载项目后, 执行 pip…

服务器上的Notebook在本地运行

3090TI的服务器&#xff0c;用的是Ubuntu系统&#xff0c;在使用的时候&#xff0c;如何让服务器资源在本地的JupyterNotebook运行呢&#xff1f; 目录 一、在3090TI服务器上指定一个特定的访问端口 二、本地端口配置 三、本地JupyterNotebook访问服务器 一、在3090TI服务器…

数据结构(Map、Set)

文章目录 一、搜索树1.1 概念1.2 操作1.3 与java类集的关系 二、Map 和 Set2.1 概述2.2 Map2.3 Set 三、哈希表3.1 概念3.2 冲突3.3 其他 一、搜索树 1.1 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为…

字符串函数和字符函数

文章目录 前言strlen()实现strlen&#xff08;&#xff09; strcpy&#xff08;&#xff09;模拟实现 strcat()strcat()模拟实现 strcmp()模拟实现strcmp() strstr()模拟实现strstr() strncpy(),strncmp(),strncat()strtok()memcpy()memcpy()的模拟实现 memmove()memmove()的模…

ELK + Filebeat 部署及 logstash 的四大插件(grok、date、mutate、multiline)

目录 FilebeatFilebeat 结合 logstash 带来好处&#xff1a;FluentdELK Filebeat 部署1&#xff0e;安装 Filebeat & Httpd2&#xff0e;设置 filebeat 的主配置文件4&#xff0e;在 Logstash 组件所在节点上新建一个 Logstash 配置文件5&#xff0e;浏览器访问 http://19…

凯迪正大数显电动调压控制台

数显电动调压控制台使用方法 1、核对试验变压器&#xff0c;测量绕阻额定输出电压&#xff0c;使之与操作箱&#xff08;台&#xff09;相吻合。 2、按接线示意图接好试验变压器与操作箱&#xff08;台&#xff09;及感应调压器之间的联线。 3、接通电源&#xff0c;通电源指…

el-select 右侧icon样式问题

el-select 右侧icon样式问题 样式问题如图&#xff1a; 解决方法&#xff1a; el-input__suffix {display: flex;align-items: center;justify-content: center; }注意&#xff1a;样式需写在没有scoped的style标签里

在VSCODE编辑器是用ctrl+c和ctrl+s(复制粘贴)失效怎么办

有时我们在开发过程中&#xff0c;由于使用vsccode太长时间导致复制ctrlc和ctrls会失效&#xff0c;之前我的处理方式是重启浏览器&#xff0c;但有时候这样太耗时间了&#xff0c;但发现一个方法可以解决&#xff0c;就是刷新下编辑器的timeline就行&#xff0c;如下图&#x…

快速构建一个 GitLab + Jenkins + Harbor 的云原生 DevOps 环境

今天我们要搭建一条怎样的工具链呢&#xff1f;且看效果图&#xff1a; GitLab Jenkins Harbor Toolchain Workflow 首先我们需要完成 GitLab、Jenkins 和 Harbor 三个工具的部署&#xff1b; 接着我们需要在 GitLab 上创建一个代码库&#xff0c;并且在 Jenkins 上创建相应…

若依系统学习笔记记录1

下载后的文件列表 先按照nocos. Nacos: 概览 欢迎来到 Nacos 的世界&#xff01; Nacos 致力于帮助您发现、配置和管理微服务Nacos: 概览 欢迎来到 Nacos 的世界&#xff01; Nacos 致力于帮助您发现、配置和管理微服务 cd nacos/ mvn命令如果是idea,需要用Ctrlshiftenter来执…

【软件测试】MySQL数据库场景问题+解决方案

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 问题1&#xff1a…

2023年测试岗,自动化测试如何学?如何卷出测试圈?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 怎么学习自动化测…

初识FreeRTOS

一、FreeRTOS 介绍 什么是 FreeRTOS &#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;Fre…

STM32 Proteus仿真LCD12864火灾检测烟雾火焰温度报警器MQ2 -0064

STM32 Proteus仿真LCD12864火灾检测烟雾火焰温度报警器MQ2 -0064 Proteus仿真小实验&#xff1a; STM32 Proteus仿真LCD12864火灾检测烟雾火焰温度报警器MQ2 -0064 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD12864 液晶显示DS18B20 温度传感器多个按键电位…

阿里云配置端口安全组策略

文章目录 为何配置安全组安全组设置安全组应用到实例中 为何配置安全组 nginx正确配置了83端口&#xff0c;却无法访问资源&#xff0c;报502错误&#xff0c;这大概就是服务器的安全策略原因 安全组设置 安全组配置地址 安全组应用到实例中 配置地址

pandas 各种存储格式速度对比:CSV、hdf5、SQL、pickle、feather、parquet

前言&#xff1a;目前我在做一个callback函数&#xff0c;需要将数据重复的读取、写入&#xff0c;再供使用&#xff0c;并且数据量比较大&#xff0c;所以需要使用一个读写速度快的存储方式&#xff0c;不太考虑占用的磁盘空间 直接看结果 csv的文件存储&#xff0c;在读取的…

Java虚拟机(JVM)

Java虚拟机&#xff08;JVM&#xff09; 类加载 类加载 Java类加载的过程可以分为以下几个步骤&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;类加载的第一步是将类的字节码文件加载到内存中。 通过类的全名&#xff0c;全限定名&#xff08;包括包名和类名&…