lcd.c

来自「这个是黑白LCD的一个典型的驱动函数集 原创 请大家多支持下下!如果有什么问题请」· C语言 代码 · 共 1,237 行 · 第 1/4 页

C
1,237
字号
                templ = FONT5x7ASCII[(INT8U)c][y_offset];
                if (colors) {                     //
                    templ  = ~templ;              //
                }
            }

            DispGrhPosSetCur(x0, y0+y_offset);    // 显示坐标
            DispCtrlCmdWr(DISP_CMD_BASIC);        // 基本命令集
            DispCtrlDataWr(temph);                // 数据高字节
            DispCtrlDataWr(templ);                // 数据低字节
        }
        DispUnLock();                             //
    }
}
#endif


/********************************************************************************************************
* 功 能 : 图形方法显示一个字符标准ASCII码 不包含控制字符 字符大小 5*7
* 入 口 : 'x' 显示的X坐标位置  范围0~DispMaxX
*         'y' 显示的Y坐标位置  范围0~DispMaxY
*         'c' 显示的字符
* 返 回 : 无
* 说 明 : 1> x y 方向大于DispMaxX 和DispMaxY 时 不在显示范围内的部分会自动截掉
*         2> 不是ASCII码 则显示为' '
********************************************************************************************************/
#if DISP_GRH_EN > 0

void DispGrhChar57 (INT8U x0, INT8U y0, char  c, COLORS colors)
{
    INT8U font_dat[8];
    INT8U dat;
    INT8U i;
    INT8U j;


    if (x0 < DISP_GRH_MAX_X && y0 < DISP_GRH_MAX_Y) { // 参数过滤
        c -= 0x20;                                    //
        memcpy(&font_dat, &FONT5x7ASCII[(INT8U)c][0], 8);
        for (i=0; i<8; i++) {                         // 读取点阵数据
            for (j=8; j>2; j--) {
                if (colors == DISP_COLORS_BLACK) {    //
                    dat = !GETBIT(font_dat[i], j);    //
                } else {
                    dat =  GETBIT(font_dat[i], j);    //
                }
                DispGrhPixel(x0, y0, dat);            //
                x0++;                                 //
            }
            y0++;                                     // 指向下一行
            x0 -= 6;                                  // 恢复X值
        }
    }
}
#endif


/********************************************************************************************************
* 功 能 : 图形方式画一个圆
* 入 口 : 'x' X坐标
*         'y' Y坐标
* 返 回 : 无
********************************************************************************************************/
#if DISP_GRH_EN > 0 && DISP_GRH_CIRCLE_EN > 0

void DispGrhCircle (INT8U x0, INT8U y0, INT8U r, COLORS colors)
{
    INT8S x, y, dt, dt1, dt2, dr;


    DispLock();

    x  = 0;
    y  = r;
    dt = 2 - r - r;
    while (y >= 0) {
        DispGrhPixel(x0 + x, y0 + y, colors);     // 第1象限
        DispGrhPixel(x0 - x, y0 + y, colors);     // 第2象限
        DispGrhPixel(x0 + x, y0 - y, colors);     // 第3象限
        DispGrhPixel(x0 - x, y0 - y, colors);     // 第4象限
        if (dt < 0) {
            dt1 = dt + dt + y + y - 1;
            if (dt1 <= 0) {
                dr = 1;
            } else {
                dr = 2;
            }
        } else if (dt > 0) {
            dt2 = dt + dt - x - x - 1;
            if (dt2 <= 0) {
                dr = 2;
            } else {
                dr = 3;
            }
        } else {
            dr = 2;
        }

        switch (dr) {
        case 1:
            x++;
            dt += x + x + 1;
            break;
        case 2:
            x++;
            y--;
            dt += x + x - y - y - 1;
            break;
        case 3:
            y--;
            dt += 1 - y - y;
            break;
        }
    }
    DispUnLock();
}
#endif


/********************************************************************************************************
* 功 能 : 图形方法清屏
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1>
********************************************************************************************************/
#if DISP_GRH_EN > 0 && DISP_GRH_CLR_SCR_EN > 0

void DispGrhClrScr (void)
{
    DispGrhAllFill(0x00);                         // 全屏填充00  即是清屏
}
#endif


/********************************************************************************************************
* 功 能 :
* 入 口 : 'x' 显示的X坐标位置  范围0~DispMaxX
*         'y' 显示的Y坐标位置  范围0~DispMaxY
* 返 回 : 无
* 说 明 :
********************************************************************************************************/
#if DISP_GRH_EN > 0

