ADC&OLED综合应用

stm32f103ve应用开发,完成以下的功能。
【1】上电开机后,首选在OLED上显示“奋进”的图片,然后让LED1与LED2依次点亮,然后熄灭,进行灯光检测。灯光检测结束后,OLED切换至数据显示界面,分3行:第1行显示:“day day up! "第2行显示:“采样值:” ; 第3行显示:“电压值:”
【2】在主程序中,采用查询的方式,每隔0.3秒对ADC_INO通道的光敏传感器进行一次电压数据采集,并将采样到的12位数据换算成对应的实际电压值。LED1作为AD采样指示灯,每采样一次闪烁一下。                                                                                                                                    【3】每进行完一次光敏传感器的数据采样和电压换算后,将其结果更新到OLED显示屏中相应的位置。如果光敏传感器的电压值小于1.3V,则将LED2灯点亮,反之,将LED2灯关闭。
 

这里的查询方式即为阻塞式A/D转换。

OLED常用的函数有:

void OLED_Init(void);//初始化
void OLED_Clear(void);//清除上一次显示内容
void OLED_ShowChar(unsigned char x,unsigned char y,unsigned char chr);//显示单个字符
void OLED_ShowNum(unsigned char x,unsigned char y,unsigned long num,unsigned char len,unsigned char size);//显示数字
void OLED_ShowString(unsigned char x,unsigned char y, unsigned char *p); //显示字符串 
void OLED_Set_Pos(unsigned char x, unsigned char y);//设置显示位置
void OLED_ShowCHinese(unsigned char x,unsigned char y,unsigned char no);//显示汉字
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);//显示图片

汉字和图片的显示需要使用到字模转换软件,推荐“PCtoLCD2002”

在“模式”里选择转换图形还是汉字

 

 A51是汇编格式。

在进行OLED代码移植时,注意修改相应的芯片类型头文件,并修改对应引脚。

将生成的16进制代码分别存储到:

#include "XMF_OLED_BMP.h"//图片
#include "XMF_OLED_Font.h"//汉字

 

两个头文件里

main函数代码展示如下:

#include "main.h"
#include "adc.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "XMF_OLED_STM32Cube.h"
/* USER CODE END Includes */

/* USER CODE BEGIN PTD */
#define LED1_ON  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_SET);
#define LED1_OFF HAL_GPIO_WritePin(GPIOD,GPIO_PIN_3,GPIO_PIN_RESET);
#define LED2_ON  HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_SET);
#define LED2_OFF HAL_GPIO_WritePin(GPIOD,GPIO_PIN_4,GPIO_PIN_RESET);

extern unsigned char BMP1[];
uint16_t ADC_Value,ADC_Volt;
uint8_t str_buff[64];
/* USER CODE END PTD */

/* USER CODE BEGIN PFP */
void LED_Check()//开机闪烁
{
	LED1_ON;
	HAL_Delay(500);
	LED1_OFF;
    HAL_Delay(500);
	
	LED2_ON; 
	HAL_Delay(500);
	LED2_OFF;
    HAL_Delay(500);
}
void OLED_display_pic()//显示图片
{
	OLED_Clear();
	OLED_DrawBMP(0,0,128,8,BMP1);//3,4参数设置显示大小
}

void OLED_display_info()//显示第二页信息
{
	OLED_Clear();
	OLED_ShowString(6,0,(uint8_t *)"day day up!");
	OLED_ShowCHinese(0,3,0);//第三个参数对应"XMF_OLED_Font.h"头文件里16进制汉字顺序
	OLED_ShowCHinese(18,3,1);//每个汉字占16比特,这里为了美观给18
	OLED_ShowCHinese(36,3,2);
	OLED_ShowString(54,3,(uint8_t *)":");
	
	OLED_ShowCHinese(0,6,3);
	OLED_ShowCHinese(18,6,4);
	OLED_ShowCHinese(36,6,2);
	OLED_ShowString(54,6,(uint8_t *)":");
}

void OLED_display_dat()//数据显示
{
	sprintf((char *)str_buff,"%d",ADC_Value);
	OLED_ShowString(64,3,str_buff);
	
	sprintf((char *)str_buff,"%d.%d%dv",ADC_Volt/100,(ADC_Volt%100)/10,ADC_Volt%10);
	OLED_ShowString(64,6,str_buff);
}
void Get_ADC_Value()//获取ADC采样值计算电压值
{
	HAL_ADC_Start(&hadc1);
	if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
	{
		ADC_Value=HAL_ADC_GetValue(&hadc1);
		ADC_Volt=ADC_Value*330/4096;//单位式10mv
		OLED_display_dat();
	}
		if(ADC_Volt < 130)//任务③
		{
			LED2_ON;
		}
		else
			LED2_OFF;
}

/* USER CODE END PFP */

int main(void)
{

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();
 
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  /* USER CODE BEGIN 2 */
	OLED_Init(); 
	OLED_display_pic();
	LED_Check();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		LED1_ON;
		Get_ADC_Value();
		LED1_OFF; 
		HAL_Delay(300);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值