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

📄 lcd.c

📁 手机液晶3310驱动程序的中文说明
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************************************
* 文 件 名 : lcd.c
* 程 序 员 : (CaiJie) hnclcj@gmail.com
*                             (c) Copyright 2006-2006, CaiJie
*                                所有版权保留 2006-2006
*                                  All Rights Reserved
* 创建日期 : 2006-07-28
* 说    明 : Nokia 3310 显示LCD驱动函数集
*            1> 只简单的实现现实字符跟字符串 因这是测试版 很多函数我已经处理掉 但可是做基本的测试
*            2> 含标准图形驱动方式 (支持基本的图形操作)
*            3> 简化后的文本驱动方式 (只显示文本形式的信息时只调用此函数集即可)
*            4> 如果对程序中的一些问题 可以自己解决 也可以发邮件告诉我你更好的想法(邮箱见程序员说明)
*            5> 目前支持51(待加) AVR ARM(待加)驱动
* 修改日期 :
* 修改版本 :
********************************************************************************************************/


#define  LCD_GLOBALS
#include "includes.h"

#if LCD_MODULE_EN > 0
#include "FONT_MACRO.h"

#if LCD_GRH_EN > 0 || LCD_TXT_EN > 0
#include "Font.h"
#endif


/********************************************************************************************************
* 本地常数
********************************************************************************************************/
                                                  // ----------------LCD常用的命令集--------------------
#define LCD_DISP_CMD_EXT            0x21          // 扩展命令设置LCD模式
#define LCD_DISP_CMD_VOLTAGE        0xc8          // 设置偏置电压
#define LCD_DISP_CMD_TEMP           0x06          // 温度校正
#define LCD_DISP_CMD_48             0x13          // 1:48
#define LCD_DISP_CMD_BASIC          0x20          // 基本命令
#define LCD_DISP_CMD_MODE_NATURAL   0x0c          // 正常显示方式
                                                  // ----------------------常数--------------------------
#define LCD_DISP_DATA_BASIC_X       0x80          // x 方向起始的基本地址
#define LCD_DISP_DATA_BASIC_Y       0x40          // y 方向起始的基本地址
                                                  // --------------------其他定义------------------------
#define LCD_DISP_REG_CMD            0             // 命令寄存器
#define LCD_DISP_REG_DATA           1             // 数据寄存器


/********************************************************************************************************
* 本地变量
********************************************************************************************************/
#if LCD_GRH_EN > 0
static INT8U LCDDispGrhBuf[6][84];                // 图形实时显示缓存
static INT8U LCDDispGrhBakBuf[6][84];             // 图形备份显示缓存(为了提高刷新LCD的速度)
#endif

#if LCD_TXT_EN > 0
static INT8U LCDDispTxtBuf[6][84];                // 文本实时显示缓存
static INT8U LCDDispTxtBakBuf[6][84];             // 文本备份显示缓存
#endif


/********************************************************************************************************
* 本地函数
********************************************************************************************************/
#if LCD_GRH_EN > 0 || LCD_TXT_EN > 0
static void  LCDDispCtrlDataWr   (INT8U dat);
static void  LCDDispCtrlSecReg   (BOOL  reg);
#endif
#if LCD_GRH_EN > 0
static void  LCDDispGrhInit      (void);
#endif
#if LCD_GRH_EN > 0 || LCD_TXT_EN > 0
static void  LCDDispLock         (void);
#endif
static void  LCDDispInitHard     (void);
static void  LCDDispInitVar      (void);
#if LCD_TXT_EN > 0
static void  LCDDispTxtInit      (void);
#endif
#if LCD_GRH_EN > 0 || LCD_TXT_EN > 0
static void  LCDDispUnLock       (void);
#endif
#if LCD_GRH_EN > 0 || LCD_TXT_EN > 0
static void  LCDDispUpdata       (void);
#endif
#if LCD_TXT_EN > 0
static void  LCDDispTxtWriteChar (INT8U row, INT8U col, char c);
#endif






/********************************************************************************************************
* 功  能 : 写1字节数据到LCD
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/

static void LCDDispCtrlDataWr (INT8U dat)
{
    LCD_SCE_LOW();                                // 使能LCD
    SPDR = dat;                                   // 传送数据到SPI寄存器
    while (!(SPSR & 0x80));                       // 等待数据传送完毕
    LCD_SCE_HIGH();                               // 关闭LCD
}


/********************************************************************************************************
* 功  能 : 选择寄存器 命令/数据 
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> 低为命令寄存器  高为数据寄存器
********************************************************************************************************/

static void LCDDispCtrlSecReg (BOOL reg)
{
    if (reg == LCD_DISP_REG_CMD) {
        LCD_DC_LOW();
    } else {
        LCD_DC_HIGH();
    }
}


/********************************************************************************************************
* 功  能 : 图形方式显示1个unsigned char 的BCD码 两位
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> 目前支持5*7 8*8 等ASCII码 待加功能函数
********************************************************************************************************/
#if LCD_GRH_EN > 0 && LCD_DISP_GRH_BCD_EN > 0