static void DispGrhDataWrExt (INT8U x, INT8U y, INT16U dat)
{
    DispCtrlCmdWr(DISP_CMD_EXTEND);               // 扩展命令集
    DispCtrlCmdWr(y);                             // 写Y方向地址
    DispCtrlCmdWr(x);                             // 写X方向地址
    DispCtrlCmdWr(DISP_CMD_BASIC);                // 基本命令集
    DispCtrlDataWr(dat>>8);                       // 数据高字节
    DispCtrlDataWr(dat>>0);                       // 数据低字节
}
#endif


/********************************************************************************************************
* 功 能 : 显示HEX值数据
* 入 口 : 'row' 是当前显示行  row 最大是DispMaxRows-1 行
*         'col' 是当前显示列  col 最大是DispMaxCols-1 列
*         'dat' 是待显示的数据
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
#if DISP_GRH_EN > 0 && DISP_GRH_HEX_EN > 0 

void DispGrhHex (INT8U x0, INT8U y0, INT8U dat, COLORS colors)
{
    INT8U templ;
    INT8U temph;


    DispLock();                                   //
    templ = (dat & 0x0f) >> 0;                    //
    temph = (dat & 0xf0) >> 4;                    //

    if (temph > 9) {                              //
        temph -= 10;                              //
        DispGrhChar57(x0+0, y0, temph+'A', colors); //
    } else {
        DispGrhChar57(x0+0, y0, temph+'0', colors); //
    }

    if (templ > 9) {                              //
        templ -= 10;                              //
        DispGrhChar57(x0+6, y0, templ+'A', colors); //
    } else {
        DispGrhChar57(x0+6, y0, templ+'0', colors); //
    }
    DispUnLock();
}
#endif


/********************************************************************************************************
* 功 能 : 图形方式初始化
* 入 口 : 无
* 返 回 : 无
* 说 明 : 这个函数必须在工作前至少调用一次
********************************************************************************************************/
#if DISP_GRH_EN > 0

static void DispGrhInit (void)
{

}
#endif


/********************************************************************************************************
* 功 能 : 图形方式画任意方向直线
* 入 口 : 'x0' 起始X坐标
*         'y0' 起始Y坐标
*         'x1' 终点X坐标
*         'y1' 终点Y坐标
* 返 回 : 无
* 说 明 :
********************************************************************************************************/
#if DISP_GRH_EN > 0 && DISP_GRH_LINE_EN > 0

void DispGrhLine (INT8U x0, INT8U y0, INT8U x1, INT8U y1, COLORS colors)
{
    INT16S a, b;
    INT16S dt1, dt2, d;
    INT8U  x, y;
    INT8S  ystp;


    DispLock();
    ystp = 1;
    if(abs(x1 - x0) > abs(y1 - y0)) {
        if(x0 > x1)  {
            x  = x0;
            x0 = x1;
            x1 = x;
            y  = y0;
            y0 = y1;
            y1 = y;
        }
        a = y0 - y1;
        b = x1 - x0;
        if(a > 0) {
            a    = -a;
            ystp = -1;
        } else {
            ystp =  1;
        }
        d   = (a << 1) + b;
        dt1 = a << 1;
        dt2 = (a + b) << 1;
        x   = x0;
        y   = y0;
        DispGrhPixel(x, y, colors);
        while (x < x1) {
            if(d < 0) {
                x += 1;
                y += ystp;
                d += dt2;
            } else {
                x += 1;
                d += dt1;
            }
            DispGrhPixel(x, y, colors);
        }
    } else {
        if (y0 > y1) {
            x  = x0;
            x0 = x1;
            x1 = x;
            y  = y0;
            y0 = y1;
            y1 = y;
        }
        a = x0 - x1;
        b = y1 - y0;
        if (a > 0) {
            a    = -a;
            ystp = -1;
        } else {
            ystp = 1;
        }
        d   = (a << 1) + b;
        dt1 = a << 1;
        dt2 = (a + b) << 1;
        x   = x0;
        y   = y0;
        DispGrhPixel(x, y, colors);
        while(y < y1) {
            if(d < 0) {
                y += 1;
                x += ystp;
                d += dt2;
            }else {
                y += 1;
                d += dt1;
            }
            DispGrhPixel(x, y, colors);
        }
    }
    DispUnLock();
}
#endif


/********************************************************************************************************
* 功 能 : 图形方式画一个点
* 入 口 : 'x' X坐标
*         'y' Y坐标
* 返 回 : 无
********************************************************************************************************/
#if DISP_GRH_EN > 0

⌨️ 快捷键说明

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