⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvsed1335.c

📁 sed1335液晶驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// 输入:   无
//
// 输出:   无
//

void
ClearScreen(void)
{
    int i;

    //
    // 光标向右,在图形显示区将显存全部清零
    //

    _LCDCom(CSR_RIGHT);

    _SetCursor(0, 0);

    _LCDCom(MWRITE);

    for (i = 0;
        i < SCREEN_WIDTH * SCREEN_HIGHT / 8;
        i++)
    {
        _LCDData(0x00);
    }
}
 

//
// 设置前景颜色
//
// 输入:   color       前景区的颜色
//
// 输出:   设置成功标志
//

int
SetColor(
    IN INT32U color
    )
{
    if (color)
    {
        _Color = 1;
    }
    else
    {
        _Color = 0;
    }

    return 1;
}


//
// 设置X方向刷新坐标最大限制值
//
// 输入:   limit       X方向屏幕刷新的最大限制值
//
// 输出:   设置成功标志
//

int
SetXRefreshLimit(
    IN INT32U limit
    )
{
    if (limit > SCREEN_WIDTH
        ||
        limit == 0)
    {
        return -1;
    }

    _XRefreshLimit = limit;

    return 1;
}


//
// 初始化LCD显示参数以及界面
//
// 输入:   无
//
// 输出:   无
//

void
InitLCD(void)
{
    int i;

    _LCDPortInit();

    _LCDCom(SYSTEM_SET);            // System config
    for (i = 0; i < 8; i++)
    {
        _LCDData(SYSTAB[i]);
    }

    _LCDCom(SCROLL);            // Scroll settings
    for (i = 0; i < 10; i++)
    {
        _LCDData(SCRTAB[i]);
    }

    _LCDCom(HDOT_SCR);
    _LCDData(0x00);             // 0000 0000    

    _LCDCom(OVLAY);
    _LCDData(0x01);             // 0000 0110    OV: 0, DM1: 1, DM2: 0 MX1: 1, MX2: 0

    _LCDCom(DISP_OFF);
    _LCDData(0x00);

    _ClearMemory();

    _LCDCom(CSRW);
    _LCDData(0x00);             // 0000 0000    CSRL: 0x00
    _LCDData(0x00);             // 0000 0000    CSRH: 0x00

    _LCDCom(CSRFORM);
    _LCDData(0x00);             // 0000 0001    CRX: 1
    _LCDData(0x8f);             // 1000 1111    CM: 0, CRY: 15

    _LCDCom(DISP_ON);
    _LCDData(0x56);             // 0001 0110

    _LCDCom(CSR_RIGHT);

    _SetCursor(0, 0);

    SetColor(GUI_WHITE);

    SetXRefreshLimit(SCREEN_WIDTH);
}


//
// 画点函数
//
// 输入:   x           横轴坐标
//          y           纵轴坐标
//          color       颜色
//
// 输出:   画点成功与否标志
//

int
DrawPoint(
    IN INT32U x,
    IN INT32U y,
    IN INT32U color
    )
{
    BYTE newcolor;
    BYTE offset = 1 << (7 - (x % 8));

    //
    // 画点原理:
    //     首先将光标移至画点处,读出当前该点处的信息,
    // 将该信息和画点所需要的颜色通过逻辑加工后,重新
    // 写入目标区域。这种方法效率低,不适合大片绘图。
    //

    if (x > SCREEN_WIDTH || y > SCREEN_HIGHT)
    {
        return 0;
    }

    _SetCursor(x, y);

    newcolor = _ReadSram();

    if (color)
    {
        newcolor |= offset;
    }
    else
    {
        newcolor &= ~offset;
    }

    _SetCursor(x, y);

    _LCDCom(MWRITE);
    _LCDData(newcolor);

    return 1;
}


//
// 画位图函数
//
// 输入:   xstart      横轴起始坐标
//          ystart      纵轴起始坐标
//          width       位图宽度
//          hight       位图高度
//          pbmp        位图数据头指针
//
// 输出:   画图成功与否标志
//