void LCDDispGrhBCD (INT8U x, INT8U y, INT8U dat)
{
    LCDDispLock();                                // 上锁
    x = x;
    y = y;
    c = c;
    LCDDispUpdata();                              // 更新显示
    LCDDispUnLock();                              // 解锁
}
#endif


/********************************************************************************************************
* 功  能 : 图形方式显示1个字符
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> 目前支持5*7 8*8 等ASCII码 待加功能函数
********************************************************************************************************/
#if LCD_GRH_EN > 0 && LCD_DISP_GRH_CHAR_EN > 0

void LCDDispGrhChar (INT8U x, INT8U y, char c)
{
    LCDDispLock();                                // 上锁
    x = x;
    y = y;
    c = c;
    LCDDispUpdata();                              // 更新显示
    LCDDispUnLock();                              // 解锁
}
#endif


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

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


/********************************************************************************************************
* 功  能 : 图形方式显示1个unsigned char 的HEX码
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/
#if LCD_GRH_EN > 0 && LCD_DISP_GRH_HEX_EN > 0

void LCDDispGrhHex (INT8U x, INT8U y, INT8U dat)
{
     LCDDispLock();                               // 上锁
     x   = x;
     y   = y;
     dat = dat;
     LCDispUpdata();
     LCDDispUnLock();                             // 解锁
}
#endif


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

static void LCDDispGrhInit (void)
{
    LCDDispGrhClrScr();                          // 清屏
}
#endif


/********************************************************************************************************
* 功  能 : 图形方式显示1串ASCII字符
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/
#if LCD_GRH_EN > 0 && LCD_DISP_GRH_STR_EN > 0

void LCDDispGrhStr (INT8U x, INT8U y, char *str)
{
    LCDDispLock();                                // 上锁
    x   = x;
    y   = y;
    str = str;
    LCDDispUpdata();                              // 更新显示
    LCDDispUnLock();                              // 解锁
}
#endif


/********************************************************************************************************
* 功  能 : 3310LCD初始化
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/

void LCDDispInit(void)
{
    LCDDispInitHard();                            // LCD硬件逻辑初始化
    LCDDispInitVar();                             // 相关的模块全局变量初始化

#if LCD_GRH_EN > 0
    LCDDispGrhInit();                             // 图形方式相关初始化
#endif

#if LCD_TXT_EN > 0
    LCDDispTxtInit();                             // 文本方式相关初始化
#endif
}



/********************************************************************************************************
* 功  能 : LCD 硬件初始化
* 入  口 : 无
* 返  回 : 无
* 说  明 : 1> 设置基本的工作硬件环境
********************************************************************************************************/

static  void LCDDispInitHard (void)
{
    LCD_DDR_RES_HIGH();                           // 配置RES为输出方向
    LCD_DDR_SCE_HIGH();                           // 配置SCE为输出方向
    LCD_DDR_DC_HIGH();                            // 配置DC为输出方向

    LCDDispDelayNMs(30);                          // 等待电源稳定 这里给出xMS定时

    LCD_RES_LOW();                                // 产生一个让LCD复位的低电平脉冲
    LCDDispDelayNMs(10);                          // Xms的时间 (10)
    LCD_RES_HIGH();                               // 复位脉冲完成

    LCDDispCtrlSecReg(LCD_DISP_REG_CMD);          // 选择是命令寄存器
    LCDDispCtrlDataWr(LCD_DISP_CMD_EXT);          // 使用扩展命令设置LCD模式
    LCDDispCtrlDataWr(LCD_DISP_CMD_VOLTAGE);      // 设置偏置电压
    LCDDispCtrlDataWr(LCD_DISP_CMD_TEMP);         // 温度校正
    LCDDispCtrlDataWr(LCD_DISP_CMD_48);           // 1:48
    LCDDispCtrlDataWr(LCD_DISP_CMD_BASIC);        // 使用基本命令
    LCDDispCtrlDataWr(LCD_DISP_CMD_MODE_NATURAL); // 设定显示模式,正常显示
}


/********************************************************************************************************
* 功  能 : LCD 相关变量初始化
* 入  口 : 无
* 返  回 : 无
* 说  明 : 无
********************************************************************************************************/

static void LCDDispInitVar (void)
{
#if LCD_GRH_EN > 0
    memset(LCDDispGrhBuf,    0x00, sizeof(LCDDispGrhBuf));
    memset(LCDDispGrhBakBuf, 0xff, sizeof(LCDDispGrhBakBuf));
#endif

#if LCD_TXT_EN > 0
    memset(LCDDispTxtBuf,    0x00, sizeof(LCDDispTxtBuf));
    memset(LCDDispTxtBakBuf, 0xff, sizeof(LCDDispTxtBakBuf));
#endif
}


/********************************************************************************************************
* 功  能 : 给LCD显示程序上锁
* 入  口 : 无
* 返  回 : 无

⌨️ 快捷键说明

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