STM32驱动OLED显示菜单功能(附带oled硬件iic驱动代码)

news2024/11/16 8:30:28

 

 while循环里面就写菜单退出 菜单进入


	static int flag=1;     //记录你的选择
	//if(return_FLAG==1)return_FLAG=0;
	OLED_GotoXY(10,0);
	OLED_Puts("1 LED_TEST",&Font_11x18,1);
	OLED_GotoXY(10,20);
	OLED_Puts("2 USART_TEST",&Font_11x18,1);
	OLED_GotoXY(10,40);
	OLED_Puts("3 ADC_TEST",&Font_11x18,1);
	OLED_Refresh();
	while(1)
	{
		
		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0)       //***下一项***
		{		
			HAL_Delay(10);	  //防抖
			while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0); //按下后不松手,则停在这
			HAL_Delay(10);	  //防抖
			flag++;
			if(flag==4) flag=1;			
		}
		
		if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==0)       //***确认***
		{
			HAL_Delay(10);	  //防抖
			while(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==0); //按下后不松手,则停在这
			HAL_Delay(10);	  //防抖			
			OLED_Clear();   //清屏
			return(flag);   //返回你的选择
		}
		
		switch(flag)      //光标移动
		{
			case 1:
			{
				OLED_GotoXY(120,5);
				OLED_Puts("*",&Font_7x10,1);
				OLED_GotoXY(120,25);
				OLED_Puts(" ",&Font_7x10,1);
				OLED_GotoXY(120,45);
				OLED_Puts(" ",&Font_7x10,1);
				OLED_Refresh();
				
			}break;
			case 2:
			{
				OLED_GotoXY(120,5);
				OLED_Puts(" ",&Font_7x10,1);
				OLED_GotoXY(120,25);
				OLED_Puts("*",&Font_7x10,1);
				OLED_GotoXY(120,45);
				OLED_Puts("",&Font_7x10,1);
				OLED_Refresh();
			}break;
			case 3:
			{
				OLED_GotoXY(120,5);
				OLED_Puts(" ",&Font_7x10,1);
				OLED_GotoXY(120,25);
				OLED_Puts(" ",&Font_7x10,1);
				OLED_GotoXY(120,45);
				OLED_Puts("*",&Font_7x10,1);	
			OLED_Refresh();				
			}break;
		}		
		
	}

	
} 
int menu2_LED(void)
{
	
	
	OLED_Clear();
	OLED_GotoXY(10,20);
	OLED_Puts("!LED_G_ON!",&Font_11x18,1);
	OLED_Refresh();
	while(1)
	{
		if(!return_FLAG)
		{
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,RESET);
		HAL_Delay(1000);
		HAL_GPIO_WritePin(LED_GREEN_GPIO_Port,LED_GREEN_Pin,SET);
		HAL_Delay(1000);
		}
		else
		{
			return_FLAG=0;
			return 0;
		}
	}
}
int menu2_USART(void)
{
	OLED_Clear();
	int flag_T=1; //choose to fasong flag
	uint8_t rx_buf[3];
	OLED_GotoXY(5,0);
	OLED_Puts("A",&Font_11x18,1);
	OLED_GotoXY(5,20);
	OLED_Puts("B",&Font_11x18,1);
	OLED_GotoXY(5,40);
	OLED_Puts("C",&Font_11x18,1);
	OLED_GotoXY(50,25);
	OLED_Puts("recive:",&Font_7x10,1);
	OLED_Refresh();
	while(1)
	{
		
		if(!return_FLAG)
			{	
			HAL_UART_Receive_DMA(&huart1,(uint8_t*)rx_buf,3);
			OLED_GotoXY(100,25);
			OLED_Puts(rx_buf,&Font_7x10,1);
		
			if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0)       //***下一项***
			{		
				HAL_Delay(10);	  //防抖
				while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==0); //按下后不松手,则停在这
				HAL_Delay(10);	  //防抖
				flag_T++;
				if(flag_T==4) flag_T=1;			
			}
		
			if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==0)       //***确认***
			{
				HAL_Delay(10);	  //防抖
				while(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==0); //按下后不松手,则停在这
				HAL_Delay(10);	  //防抖			
				if(flag_T==1)printfl("A\r\n");
				if(flag_T==2)printfl("B\r\n");
				if(flag_T==3)printfl("C\r\n");
			}
			
		
		
		
				switch(flag_T)      //光标移动
				{
					case 1:
					{	
						OLED_GotoXY(20,5);
						OLED_Puts("*",&Font_7x10,1);
						OLED_GotoXY(20,25);
						OLED_Puts(" ",&Font_7x10,1);
						OLED_GotoXY(20,45);
						OLED_Puts(" ",&Font_7x10,1);
						OLED_Refresh();
					
					}break;
					case 2:
					{
						OLED_GotoXY(20,5);
						OLED_Puts(" ",&Font_7x10,1);
						OLED_GotoXY(20,25);
						OLED_Puts("*",&Font_7x10,1);
						OLED_GotoXY(20,45);
						OLED_Puts("",&Font_7x10,1);
						OLED_Refresh();
					}break;
					case 3:
					{
						OLED_GotoXY(20,5);
						OLED_Puts(" ",&Font_7x10,1);
						OLED_GotoXY(20,25);
						OLED_Puts(" ",&Font_7x10,1);
						OLED_GotoXY(20,45);
						OLED_Puts("*",&Font_7x10,1);	
					OLED_Refresh();				
					}break;
				}	
		
			}
			
			else
			{
				HAL_UART_DMAStop(&huart1);
				OLED_Clear();
				HAL_Delay(150);//mo ming qi miao de yan shi, deng dai geng xin flag
				return_FLAG=0;
				return 1;
			
			} 
	
	}

}