int
DrawBitmap(
    IN INT32U xstart,
    IN INT32U ystart,
    IN INT32U width,
    IN INT32U hight,
    IN const BYTE* pbmp
    )
{
    int side1, side2, x, y;
    BYTE paint, temp;

    if (pbmp == NULL)
    {
        return -1;
    }

    if (ystart + hight > SCREEN_HIGHT
        ||
        xstart + width > SCREEN_WIDTH)
    {
        return -2;
    }

    side1 = 8 - (xstart % 8);
    side2 = (xstart + width) % 8;

    //
    // 光标方向向右
    //

    _LCDCom(CSR_RIGHT);

    for (y = ystart; y < ystart + hight; y++)
    {
        //
        // 左边界处理
        //

        if (side1 < 8)
        {
            paint = (_Color ? *pbmp : ~(*pbmp));            // Just can't put these two lines
            paint = paint >> (8 - side1);                   // together with '(' and ')', why?
            _SetCursor(xstart, y);
            paint = paint | ((_ReadSram() >> side1) << side1);
        }
        else
        {
            paint = _Color ? *pbmp : ~(*pbmp);
        }

        _SetCursor(xstart, y);
        _LCDCom(MWRITE);
        _LCDData(paint);

        //
        // 主体绘画
        //

        for (x = (xstart / 8) + 1; x < (xstart + width) / 8; x++)
        {
            if (side1 < 8)
            {
                paint = (*pbmp << side1) | (*(pbmp + 1) >> (8 - side1));
            }
            else
            {
                paint = *(pbmp + 1);
            }
            _LCDData(_Color ? paint : ~paint);
            pbmp++;
        }

        //
        // 右边界处理
        //

        if (side2)
        {
            if (side1 < 8)
            {
                paint = (*pbmp << side1) | (*(pbmp + 1) >> (8 - side1));
            }
            else
            {
                paint = *(pbmp + 1);
            }

            temp = (_ReadSram() << side2);      // Got to use this tmeporary var here, compiler needs it?
            temp = temp >> side2;
            paint = (((_Color ? paint : ~paint) >> (8 - side2)) << (8 - side2)) | temp;

            _SetCursor(xstart + width, y);
            _LCDCom(MWRITE);
            _LCDData(paint);
        }

        if (side1 + side2 > 8)
        {
            pbmp += 2;
        }
        else
        {
            pbmp++;
        }
    }

    return 1;
}


//
// 填充矩形框
//
// 输入:   xstart      横轴起始坐标
//          ystart      纵轴起始坐标
//          width       矩形框宽度
//          hight       矩形框高度
//          color       矩形框内部填充颜色
//
// 输出:   操作成功与否标志
//

int
FillRect(
    IN INT32U xstart,
    IN INT32U ystart,
    IN INT32U width,
    IN INT32U hight,
    IN INT32U color
    )
{
    int side1, side2, x, y;
    BYTE paint;

    if (ystart + hight > SCREEN_HIGHT
        ||
        xstart + width > SCREEN_WIDTH)
    {
        return -2;
    }

    side1 = 8 - (xstart % 8);
    side2 = (xstart + width) % 8;

    //
    // 光标方向向右
    //

    _LCDCom(CSR_RIGHT);

    for (y = ystart; y < ystart + hight; y++)
    {
        //
        // 左边界处理
        //

        if (side1 < 8)
        {
            _SetCursor(xstart, y);
            paint = (color ? 0xff : 0x00) >> (8 - side1);
            paint = paint | ((_ReadSram() >> side1) << side1);
        }
        else
        {
            paint = color ? 0xff : 0x00;
        }

        _SetCursor(xstart, y);
        _LCDCom(MWRITE);
        _LCDData(paint);

        //
        // 主体绘画
        //

        for (x = (xstart / 8) + 1; x < (xstart + width) / 8; x++)
        {
            _LCDData(color ? 0xff : 0x00);
        }

        //
        // 右边界处理
        //

        if (side2)
        {
            paint = (((_Color ? 0xff : 0x00) >> (8 - side2)) << (8 - side2))
                    | (_ReadSram() >> side2);

            _SetCursor(xstart + width, y);

            _LCDCom(MWRITE);
            _LCDData(paint);
        }
    }

    return 1;
}


//
// 设置屏幕上的光标, x, y值对应光标的行列数,而不是像素坐标
//
// 输入:   column      横轴坐标,单位为字符列数
//          row         纵轴坐标
//
// 输出:   操作成功与否标志
//
// 注意:该函数设置的坐标是在屏幕第一层上的闪动光标
//

int
SetCursor(
    IN INT32U column,
    IN INT32U row
    )
{
    INT16U addr;

    //
    // 看看行列数输入是否正确
    //

    if (column > CHAR_PER_LINE - 1
        ||
        row > SCREEN_HIGHT / CURSOR_HIGHT)
    {
        return -1;
    }

    addr = row * AP + column;

    _LCDCom(CSRW);

    _LCDData((BYTE)LOBYTE(addr));

    _LCDData((BYTE)HIBYTE(addr));

    return 1;
}


//
// 设置光标形状,块状或者是竖条
//
// 输入:   shape       光标的形状
//
// 输出:   操作成功
//

int
SetCursorShape(
    IN INT32U shape
    )
{
    BYTE cursorWidth;

    if (shape)
    {
        cursorWidth = 7;
    }
    else
    {
        cursorWidth = 0;
    }

    _LCDCom(CSRFORM);
    _LCDData(cursorWidth);
    _LCDData(0x8f);                     // 0x8f 中,隐含光标高度为16

    return 1;
}

#endif // LCD_CONTROLLER

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -