发布时间: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数组清空,下次再赋值(清空但不影响显示)
}
}
三、效果展示