lcd.c

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

C
1,237
字号
}
#endif


/********************************************************************************************************
* 功 能 : 清除指定的行显示的内容 即用' ' 填充满一行
* 入 口 : 'line'  是显示行的指定行 line 最大是DispMaxRows-1 行
* 返 回 : 无
********************************************************************************************************/
#if DISP_TXT_EN > 0 && DISP_TXT_CLR_ROW_EN > 0

void  DispTxtClrRow (INT8U row)
{
    INT8U  i;


    if (row < DISP_TXT_MAX_ROWS) {                //
        DispLock();                               //
        DispCtrlCmdWr(DISP_CMD_BASIC);            // 基本命令集
        DispTxtPosSetCur(row, 0);                 // Position cursor at begin of the line to clear
        for (i = DISP_TXT_MAX_COLS; i > 0 ; i--) {// Write ' ' into all column positions of that line
            DispCtrlDataWr (' ');                 // Write an ASCII space at current cursor position
        }
        DispUnLock();                             //
    }
}
#endif


/********************************************************************************************************
* 功 能 : 清除全屏
* 入 口 : 无
* 返 回 : 无
********************************************************************************************************/
#if DISP_TXT_EN > 0 && DISP_TXT_CLR_SCR_EN > 0

void  DispTxtClrScr (void)
{
    INT8U row;
    INT8U col;


    DispLock();                                   //
    DispCtrlCmdWr(DISP_CMD_BASIC);                // 基本命令集
    for(row = 0; row < 4; row++) {                //
        DispTxtPosSetCur(row, 0);                 //
        for(col = 0; col < 16; col++) {           //
            DispCtrlDataWr(' ');                  //
        }
    }
    DispUnLock();                                 //
}
#endif


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

void DispTxtHex (INT8U row, INT8U col, INT8U dat)
{
    INT8U templ;
    INT8U temph;


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

    if (temph > 9) {                              //
        temph -= 10;                              //
        DispTxtCharExt(row, col+0, temph + 'A');  //
    } else {
        DispTxtCharExt(row, col+0, temph + '0');  //
    }

    if (templ > 9) {                              //
        templ -= 10;                              //
        DispTxtCharExt(row, col+1, templ + 'A');  //
    } else {
        DispTxtCharExt(row, col+1, templ + '0');  //
    }
    DispUnLock();
}
#endif


/********************************************************************************************************
* 功 能 : LCM显示初始化函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1 在正是使用LCM前 必须要调用此函数一次 才能保证显示正常
********************************************************************************************************/
#if DISP_TXT_EN > 0

static void  DispTxtInit (void)
{
}
#endif


/********************************************************************************************************
* 功 能 : 设定行列位置
* 入 口 : 'row' 是当前显示的行位置 最大为DispMaxRows-1 行
*         'col' 是当前显示的列位置 最大为DispMaxcols-1 列
* 返 回 : 无
********************************************************************************************************/
#if DISP_TXT_EN > 0 && (DISP_TXT_CLR_SCR_EN > 0 || DISP_TXT_CHAR_EN > 0 || DISP_TXT_STR_EN > 0)

static  void  DispTxtPosSetCur (INT8U row, INT8U col)
{
    switch (row) {                                //
    case 0:
        DispCtrlCmdWr (0x80 + col);               //
        break;
    case 1:
        DispCtrlCmdWr (0x90 + col);               //
        break;
    case 2:
        DispCtrlCmdWr (0x88 + col);               //
        break;
    case 3:
        DispCtrlCmdWr (0x98 + col);               //
        break;
    default:
        break;
    }
}
#endif


/********************************************************************************************************
* 功 能 : 设定行列位置
* 入 口 : 'row' 是当前显示的行位置 最大为DispMaxRows-1 行
*         'col' 是当前显示的列位置 最大为DispMaxcols-1 列
* 返 回 : 无
********************************************************************************************************/
#if DISP_TXT_EN > 0 && (DISP_TXT_CLR_SCR_EN > 0 || DISP_TXT_CHAR_EN > 0 || DISP_TXT_STR_EN > 0)

static  void  DispTxtPosSetFront (INT8U row, INT8U col)
{
    INT8U  temph;
    INT8U  templ;


    if (col != 0) {                               // 直接写每行的第一个字符
        if (col % 2 == 0) {                       // 如果是偶数地址的数据
            DispTxtPosSetCur(row, (col / 2) - 1); //
            temph = DispCtrlDataRd(0);            //
            templ = DispCtrlDataRd(1);            //
            DispTxtPosSetCur(row, (col / 2) - 1); //
            DispCtrlDataWr(temph);                //
            DispCtrlDataWr(templ);                //
        } else {
            DispTxtPosSetCur(row, col / 2);       //
            temph = DispCtrlDataRd(0);            //
            DispTxtPosSetCur(row, col / 2);       //
            DispCtrlDataWr(temph);                //
        }
    } else {
        DispTxtPosSetCur(row, col);               // 设置当前显示行列坐标
    }
}
#endif