这里是选择发送ABC 和接受字符

退出回调函数:


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin==GPIO_PIN_13)
	{
		return_FLAG=1;
		
	}



}

任务三是adc采样 双通道采样 

int menu2_ADC(void)
{
	
	OLED_Clear();
	OLED_GotoXY(5,0);
	OLED_Puts("X:",&Font_16x26,1);
	OLED_GotoXY(5,30);
	OLED_Puts("Y:",&Font_16x26,1);
	OLED_Refresh();
	uint16_t adc_buf[2];
	HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc_buf,2);
	
	while(1)
	{
		if(!return_FLAG)
		{
			uint8_t Kp_txt1[10];
			sprintf(Kp_txt1,"%.4fV",((float)adc_buf[0]*3.3)/4095);
			OLED_GotoXY(50,5);
			OLED_Puts(Kp_txt1,&Font_11x18,1);
			uint8_t Kp_txt2[10];
			sprintf(Kp_txt2,"%.4fV",((float)adc_buf[1]*3.3)/4095);
			OLED_GotoXY(50,35);
			OLED_Puts(Kp_txt2,&Font_11x18,1);
			OLED_Refresh();
			HAL_Delay(200);
		}
		
		else
		{
			HAL_ADC_Stop_DMA(&hadc1);
			OLED_Clear();
			return_FLAG=0;
			return 0;
		}
		
	}
}

 利用dma采样双通道

HAL_ADC_Start_DMA(&hadc1,(uint32_t*)adc_buf,2);

将32位浮点数转换为8位可展示 

 

 

			uint8_t Kp_txt1[10];
			sprintf(Kp_txt1,"%.4fV",((float)adc_buf[0]*3.3)/4095);

这里就是转换了

下面是oled.c和oled.h文件了 在下章给出

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

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

相关文章

传输请求时,如若选择包含其他TR,请留意……

以下是纯顾问群~微信群:SAP干货铺,请联系本人微信 sapliumeng。QQ群 :SAP干货铺, 群号:775662808所有群管理严格,严格禁止一切外来链接、招聘、广告等垃圾信息! 这是之前頔哥在群里说过的一个知识点&#…

谷歌浏览器插件篇之console Importer

前言 作为一名前端开发者,相信在开发实践中,使用过诸多第三方库。譬如:lodash、moment、dayjs、antd等数不胜数。 然每每使用,经起繁琐,便令人有反抗之意。其步骤如下:首先要在搭建好的项目里&#xff0c…

Lnton羚通如何使用OpenCV-Python进行轮廓汇总?

在图像处理和计算机视觉领域,轮廓(Contour)是指图像中连续的边缘部分形成的曲线,可以看作是物体的外边界或者是物体内部区域的边界。轮廓可以用于对象检测、图像分割、形状匹配等任务。轮廓可以通过在二值化图像中找到图像中白色&…

JDK动态代理与CGLIB动态代理

一、代理模式概述 1.1.生活中代理案例 房屋中介代理 客户手里面没有房源信息,找一个中介 商品代购 这些代购者可以去拿到比较低成本的商品,拥有自己的渠道 1.2.为什么要使用代理 对于消费者而言,可以减少成本,只需要关心自己…

深入理解Linux内核--页高速缓存

页高速缓存 页高速缓存(page cache)是Linux内核所使用的主要磁盘高速缓存。 在绝大多数情况下,内核在读写磁盘时都引用页高速缓存。 新页被追加到页高速缓存以满足用户态进程的读请求。 如果页不在高速缓存中,新页就被加到高速缓存中,然后用…

无涯教程-TensorFlow - Keras

Keras易于学习的高级Python库,可在TensorFlow框架上运行,它的重点是理解深度学习技术,如为神经网络创建层,以维护形状和数学细节的概念。框架的创建可以分为以下两种类型- 顺序API功能API 无涯教程将使用Jupyter Notebook执行和…

ArduPilot开源飞控之飞行模式

