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

📄 lcd.c

📁 手机液晶3310驱动程序的中文说明
💻 C
📖 第 1 页 / 共 2 页
字号:
* 说  明 : 1> 在多任务环境下有效 根据OS更改此函数
********************************************************************************************************/
#if LCD_GRH_EN > 0 || LCD_TXT_EN > 0

static void LCDDispLock (void)
{
#if LCD_OS_EN > 0
    INT8U err;

    OSSemPend(DispSem, 0, &err);
#endif
}
#endif


/********************************************************************************************************
* 功  能 : 设置LCD的背光
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> LCD_LAMP_ON  LCD_LAMP_OFF
********************************************************************************************************/

void LCDDispSetLamp (BOOL state)
{
    if (state == LCD_LAMP_ON) {
    } else {
    }
}


/********************************************************************************************************
* 功  能 : 文本方式写1个字符
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> 这里使用的是软件换算算法把字库调头 
*          2> 如果需要提高速度 就采用查表的方式
********************************************************************************************************/
#if LCD_TXT_EN > 0 && (LCD_DISP_TXT_CHAR_EN > 0 || LCD_DISP_TXT_STR_EN > 0 || LCD_DISP_TXT_HEX_EN > 0 || LCD_DISP_TXT_BCD_EN > 0)

static void LCDDispTxtWriteChar (INT8U row, INT8U col, char c)
{
    INT8U  i;
    INT8U  j;
    INT8U  temp;
    char   dat[8];
    INT8U  newdat[8];


    c    -= 0x20;                                  //
    temp  = 0x00;                                  // 
    memcpy_P(&dat, &FONT5x7ASCTbl[(INT8U)c][0], 8);// 得到字库数据 从FALSH中CPY数据到RAM中利用GCC函数

    for (i=0; i<8; i++) {                          // 处理字库数据
        for (j=0; j<8; j++) {
            if (GETBIT(dat[j], i)) {               // 计算字节内地址的数据
                SETBIT(temp, j);                   // 设置为1
            } else {
                CLRBIT(temp, j);                   // 设置为0
            }
        }
        newdat[7-i] = temp;                        // 提高效率引入temp变量
    }

    memcpy(&LCDDispTxtBuf[row][col*6], newdat, 8); // 写入数据
}
#endif


/********************************************************************************************************
* 功  能 : 文本方式显示unsigned char 类型的BCD码 两位
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/
#if LCD_TXT_EN > 0 && LCD_DISP_TXT_BCD_EN > 0

void LCDDispTxtBCD (INT8U row, INT8U col, INT8U dat)
{
    INT8U temp1;
    INT8U temp2;


    if ((row < LCD_DISP_TXT_MAX_ROWS) && (col < LCD_DISP_TXT_MAX_COLS)) {
        LCDDispLock();                            // 锁定LCD
        dat   = dat % 100;                        // 去掉百位
        temp1 = dat / 10 + '0';                   // 十位
        temp2 = dat % 10 + '0';                   // 个位
        LCDDispTxtWriteChar(row, col + 0, temp1); // 写十位
        LCDDispTxtWriteChar(row, col + 1, temp2); // 写个位
        LCDDispUpdata();                          // 更新LCD显示
        LCDDispUnLock();                          // 解除LCD锁定
    }
}
#endif


/********************************************************************************************************
* 功  能 : 显示1个字符
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/
#if LCD_TXT_EN > 0 && LCD_DISP_TXT_CHAR_EN > 0

void LCDDispTxtChar (INT8U row, INT8U col, char c)
{
    if ((row < LCD_DISP_TXT_MAX_ROWS) && (col < LCD_DISP_TXT_MAX_COLS)) {
        LCDDispLock();                            // 锁定LCD
        LCDDispTxtWriteChar(row, col, c);         // 写字符数据
        LCDDispUpdata();                          // 更新LCD显示
        LCDDispUnLock();                          // 解除LCD锁定
    }
}
#endif


/********************************************************************************************************
* 功  能 : LCD 图形显示方式清屏函数
* 入  口 : 无
* 返  回 : 无
* 说  明 : 清除全屏显示
********************************************************************************************************/
#if LCD_TXT_EN > 0 && LCD_DISP_TXT_CLR_SCR_EN > 0

void LCDDispTxtClrScr (void)
{
    LCDDispLock();                                            // 上锁
    memset(LCDDispTxtBuf,    0x00, sizeof(LCDDispTxtBuf));    // 清除显示屏幕
    memset(LCDDispTxtBakBuf, 0xff, sizeof(LCDDispTxtBakBuf)); // 备份显示为反显 以实现必须更新LCD内容的目的
    LCDDispUpdata();                                          // 更新LCD显示内容
    LCDDispUnLock();                                          // 解锁
}
#endif