/********************************************************************************************************
* 功 能 : 在LCM上显示一串字符
* 入 口 : 'row' 当前显示的行 最大行 即DispMaxRows-1
*         'col' 当前显示的列 最大列 即DispMaxCols-1
*         's'   当前要显示的字符串   见说明部分
*         'len' 当前显示字符串的长度 见说明部分 最大为DispMaxRows*DispMaxCols
* 返 回 : 无
* 说 明 : 1> 从Col的位置算起 最大不能超过一行的长度 (下面的两种情况以此为基础)
*         2> s长度小于len时输出实际的字符串 只输出实际的字符串
*         3> s长度大于len时 按照len指定的长度输出 其余部分截掉
*         4> s长度等于len时 就是字符串的实际输出
*         5> s中可以包含汉字 但汉字按照LCM的要求对齐 否则显示乱码 即可以用' '来填充不对齐部分
*           本函数不做对齐处理 需要调用者自己对齐显示
********************************************************************************************************/
#if DISP_TXT_EN > 0 && DISP_TXT_STR_EN > 0

void  DispTxtStr (INT8U row, INT8U col, const char *s)
{
    DispLock();
    DispTxtStrExt(row, col, s, 0);                // 0显示字符串在RAM中
    DispUnLock();
}
#endif


/********************************************************************************************************
* 功 能 : 显示字符串扩展函数
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> 针对AVR的扩展函数 可以显示RAM FLASH里定义的字符串信息
********************************************************************************************************/

static void DispTxtStrExt (INT8U row, INT8U col, const char *s, BOOL constsel)
{
	char c = 0;


    if ((row < DISP_TXT_MAX_ROWS) && (col < DISP_TXT_MAX_COLS)) {
        DispCtrlCmdWr(DISP_CMD_BASIC);            // 基本命令集
        DispTxtPosSetFront(row, col);             // 处理前面的字符

        for (  ;  ; s++) {                        //
            if (col >= DISP_TXT_MAX_COLS) {       //
                col  = 0;                         //
                row += 1;                         //
                if (row >= DISP_TXT_MAX_ROWS) {   //
                    return;                       //
                } else {
                    DispTxtPosSetFront(row, col); //
                }
            }

            if (!constsel) {                      //
//                OS_ENTER_CRITICAL();              // 进入临界
                c = *s;                           // RAM中字符
//                OS_EXIT_CRITICAL();               // 退出临界
            } else {
//                OS_ENTER_CRITICAL();              // 进入临界
//                c = pgm_read_byte(s);             // FLASH字符
//                OS_EXIT_CRITICAL();               // 退出临界
            }

            switch (c) {                          // 处理字符
            case '\0'  :                          // 退出 字符串完
                return;                           //

            case '\n'  :                          // 回车换行
            case '\r'  :                          // 回车 这里理解为此行停止 多于字符不输出
                col  = 0;                         //
                row += 1;                         //
                if (row < DISP_TXT_MAX_ROWS) {    //
                    DispTxtPosSetFront(row, col); //
                } else {
                    return;                       //
                }
                break;

            case '\a'  :                          // 鸣铃
            case '\b'  :                          // 退格
            case '\f'  :                          // 走纸换页
            case '\t'  :                          // 横向跳向下一制表位置
                break;

            case '\\'  :                          // 反斜线符'\\'
            case '\''  :                          // 单引号符
            case '\"'  :                          // 双引号符
            default :                             // 其它暂时为支持
                DispCtrlDataWr(c);                // 写人数据
                col++;                            //
                break;
            }
        }
    }
}


/********************************************************************************************************
* 功 能 : 显示FLASH中的字符
* 入 口 : 无
* 返 回 : 无
* 说 明 : 1> AVR的扩展函数
********************************************************************************************************/

void DispTxtStrFlash (INT8U row, INT8U col, const char *s)
{
    DispLock();
    DispTxtStrExt(row, col, s, 1);                // 0显示字符串在FLASH中
    DispUnLock();
}


/********************************************************************************************************
* 功 能 : 显示解锁
* 入 口 : 无
* 返 回 : 无
* 说 明 : 无
********************************************************************************************************/
#if DISP_TXT_EN > 0 || DISP_GRH_EN > 0

static void DispUnLock (void)
{
//    OSSemPost(IOMuxSem);
    OSSemPost(DispSem);
}
#endif



//#include "lcdext.c"   // LCD驱动扩展函数集

#endif                                        /* EN_LCD_MODULS                                         */
/********************************************************************************************************
*                                             End  of  File
********************************************************************************************************/

⌨️ 快捷键说明

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