STM32在OLED屏幕绘制GUI曲线图(单变量)

发布时间:2023-05-23 13:00

一、基础函数

本项目使用的是分辨率为128*32的屏幕,因此在使用中函数的定义需要根据情况不同进行修改。

1.任意点绘制函数

/***********功能描述:画点x 0-127 y 0-31 t 1填充 0清空*****************/
void OLED_DrawPoint(u8 x,u8 y,u8 t)
{
        u8 pos,bx,temp=0;
        if(x>127||y>31)return;
        pos=y/8;  
        bx=y%8;   
        temp=1<

2.绘制水平线条函数

/***********功能描述:绘制水平线条,y为水平线位置,x0为起始位置,x1为结束位置*****************/
void gui_draw_hline(uint16_t y,uint16_t x0,uint16_t x1)
{
	uint16_t x = 0;
	
	for (x = x0;x <= x1;x++)
	{
		OLED_DrawPoint(x,y,1);
	}
}

3.绘制垂直线条

/***********功能描述:绘制垂直线条,x为垂直线位置,y0为起始位置,y1为结束位置*****************/
void gui_draw_vline(uint16_t x,uint16_t y0,uint16_t y1)
{
	uint16_t y = 0;
	
	for (y = y0;y <= y1;y++)
	{
		OLED_DrawPoint(x,y,1);
	}
}

4.绘制一个坐标系

/***********功能描述:绘制一个坐标系,横轴在最下方,纵轴在最左方*****************/
void gui_draw_axis(void)
{
	gui_draw_hline(31,0,120);
	gui_draw_vline(0,0,31);
}

5.显存更新函数

        OLED_GRAM[128][8]为程序中用于保存OLED图形信息的数组,其中120为横向的128列,8为纵向的8页(分辨率为128*32的屏只有4页),每页有8位,即一个字节。则OLED_GRAM[128][8]就相当于OLED的显存,提前设定好,直接用OLED_Refresh_Gram函数写进OLED。

        这种方式相比较于另一种清屏函数OLED_Clear,页面更加流场。

//更新显存到OLED
void OLED_Refresh_Gram(void)
{
	u8 i,n;		    
	for(i=0;i<8;i++)  
	{  
		OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0-7)
		OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置-列低地址
		OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置-列高地址
		for(n=0;n<128;n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA); 
	}   
}

6.OLED_GRAM数组清零

        前面的所有函数只是对数组的值进行幅值,如果只是简单的单次显示,只赋值一次就可以,但像GUI这种需要不断更新的动态显示,就需要不断将数组清零并重新赋值。

void Gram_clear(void)
{
	u8 i,n;		
	for(i=0;i<8;i++)  
	{    
		for(n=0;n<128;n++) OLED_GRAM[n][i]=0; 
	} 
}

二、主函数

        本项目涉及到OLED显示、摇杆电位器,采用了软件I2C、ADC等外设。主要功能是将摇杆电位器采集到的模拟信号以曲线的形式在OLED屏幕上面绘制出来。主程序如下:

 int main(void)
  {	
		u8 i,j=0;
		u16 adc_left_y;
		u16 h;
		u8 H[128];
		
		delay_init();	    	 //延时函数  
		Adc_Init();              //模数转换初始化
		OLED_Init();			 //OLED屏初始化
		OLED_Clear();            //清屏
		
	while(1) 
	{		
			adc_left_y=Get_Adc_Average(ADC_Channel_7,3);    //模数转化之后的值(0-4096)

			
			h=(float)adc_left_y*(32.0/4096);       //将采集到的值转化至屏幕尺寸(0-32)
		    h=(int)h;

			
			gui_draw_axis();                       //绘制坐标轴
			
			H[j]=32-h;                             //数组用于保存前面的采集值
			
			for(i=0;i<=j;i++)
			{
				OLED_DrawPoint(i,H[i],1);          //显示前面的采集值,形成曲线
			}
			
			j++;
			if(j>127) j=0;                         //在画出屏幕之后从左边重新开始
				
			OLED_Refresh_Gram();                   //更新显存
			
			Gram_clear();                          //将OLED_GRAM数组清空,下次再赋值(清空但不影响显示)
	}	  
	
}

三、效果展示

 

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号