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 + -
显示快捷键?