/********************************************************************************************************
* 功  能 : 文本方式显示unsigned char 类型的HEX码 两位
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/
#if LCD_TXT_EN > 0 && LCD_DISP_TXT_HEX_EN > 0

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


    if ((row < LCD_DISP_TXT_MAX_ROWS) && (col < LCD_DISP_TXT_MAX_COLS)) {
        LCDDispLock();                                    // 锁定LCD
        temph = (dat & 0xf0) >> 4;                        // 高半字节
        templ = (dat & 0x0f) >> 0;                        // 低半字节

        if (temph < 10) {
            LCDDispTxtWriteChar(row, col+0, temph + '0'); // 写字符数据
        } else {
            temph -= 10;
            LCDDispTxtWriteChar(row, col+0, temph + 'A'); // 
        }
        if (templ < 10) {
            LCDDispTxtWriteChar(row, col+1, templ + '0'); // 写字符数据
        } else {
            templ -= 10;
            LCDDispTxtWriteChar(row, col+1, templ + 'A'); // 
        }

        LCDDispUpdata();                                  // 更新LCD显示
        LCDDispUnLock();                                  // 解除LCD锁定
    }    
}
#endif


/********************************************************************************************************
* 功  能 : 图形相关的初始化
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/
#if LCD_TXT_EN > 0

static void LCDDispTxtInit (void)
{
    LCDDispTxtClrScr();                           // 清屏
}
#endif


/********************************************************************************************************
* 功  能 : 文本方式显示1串字符
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/
#if LCD_TXT_EN > 0 && LCD_DISP_TXT_STR_EN > 0

void LCDDispTxtStr (INT8U row, INT8U col, char *str)
{
    if ((row < LCD_DISP_TXT_MAX_ROWS) && (col < LCD_DISP_TXT_MAX_COLS)) {
        LCDDispLock();                            // 锁定LCD

        for (  ;  ; str++) {
            if (col >= LCD_DISP_TXT_MAX_COLS) {
                col  = 0;
                row += 1;
                if (row >= LCD_DISP_TXT_MAX_ROWS) {
                    goto end;                         // 退出显示
                }                
            }

            switch (*str) {                       // 处理字符
            case '\0'  :                          // 退出 字符串完
                goto end;

            case '\n'  :                          // 回车换行
            case '\r'  :                          // 回车 这里理解为此行停止 多于字符不输出
                col  = 0;                         //
                row += 1;                         //
                break;

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

            case '\\'  :                          // 反斜线符'\\'
            case '\''  :                          // 单引号符
            case '\"'  :                          // 双引号符
            default :                             // 其它暂时为支持
                LCDDispTxtWriteChar(row, col, *str);// 写人数据
                col++;
                break;
            }
        }
end:
        LCDDispUpdata();                          // 更新LCD显示
        LCDDispUnLock();                          // 解除LCD锁定
    }
}
#endif


/********************************************************************************************************
* 功  能 : LCD显示解锁
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> 在OS环境下使用 根据OS不同更改此函数
********************************************************************************************************/
#if LCD_GRH_EN > 0 || LCD_TXT_EN > 0

static void LCDDispUnLock (void)
{
#if LCD_OS_EN > 0
    OSSemPost(DispSem);
#endif
}
#endif


/********************************************************************************************************
* 功  能 : 更新LCD显示信息
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> 后台调用
********************************************************************************************************/
#if LCD_GRH_EN > 0 || LCD_TXT_EN > 0

static void LCDDispUpdata (void)
{
    INT8U x=0;
    INT8U y=0;


#if   LCD_GRH_EN > 0  && LCD_TXT_EN == 0                         // 只显示图形层
    for (y=0; y<6; y++) {
        for(x=0; x<84; x++) {
            if (LCDDispGrhBuf[y][x] != LCDDispGrhBakBuf[y][x]) { // 比较数据
                LCDDispCtrlSecReg(LCD_DISP_REG_CMD);             // 选择命令寄存器
                LCDDispCtrlDataWr(LCD_DISP_DATA_BASIC_Y | y);    // 写Y坐标
                LCDDispCtrlDataWr(LCD_DISP_DATA_BASIC_X | x);    // 写X坐标
                LCDDispCtrlSecReg(LCD_DISP_REG_DATA);            // 选择数据寄存器
                LCDDispCtrlDataWr(LCDDispGrhBuf[y][x]);          // 写当然显示数据
            }
        }
    }

    memcpy(LCDDispGrhBakBuf, LCDDispGrhBuf, sizeof(LCDDispGrhBuf));// 保存LCD显示实际内容
#elif LCD_GRH_EN == 0 && LCD_TXT_EN > 0                          // 只显示文本层
    for (y=0; y<6; y++) {
        for(x=0; x<84; x++) {
            if (LCDDispTxtBuf[y][x] != LCDDispTxtBakBuf[y][x]) { // 比较数据 不相等才刷新
                LCDDispCtrlSecReg(LCD_DISP_REG_CMD);             // 选择命令寄存器
                LCDDispCtrlDataWr(LCD_DISP_DATA_BASIC_Y | y);    // 写Y坐标
                LCDDispCtrlDataWr(LCD_DISP_DATA_BASIC_X | x);    // 写X坐标
                LCDDispCtrlSecReg(LCD_DISP_REG_DATA);            // 选择数据寄存器
                LCDDispCtrlDataWr(LCDDispTxtBuf[y][x]);          // 写当然显示数据
                LCDDispTxtBakBuf[y][x] = LCDDispTxtBuf[y][x];    // 
            }
        }
    }
#elif LCD_TXT_EN > 0  && LCD_GRH_EN > 0                         // 相异或关系显示

#endif
}
#endif





#endif
/********************************************************************************************************
*                                             END  OF  FILE
********************************************************************************************************/

⌨️ 快捷键说明

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