ArduPilot开源飞控之飞行模式 1. 源由2. 飞行模式-已实现3. 飞行模式-设计3.1 模式初始化(init)3.2 模式退出(exit)3.3 模式任务(run)3.4 模式切换场景3.4.1 上电初始化3.4.2 EKF FAILSAFE触发3.4.3 do_failsafe_action FAILSAFE触发3.4.4 AP_Avoidance_Copter触发3.4.5 Crash触…

03_缓存双写一致性

03——缓存双写一致性 一、缓存双写一致性 如果redis中有数据,需要和数据库中的值相同如果redis中无数据,数据库中的值要是最新值,且准备回写redis 缓存按照操作来分,可以分为两种: 只读缓存 读写缓存 同步直写操作…

《游戏编程模式》学习笔记(七)状态模式 State Pattern

状态模式的定义 允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。 举个例子 在书的示例里要求你写一个人物控制器,实现跳跃功能 直觉上来说,我们代码会这么写: void Heroine::handleInput(Input input…

js简介以及在html中的2种使用方式(hello world)

简介 javascript :是一个跨平台的脚本语言;是一种轻量级的编程语言。 JavaScript 是 Web 的编程语言。所有现代的 HTML 页面都使用 JavaScript。 HTML: 结构 css: 表现 JS: 行为 HTMLCSS 只能称之为静态网页&#xff0…

ajax-axios-url-form-serialize 插件

AJAX AJAX 概念 1.什么是 AJAX ? mdn 使用浏览器的 XMLHttpRequest 对象 与服务器通信 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端,前端拿到数据数…

面试百问:Redis常见的故障以及发生场景

作为一个测试同学,被测系统架构中有使用到redis吗?对redis常见的故障有了解吗?又是如何进行测试的呢? 针对常见的redis面试问题,怎样才算一个高质量的回答呢,回答思路一般包括 问题的类型是什么&#xff…

Qt应用开发(基础篇)——高级纯文本窗口 QPlainTextEdit

一、前言 QPlainTextEdit类继承于QAbstractScrollArea,QAbstractScrollArea继承于QFrame,是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类https://blog.csdn.net/u014491932/article/details/132245486?spm1001.2014.3001.5501框架类QFramehttps://blo…

使用IDM下载视频出现“由于法律原因,IDM无法下载...

一、问题描述 由于法律原因,IDM无法下载..,如图: 二、原因分析 下载该IDM抓取的M3U8文件,查看其中的内容发现 : #EXT-X-KEY 字段已经写明了加密方式是AES-128,包含一个URI和IV值 #EXTM3U #EXT-X-VERSION:3 #EXT-X-TARGETDURATION:8 #EXT-X-MEDIA-SEQUENCE:0 #EXT-X-KEY:…

【机器学习】处理不平衡的数据集

一、介绍 假设您在一家给定的公司工作,并要求您创建一个模型,该模型根据您可以使用的各种测量来预测产品是否有缺陷。您决定使用自己喜欢的分类器,根据数据对其进行训练,瞧:您将获得96.2%的准确率! …

分析了下内网穿透技术,都在这了

内网穿透是一种将位于内网中的计算机或设备暴露给公网的技术,以便可以从外部网络访问这些设备。这在许多场景中非常有用,例如远程访问内网中的服务器、搭建本地 Web 服务器、共享文件等。 目前内网穿透一般都以下五种方案 目录 方案一:使用…

Cesium加载ArcGIS Server4490且orgin -400 400的切片服务

Cesium在使用加载Cesium.ArcGisMapServerImageryProvider加载切片服务时,默认只支持wgs84的4326坐标系,不支持CGCS2000的4490坐标系。 如果是ArcGIS发布的4490坐标系的切片服务,如果原点在orgin X: -180.0Y: 90.0的情况下,我们可…

若依的使用(token补充、HTTPS(网络安全)、分页前后端配置)

本文章转载于公众号:王清江唷,仅用于学习和讨论,如有侵权请联系 QQ交流群:298405437 本人QQ:4206359 具体视频地址:8 跑后端_哔哩哔哩_bilibili 1、HTTP? 曾经我们在讲JWT的时候,当时JWT需要配合https…

企业信息化过程----应用管理平台的构建过程

1.信息化的概念 信息化是一个过程,与工业化、现代化一样,是一个动态变化的过程。信息化已现代通信,网络、数据库技术为基础,将所有研究对象各个要素汇总至数据库,供特定人群生活、工作、学习、辅助决策等,…

前端基础(Vue的模块化开发)

目录 前言 响应式基础 ref reactive 学习成果展示 Vue项目搭建 总结 前言 前面学习了前端HMTL、CSS样式、JavaScript以及Vue框架的简单适用,接下来运用前面的基础继续学习Vue,运用前端模块化编程的思想。 响应式基础 ref reactive 关于ref和react…