大明狐 发表于 2024-2-25 22:10:37

《一起玩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-25 22:11:02

本帖最后由 大明狐 于 2024-2-27 10:13 编辑

2.刷新OLED屏幕的显存


52

修正上面一处数据类型的错误
51

大明狐 发表于 2024-2-25 22:11:52

本帖最后由 大明狐 于 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-25 22:12:16

本帖最后由 大明狐 于 2024-2-27 10:25 编辑

4.用画点函数和缓存实现画面渐隐渐显

55

大明狐 发表于 2024-2-25 22:14:25

本帖最后由 大明狐 于 2024-2-27 10:26 编辑

5.用“蒙版”实现渐隐渐显效果

56

大明狐 发表于 2024-2-25 22:14:51

本帖最后由 大明狐 于 2024-2-27 10:05 编辑

6.用画点函数画线的原理


49


大明狐 发表于 2024-2-25 22:15:09

本帖最后由 大明狐 于 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-25 22:15:21

本帖最后由 大明狐 于 2024-2-27 10:39 编辑

8.坐标系和波形图


57

大明狐 发表于 2024-2-25 22:15:34

9.动态的波形图


58

大明狐 发表于 2024-2-25 22:15:49

本帖最后由 大明狐 于 2024-2-27 10:43 编辑

10.画出正弦曲线的函数


59



页: [1] 2 3 4 5 6 7
查看完整版本: 《一起玩OLED屏幕》高清版-Part2-在屏幕上画画