📄 lcd.c
字号:
/********************************************************************************************************
* 文 件 名 : 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 + -