📄 lcd.c
字号:
* 说 明 : 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 + -