资讯动态

ADC读取XY二轴操纵杆数据通过I2C_GPIO模拟 控制0.96寸OLED显示

发布时间:2026/10/27 22:40:06 来源:尧图企业网站定制
一、STM32 ADC介绍STM32F103具有三个ADC12位多达18个复用通道16个外部源2个内部源信号以下管脚决定ADC输入电压一般接GND和3.3V, 故ADC输入电压为0~3.3V如图具有三种中断触发类型如“转换结束中断”。规则通道数据寄存器只有一个16bit,这对应着16个通道1对16故规则通道数据寄存器是复用的。ADC管脚资源ADCCLK最大为14MHz(我们一般配置为12MHz)ADC总转换时间计算二、STM32F1 ADC配置步骤库文件依赖stm32f10x_adc.c stm32f10x_adc.h1使能GPIO端口时钟和ADC硬件IP时钟2配置ADCCLK(设置ADC时钟分频因子)如使用72MHz时钟经过6分频3ADC初始化1.ADC工作模式2.ADC扫描模式3.配置ADC单次转换or连续转换4.ADC转换触发信号选择5.数据寄存器对齐格式选择6.ADC采集通道数4ADC_Cmd 使能ADC5ADC校准6读取ADC转换值1.规则序列通道设置采样周期配置2.使用软件触发ADC转换3.获取ADC转换结果数据获取AD转换状态信息三、工程实现硬件使用ADC3,选择PF6、PF7作为两路ADC输入:ADC3_CH4 – PF6 – VRXADC3_CH5 – PF7 – VRYXY二轴操纵杆电源接3.3V软件新建文件夹及文件将C文件添加到工程组引入头文件路径。添加库文件到工程组。adc.h#ifndef __ADC_H #define __ADC_H #include system.h void ADC3_CH4_CH5_Init(void); u16 Get_ADC_Value(u8 ch, u8 times); #endifadc.c#include adc.h #include SysTick.h //需要使用延时函数 void ADC3_CH4_CH5_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //使能端口时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); //使能ADC3端口时钟 GPIO_InitStructure.GPIO_Pin GPIO_Pin_6|GPIO_Pin_7; //PF6 -- CH4;PF7 -- CH5 GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; //配置为模拟输入 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOF, GPIO_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div6); //APB2总线时钟6分频 72M/6 12MHz ADC_InitStructure.ADC_Mode ADC_Mode_Independent; //ADC1 和 ADC2 工作在独立模式(这里先这么写) ADC_InitStructure.ADC_ScanConvMode DISABLE; //非扫描模式(多通道也配置为DISABLE ) ADC_InitStructure.ADC_ContinuousConvMode DISABLE; //关闭连续转换 ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; //12位数据使用右对齐方式 ADC_InitStructure.ADC_NbrOfChannel 1; //这里多通道也配置为1 ADC_Init(ADC3, ADC_InitStructure); ADC_Cmd(ADC3, ENABLE); //使能ADC ADC_ResetCalibration(ADC3); //重置指定的ADC的校准寄存器 while(ADC_GetResetCalibrationStatus(ADC3)); //获取ADC重置校准寄存器的状态直到为RESET状态后退出 ADC_StartCalibration(ADC3); //开始指定ADC的校准状态 while(ADC_GetCalibrationStatus(ADC3)); //获取指定ADC的校准程序直到为RESET状态后退出 ADC_SoftwareStartConvCmd(ADC3, ENABLE); //使能或者失能指定的 ADC 的软件转换启动功能 } /******************************************************************************* * 函 数 名 : Get_ADC_Value * 函数功能 : 获取通道ch的转换值取times次,然后平均 * 输 入 : ch:通道编号 times:获取次数 * 输 出 : 通道ch的times次转换结果平均值 *******************************************************************************/ u16 Get_ADC_Value(u8 ch, u8 times) { u32 temp_val 0; u8 t 0; //设置指定 ADC 的规则组通道设置它们的转化顺序和采样时间 //ADC时钟为12MHz,总转换时间需要周期数 239.5个周期 12.5个周期 252个周期 1/12000000s * 252 1/12us * 252 21us(总转换时间) //ADC3,ADC通道,239.5个周期,提高采样时间可以提高精确度 ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_239Cycles5); //rank 都配置为1 for(t 0; t times; t) { ADC_SoftwareStartConvCmd(ADC3, ENABLE); //使能指定的ADC3的软件转换启动功能 while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC)); //等待转换结束 temp_val ADC_GetConversionValue(ADC3); //delay_ms(5); // 如果对转换效率要求较高这里延时可以去掉 delay_ms(1); } return temp_val / times; }oled.h#ifndef __OLED_H #define __OLED_H #include system.h #include stdlib.h /* OLED管脚修改仅仅需要修改如下即可 */ /* PB6 PB7验证是正常的 */ #define OLED_RCC_CLK_ENABLE RCC_APB2Periph_GPIOB //使能B端口时钟 #define OLED_PIN_PROT GPIOB #define OLED_SCL_PIN GPIO_Pin_6 #define OLED_SDA_PIN GPIO_Pin_7 /* 验证PF6 PF7 */ //#define OLED_RCC_CLK_ENABLE RCC_APB2Periph_GPIOF //使能F端口时钟 //#define OLED_PIN_PROT GPIOF //#define OLED_SCL_PIN GPIO_Pin_6 //SCL Pin //#define OLED_SDA_PIN GPIO_Pin_7 //SDA Pin /**************************************/ #define OLED_SCL_Clr() GPIO_ResetBits(OLED_PIN_PROT,OLED_SCL_PIN) //SCL #define OLED_SCL_Set() GPIO_SetBits(OLED_PIN_PROT,OLED_SCL_PIN) #define OLED_SDA_Clr() GPIO_ResetBits(OLED_PIN_PROT,OLED_SDA_PIN) //SDA #define OLED_SDA_Set() GPIO_SetBits(OLED_PIN_PROT,OLED_SDA_PIN) #define OLED_CMD 0 //写命令 #define OLED_DATA 1 //写数据 void OLED_ClearPoint(u8 x,u8 y); void OLED_ColorTurn(u8 i); void OLED_DisplayTurn(u8 i); void I2C_Start(void); void I2C_Stop(void); void I2C_WaitAck(void); void Send_Byte(u8 dat); void OLED_WR_Byte(u8 dat,u8 mode); void OLED_DisPlay_On(void); void OLED_DisPlay_Off(void); void OLED_Refresh(void); void OLED_Clear(void); void OLED_DrawPoint(u8 x,u8 y,u8 t); void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode); void OLED_DrawCircle(u8 x,u8 y,u8 r); void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode); void OLED_ShowChar6x8(u8 x,u8 y,u8 chr,u8 mode); void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode); void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode); void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode); void OLED_ScrollDisplay(u8 loop_num, u8 num,u8 space,u8 mode); void OLED_ScrollDisplayLoop(u8 num,u8 space,u8 mode); void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode); void OLED_Init(void); void OLED_ShowFloat(u8 x, u8 y, float num, u8 len, u8 point, u8 size, u8 mode); #endifoled.c#include stdlib.h #include oled.h #include oledfont.h //包含了需要使用的字库 u8 OLED_GRAM[144][8]; //延时 void IIC_delay(void) { u8 t3; while(t--); } //OLED的初始化 void OLED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(OLED_RCC_CLK_ENABLE, ENABLE); GPIO_InitStructure.GPIO_Pin OLED_SCL_PIN|OLED_SDA_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD; //推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; //速度50MHz GPIO_Init(OLED_PIN_PROT, GPIO_InitStructure); GPIO_SetBits(OLED_PIN_PROT, OLED_SCL_PIN|OLED_SDA_PIN); //I2C总线空闲状态SCL、SDA均处于高电平 OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel OLED_WR_Byte(0x00,OLED_CMD);//---set low column address OLED_WR_Byte(0x10,OLED_CMD);//---set high column address OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F) OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0左右反置 0xa1正常 OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0上下反置 0xc8正常 OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64) OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F) OLED_WR_Byte(0x00,OLED_CMD);//-not offset OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks Discharge as 1 Clock OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh OLED_WR_Byte(0x30,OLED_CMD);//Set VCOM Deselect Level OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02) OLED_WR_Byte(0x02,OLED_CMD);// OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable OLED_Clear(); OLED_WR_Byte(0xAF,OLED_CMD); } //反显函数 void OLED_ColorTurn(u8 i) { if(i0) { OLED_WR_Byte(0xA6,OLED_CMD); //正常显示 } if(i1) { OLED_WR_Byte(0xA7,OLED_CMD); //反色显示 } } //屏幕旋转180度 void OLED_DisplayTurn(u8 i) { if(i0) { OLED_WR_Byte(0xC8,OLED_CMD); //正常显示 OLED_WR_Byte(0xA1,OLED_CMD); } if(i1) { OLED_WR_Byte(0xC0,OLED_CMD); //反转显示 OLED_WR_Byte(0xA0,OLED_CMD); } } //起始信号 void I2C_Start(void) { OLED_SDA_Set(); OLED_SCL_Set(); IIC_delay(); OLED_SDA_Clr(); IIC_delay(); OLED_SCL_Clr(); IIC_delay(); } //结束信号 void I2C_Stop(void) { OLED_SDA_Clr(); OLED_SCL_Set(); IIC_delay(); OLED_SDA_Set(); } //等待信号响应 void I2C_WaitAck(void) //测数据信号的电平 { OLED_SDA_Set(); IIC_delay(); OLED_SCL_Set(); IIC_delay(); OLED_SCL_Clr(); IIC_delay(); } //写入一个字节 void Send_Byte(u8 dat) { u8 i; for(i0;i8;i) { if(dat0x80) //将dat的8位从最高位依次写入 { OLED_SDA_Set(); } else { OLED_SDA_Clr(); } IIC_delay(); OLED_SCL_Set(); IIC_delay(); OLED_SCL_Clr(); //将时钟信号设置为低电平 dat1; } } //发送一个字节 //mode:数据/命令标志 0,表示命令;1,表示数据; void OLED_WR_Byte(u8 dat,u8 mode) { I2C_Start(); Send_Byte(0x78); I2C_WaitAck(); if(mode){Send_Byte(0x40);} else{Send_Byte(0x00);} I2C_WaitAck(); Send_Byte(dat); I2C_WaitAck(); I2C_Stop(); } //开启OLED显示 void OLED_DisPlay_On(void) { OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵使能 OLED_WR_Byte(0x14,OLED_CMD); //开启电荷泵 OLED_WR_Byte(0xAF,OLED_CMD); //点亮屏幕 } //关闭OLED显示 void OLED_DisPlay_Off(void) { OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵使能 OLED_WR_Byte(0x10,OLED_CMD); //关闭电荷泵 OLED_WR_Byte(0xAE,OLED_CMD); //关闭屏幕 } //更新显存到OLED void OLED_Refresh(void) { u8 i,n; for(i0;i8;i) { OLED_WR_Byte(0xb0i,OLED_CMD); //设置行起始地址 OLED_WR_Byte(0x00,OLED_CMD); //设置低列起始地址 OLED_WR_Byte(0x10,OLED_CMD); //设置高列起始地址 I2C_Start(); Send_Byte(0x78); I2C_WaitAck(); Send_Byte(0x40); I2C_WaitAck(); for(n0;n128;n) { Send_Byte(OLED_GRAM[n][i]); I2C_WaitAck(); } I2C_Stop(); } } //清屏函数 void OLED_Clear(void) { u8 i,n; for(i0;i8;i) { for(n0;n128;n) { OLED_GRAM[n][i]0; //清除所有数据 } } OLED_Refresh(); //更新显示 } //画点 //x:0~127 //y:0~63 //t:1 填充 0,清空 void OLED_DrawPoint(u8 x,u8 y,u8 t) { u8 i,m,n; iy/8; my%8; n1m; if(t){OLED_GRAM[x][i]|n;} else { OLED_GRAM[x][i]~OLED_GRAM[x][i]; OLED_GRAM[x][i]|n; OLED_GRAM[x][i]~OLED_GRAM[x][i]; } } //画线 //x1,y1:起点坐标 //x2,y2:结束坐标 void OLED_DrawLine(u8 x1,u8 y1,u8 x2,u8 y2,u8 mode) { u16 t; int xerr0,yerr0,delta_x,delta_y,distance; int incx,incy,uRow,uCol; delta_xx2-x1; //计算坐标增量 delta_yy2-y1; uRowx1;//画线起点坐标 uColy1; if(delta_x0)incx1; //设置单步方向 else if (delta_x0)incx0;//垂直线 else {incx-1;delta_x-delta_x;} if(delta_y0)incy1; else if (delta_y0)incy0;//水平线 else {incy-1;delta_y-delta_x;} if(delta_xdelta_y)distancedelta_x; //选取基本增量坐标轴 else distancedelta_y; for(t0;tdistance1;t) { OLED_DrawPoint(uRow,uCol,mode);//画点 xerrdelta_x; yerrdelta_y; if(xerrdistance) { xerr-distance; uRowincx; } if(yerrdistance) { yerr-distance; uColincy; } } } //x,y:圆心坐标 //r:圆的半径 void OLED_DrawCircle(u8 x,u8 y,u8 r) { int a, b,num; a 0; b r; while(2 * b * b r * r) { OLED_DrawPoint(x a, y - b,1); OLED_DrawPoint(x - a, y - b,1); OLED_DrawPoint(x - a, y b,1); OLED_DrawPoint(x a, y b,1); OLED_DrawPoint(x b, y a,1); OLED_DrawPoint(x b, y - a,1); OLED_DrawPoint(x - b, y - a,1); OLED_DrawPoint(x - b, y a,1); a; num (a * a b * b) - r*r;//计算画的点离圆心的距离 if(num 0) { b--; a--; } } } //在指定位置显示一个字符,包括部分字符 //x:0~127 //y:0~63 //size1:选择字体 6x8/6x12/8x16/12x24 //mode:0,反色显示;1,正常显示 void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size1,u8 mode) { u8 i,m,temp,size2,chr1; u8 x0x,y0y; if(size18)size26; else size2(size1/8((size1%8)?1:0))*(size1/2); //得到字体一个字符对应点阵集所占的字节数 chr1chr- ; //计算偏移后的值 for(i0;isize2;i) { if(size18) {tempasc2_0806[chr1][i];} //调用0806字体 else if(size112) {tempasc2_1206[chr1][i];} //调用1206字体 else if(size116) {tempasc2_1608[chr1][i];} //调用1608字体 else if(size124) {tempasc2_2412[chr1][i];} //调用2412字体 else return; for(m0;m8;m) { if(temp0x01)OLED_DrawPoint(x,y,mode); else OLED_DrawPoint(x,y,!mode); temp1; y; } x; if((size1!8)((x-x0)size1/2)) {xx0;y0y08;} yy0; } } //显示字符串 //x,y:起点坐标 //size1:字体大小 //*chr:字符串起始地址 //mode:0,反色显示;1,正常显示 void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode) { while((*chr )(*chr~)) //判断是不是非法字符! { OLED_ShowChar(x,y,*chr,size1,mode); if(size18)x6; else xsize1/2; chr; } } //m^n u32 OLED_Pow(u8 m,u8 n) { u32 result 1; while(n--) { result * m; } return result; } //显示浮点数 //x,y :起点坐标 //num :要显示的浮点数如 3.14 //len :整数部分位数 //point :小数部分位数 //size :字体大小 //mode :0反色 1正常 void OLED_ShowFloat(u8 x, u8 y, float num, u8 len, u8 point, u8 size, u8 mode) { u8 t, m 0; long temp; if(size 8) m 2; // 处理负数 if(num 0) { OLED_ShowChar(x, y, -, size, mode); num -num; // 取正数 x (size/2 m); // 坐标右移 } // 显示整数部分 temp (long)num; for(t0; tlen; t) { OLED_ShowChar(x (size/2 m)*t, y, (temp / OLED_Pow(10, len-t-1)) % 10 0, size, mode); } // 显示小数点 x (size/2 m)*len; OLED_ShowChar(x, y, ., size, mode); x (size/2 m); // 显示小数部分 temp (long)(num * OLED_Pow(10, point)); for(t0; tpoint; t) { OLED_ShowChar(x (size/2 m)*t, y, (temp / OLED_Pow(10, point-t-1)) % 10 0, size, mode); } } //显示数字 //x,y :起点坐标 //num :要显示的数字 //len :数字的位数 //size:字体大小 //mode:0,反色显示;1,正常显示 void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size1,u8 mode) { u8 t,temp,m0; if(size18)m2; for(t0;tlen;t) { temp(num/OLED_Pow(10,len-t-1))%10; if(temp0) { OLED_ShowChar(x(size1/2m)*t,y,0,size1,mode); } else { OLED_ShowChar(x(size1/2m)*t,y,temp0,size1,mode); } } } //显示汉字 //x,y:起点坐标 //num:汉字对应的序号即显示具体的汉字 //size1:显示字体的大小 //mode:0,反色显示;1,正常显示 void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode) { u8 m,temp; u8 x0x,y0y; u16 i,size3(size1/8((size1%8)?1:0))*size1; //得到字体一个字符对应点阵集所占的字节数 for(i0;isize3;i) { if(size116) {tempHzk1[num][i];}//调用16*16字体 else if(size124) {tempHzk2[num][i];}//调用24*24字体 else if(size132) {tempHzk3[num][i];}//调用32*32字体 else if(size164) {tempHzk4[num][i];}//调用64*64字体 else return; for(m0;m8;m) { if(temp0x01)OLED_DrawPoint(x,y,mode); else OLED_DrawPoint(x,y,!mode); temp1; y; } x; if((x-x0)size1) {xx0;y0y08;} yy0; } } //一直循环滚动显示字库里的汉字 //num:显示汉字的个数 //space:每一遍显示的间隔 //mode:0,反色显示;1,正常显示 void OLED_ScrollDisplayLoop(u8 num,u8 space,u8 mode) { u8 i,n,t0,m0,r; while(1) { if(m0) { OLED_ShowChinese(128,24,t,16,mode); //写入一个汉字保存在OLED_GRAM[][]数组中 t; } if(tnum) { for(r0;r16*space;r) //显示间隔 { for(i1;i144;i) { for(n0;n8;n) { OLED_GRAM[i-1][n]OLED_GRAM[i][n]; } } OLED_Refresh(); } t0; } m; if(m16){m0;} for(i1;i144;i) //实现左移 { for(n0;n8;n) { OLED_GRAM[i-1][n]OLED_GRAM[i][n]; } } OLED_Refresh(); } } //循环滚动显示字库里的汉字,可设置滚动循环的次数 //num:显示汉字的个数 //space:每一遍显示的间隔 //mode:0,反色显示;1,正常显示 //loop_num:滚动显示的次数例如 1滚动1次3滚动3次 void OLED_ScrollDisplay(u8 loop_num, u8 num,u8 space,u8 mode) { u8 i,n,t0,m0,r; u8 loop_cnt 0; // 滚动次数计数器 while(1) { if(m0) { OLED_ShowChinese(128,24,t,16,mode); //写入一个汉字保存在OLED_GRAM[][]数组中 t; } if(tnum) { for(r0;r16*space;r) //显示间隔 { for(i1;i144;i) { for(n0;n8;n) { OLED_GRAM[i-1][n]OLED_GRAM[i][n]; } } OLED_Refresh(); } t0; loop_cnt; // 完成1次滚动计数器1 // 判断是否达到指定滚动次数达到则退出 if(loop_cnt loop_num) { break; // 退出while循环函数结束 } } m; if(m16){m0;} for(i1;i144;i) //实现左移 { for(n0;n8;n) { OLED_GRAM[i-1][n]OLED_GRAM[i][n]; } } OLED_Refresh(); } } //显示图片 //x,y起点坐标 //sizex,sizey图片长宽 //BMP[]要写入的图片数组 //mode:0,反色显示;1,正常显示 void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode) { u16 j0; u8 i,n,temp,m; u8 x0x,y0y; sizeysizey/8((sizey%8)?1:0); for(n0;nsizey;n) { for(i0;isizex;i) { tempBMP[j]; j; for(m0;m8;m) { if(temp0x01)OLED_DrawPoint(x,y,mode); else OLED_DrawPoint(x,y,!mode); temp1; y; } x; if((x-x0)sizex) { xx0; y0y08; } yy0; } } }main.c/* 1.该例程在oled.c中未完全和iic的时序相关代码解耦iic起始、停止等时序逻辑也集成在该文件中。 2.如果在项目中需要用到0.96 oled需要把“OLED”文件夹拷贝到对应工程下头文件只需要修改“oled.h”即可如果需要显示图片则需要包含“bmp.h”图片文件 3.如果需要修改iic管脚仅需要修改“oled.h”即可 4.oled初始化流程OLED_Init - OLED_ColorTurn设置正常显示 - OLED_DisplayTurn设置不翻转 5.oled显示一般流程OLED_ShowXXX写数据 - OLED_Refresh刷新 - 延时 - OLED_Clear清屏 6.一般常用字符串显示函数OLED_ShowString和数字显示函数OLED_ShowNum */ #include system.h //已经包含了stm32f10x.h 以及定义了位带操作的宏后续只包含该头文件就可以了 #include SysTick.h //使用delay_ms和delay_us #include oled.h #include bmp.h //存储要显示的图片数据 #include adc.h int main() { u16 value1 0, value2 0; float x_volt 0.0, y_volt 0.0; SysTick_Init(72); //72为SYSCLK delay_ms延时函数需要使用 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组2:2 在使用中断回调函数时都需要调用, 这里虽然没有使用中断但还是留着 OLED_Init(); OLED_ColorTurn(0); //0正常显示1 反色显示 OLED_DisplayTurn(0); //0正常显示 1 屏幕翻转显示 ADC3_CH4_CH5_Init(); while(1) { value1 Get_ADC_Value(ADC_Channel_4, 20); //读取X通道ADC值20次取平均 value2 Get_ADC_Value(ADC_Channel_5, 20); //读取Y通道ADC值 x_volt (float)value1*(3.3/4096); //计算X通道ADC值对应电压 y_volt (float)value2*(3.3/4096); //计算Y通道ADC值对应电压 //显示常量字符串 OLED_ShowString(0,0,X-Val:,16,1); OLED_ShowString(0,16,X-Volt:,16,1); OLED_ShowString(0,32,Y-Val:,16,1); OLED_ShowString(0,48,Y-Volt:,16,1); //显示ADC值及电压 OLED_ShowNum(60,0,value1,4,16,1); OLED_ShowFloat(60,16,x_volt,1,3,16,1); //该函数是新增的 OLED_ShowNum(60,32,value2,4,16,1); OLED_ShowFloat(60,48,y_volt,1,3,16,1); OLED_Refresh(); delay_ms(200); OLED_Clear(); } }四、演示

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