《一起玩OLED屏幕》高清版-Part2-在屏幕上画画
本帖最后由 大明狐 于 2024-2-29 13:16 编辑1.点亮OLED屏幕上的像素点
48
=====================================================================
1.点亮OLED屏幕上的像素点
2.刷新OLED屏幕的显存
3.在OLED屏幕上画点
4.用画点函数和缓存实现画面渐隐渐显
5.用“蒙版”实现渐隐渐显效果
6.用画点函数画线的原理
7.分享一种简单的画直线的函数
8.坐标系和波形图
9.动态的波形图
10.画出正弦曲线的函数
11.用三角函数画个圆圈
12.比较法画圆的算法
13.画圆角矩形的画法
14.宽边圆角矩形的画法
15.用贝赛尔曲线画圆角矩形
=====================================================================
《一起玩OLED屏幕》高清版-Part1-点亮OLED屏幕
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6840
《一起玩OLED屏幕》高清版-Part3-关于屏幕画面闪烁
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6842
=====================================================================
本帖最后由 大明狐 于 2024-2-27 10:13 编辑
2.刷新OLED屏幕的显存
52
修正上面一处数据类型的错误
51
本帖最后由 大明狐 于 2024-7-30 11:54 编辑
3.在OLED屏幕上画点
54
/**********************************************
★ 点亮指定位置的一个点 ★
OLED_DrawPoint(x,y, draw)
//**********************************************/
void OLED_DrawPoint ( int x, int y, u8 draw )
//1、坐标值的数据类型改成int,因为有时候需要坐标起止点在屏幕外。
//2、画点和擦除点两个函数合二为一,添加参数draw,为1时画点、为0时擦点
//3、draw的数据类型不再用bit,是因为如果C51和C251的keil设置成“生成可重入函数”,或者在stm32里,不支持“bit”
{
int n; //点所在行的行号(page)
int m; //点所在小竖棍的第几位
if ( ( x < 0 ) || ( x > 127 ) || ( y < 0 ) || ( y > 63 ) ) return; //防止超出屏幕
// n = y / 8;
// m = y % 8;
n = (u8)(y >> 3); // n = 0 - 7
m = y - ( ( y >> 3 ) << 3 ); // m = 0 - 7
// 除法运算,改用移位的方式,因为除数是8的除号运算在C251的Keil编译会出错,C51和ARM版本没问题
if ( draw )
GRAM[ n *128 + x ]|= ( 0x01 << m );
else if ( !draw )
GRAM[ n * 128 + x ]&= ~( 0x01 << m );
}
本帖最后由 大明狐 于 2024-2-27 10:25 编辑
4.用画点函数和缓存实现画面渐隐渐显
55
本帖最后由 大明狐 于 2024-2-27 10:26 编辑
5.用“蒙版”实现渐隐渐显效果
56
本帖最后由 大明狐 于 2024-2-27 10:05 编辑
6.用画点函数画线的原理
49
本帖最后由 大明狐 于 2024-7-30 11:55 编辑
7.分享一种简单的画直线的函数
50
下面是画线函数的修改版
/******************************************************************************
函数说明:画线(数值微分法)
入口数据:x0,y0 起始坐标
x1,y1 终止坐标
draw 1-画线,0-擦除线
******************************************************************************/
void OLED_DrawLine ( int x0, int y0, int x1, int y1, u8 draw )
//1、坐标值的数据类型改成int,因为有时候需要坐标起止点在屏幕外。
//2、draw的数据类型不再用bit,是因为如果C51和C251的keil设置成“生成可重入函数”,或者在stm32里,不支持“bit”
{
u8 lx = ( x1 > x0 ) ? ( x1 - x0 ) : ( x0 - x1 ); //线段的横向宽度
u8 ly = ( y1 > y0 ) ? ( y1 - y0 ) : ( y0 - y1 ); //线段的竖向高度
//3、用三元运算符替代绝对值abs函数,减少外部头文件的调用
u8 i;
u8 dm; //线段宽度高度分成的份数
float dx, dy; //线段宽度高度分成每份的大小(包含方向)
float x, y; //画点的坐标值
if ( lx >= ly ) dm = lx; //如果斜线宽度大于等于高度,以宽度值为准切片
else dm = ly; //如果斜线宽度小于高度,以高度值为准切片
/*
dm = (lx >= ly) ? (lx) :(ly); //上面两行也可以写成三元运算符的形式
*/
dx = (float)( x1 - x0 ) / dm; //水平方向坐标值的增量
dy = (float)( y1 - y0 ) / dm; //竖直方向坐标值的增量
x = (float)x0 + 0.5; //四舍五入
y = (float)y0 + 0.5;
for ( i = 0; i <= dm; i++ ) //按照切片数量计算画点的坐标值
{
OLED_DrawPoint ( (int)x, (int)y, draw ); //画点
x += dx; //画点之后给x坐标值添加增量
y += dy; //画点之后给y坐标值添加增量
}
}
本帖最后由 大明狐 于 2024-2-27 10:39 编辑
8.坐标系和波形图
57
9.动态的波形图
58
本帖最后由 大明狐 于 2024-2-27 10:43 编辑
10.画出正弦曲线的函数
59