📄 lcm.c
字号:
/******************************************************************************
* Lcm.c
* Created by : Chen huahai
* Created Date: 2004.03.01
* Copyright(c) ShenZhen WeiHua Tech Ltd.
* Decription:
******************************************************************************/
#include "ecrsys.h"
#include "ftype.h"
#include "data.h"
#include "sysdata.h"
#include "keydef.h"
#include <string.h>
#include <stdarg.h>
#include "lcm.h"
#include <stdio.h>
//#include "menu.h"
#define DisCursorFlushInt() // (tb0ic = 0)
#define EnCursorFlushInt() // (tb0ic = 0x03)
void Lcm_Write(byte sendData, byte flag);
void Lcm_Cs(byte flag);
void Lcm_WriteDot(byte x, byte y, byte disp_data);
void Lcm_ReInit(void);
void Lcm_ScrollBar(byte posX, byte len, byte top, byte bottom, byte posY, byte set);
void Lcm_PopFrame(byte posX, byte posY, byte height, byte width, byte type, byte op);
/********************************************************************************
* 函数说明: wirte data or instruction to lcd module
* 输入参数: void
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_Write(byte sendData, byte flag)
{
byte i;
LCM_RS = flag;
LCM_EN = 1;
LCM_PORT = sendData;
if (G_FOSC == 14)
for (i=0; i<1; i++); // 14.32M晶振,延时,否则LCM显示不正常.
LCM_EN = 0;
}
/*
#define Lcm_Write(sendData, flag) { \
LCM_EN = 1; \
LCM_RS = flag; \
LCM_PORT = sendData; \
LCM_EN = 0; \
}
*/
/********************************************************************************
* 函数说明: select lcd module CS
* 输入参数: flag -- cs0 / cs1 / cs2
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_Cs(byte flag)
{
switch (flag)
{
case CS0: // Chip Select the first chip of LCD controller.
// case 0:
LCM_CS0 = 0;
LCM_CS1 = 1;
LCM_CS2 = 1;
break;
case CS1:
// case 1:
LCM_CS0 = 1;
LCM_CS1 = 0;
LCM_CS2 = 1;
break;
case CS2:
LCM_CS0 = 1;
LCM_CS1 = 1;
LCM_CS2 = 0;
break;
case LCD_CS_OFF: // Off-Select the LCD controller chip.
LCM_CS0 = 0;
LCM_CS1 = 0;
LCM_CS2 = 0;
break;
default:
break;
}
}
/********************************************************************************
* 函数说明: write dot data to LCD module
* 输入参数:
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_WriteDot(byte x, byte y, byte disp_data)
{
DisCursorFlushInt(); // 关闭定时中断,防止冲突.
Lcm_mirror[y][x] = disp_data;
// Lcm_Cs(LCD_CS_OFF);
if (x < 64)
{
Lcm_Cs(CS0);
Lcm_Write(SET_X_ADDRESS|y, LCD_INST);
Lcm_Write(SET_Y_ADDRESS|x, LCD_INST);
Lcm_Write(disp_data, LCD_DATA);
}
else if (x < 128)
{
Lcm_Cs(CS1);
x = x-64;
Lcm_Write(SET_X_ADDRESS|y, LCD_INST);
Lcm_Write(SET_Y_ADDRESS|x, LCD_INST);
Lcm_Write(disp_data, LCD_DATA);
}
else
{
Lcm_Cs(CS2);
x = x - 128;
Lcm_Write(SET_X_ADDRESS|y, LCD_INST);
Lcm_Write(SET_Y_ADDRESS|x, LCD_INST);
Lcm_Write(disp_data, LCD_DATA);
}
// Lcm_Cs(LCD_CS_OFF);
EnCursorFlushInt();
}
/********************************************************************************
* 函数说明: clear LCD defined line
* 输入参数: startLine: 0 ~ 7; num: 1 ~ 8;
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_ClrLine(byte startLine, byte num, byte rev)
{
byte j;
byte k;
byte temp = 0;
if (rev == TRUE)
{
temp = 0xff;
}
Lcm_ReInit();
// memset(Lcm_mirror[startLine], 0, num*LCMLIMIT);
for (j=0; j<num; j++)
{
for (k=0; k<LCMLIMIT; k++)
{
// Lcm_WriteDot(k, startLine, temp);
if ((k % 64) == 0)
Lcm_WriteDot(k, startLine, temp);
else
{
Lcm_mirror[startLine][k] = temp;
Lcm_Write(temp, LCD_DATA);
}
}
startLine++;
}
Lcm_Cs(LCD_CS_OFF);
}
/********************************************************************************
* 函数说明: clear LCD defined line
* 输入参数: startLine: 0 ~ 7; num: 1 ~ 8;
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_ClrLineCn(byte startLine, byte LineNum, byte rev)
{
byte j;
byte k;
byte temp = 0;
if(((CurrMode == REGISTER)||(CurrMode == TRAINING))&&(work_mode == RSNT)
&&(CurrMode != NULL)&&(NewTrans)&&(!Cash_flag))
{
if(startLine+LineNum == MAX_DISP_LINE)
LineNum--;
Lcm_clr_set(3, 0, MAX_DISP_LEN - 3, rev);
if(startLine == MAX_DISP_LINE -1)
return;
}
if (rev == TRUE)
{
temp = 0xff;
}
Lcm_ReInit();
// memset(Lcm_mirror[startLine], 0, num*LCMLIMIT);
LineNum *= 2;
startLine *= 2;
for (j=0; j<LineNum; j++)
{
for (k=0; k<LCMLIMIT; k++)
{
// Lcm_WriteDot(k, startLine, temp);
if ((k % 64) == 0)
Lcm_WriteDot(k, startLine, temp);
else
{
Lcm_mirror[startLine][k] = temp;
Lcm_Write(temp, LCD_DATA);
}
}
startLine++;
}
Lcm_Cs(LCD_CS_OFF);
}
/********************************************************************************
* 函数说明: re Initial LCD
* 输入参数: void
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_ReInit(void)
{
Lcm_Cs(CS0);
Lcm_Write(LCM_ON, LCD_INST);
Lcm_Write(RAM_START_LINE, LCD_INST);
Lcm_Cs(CS1);
Lcm_Write(LCM_ON, LCD_INST);
Lcm_Write(RAM_START_LINE, LCD_INST);
Lcm_Cs(CS2);
Lcm_Write(LCM_ON, LCD_INST);
Lcm_Write(RAM_START_LINE, LCD_INST);
// LcmBlOn();
}
void Lcm_Close(void)
{
Lcm_Cs(CS0);
Lcm_Write(LCM_OFF, LCD_INST);
Lcm_Cs(CS1);
Lcm_Write(LCM_OFF, LCD_INST);
Lcm_Cs(CS2);
Lcm_Write(LCM_OFF, LCD_INST);
LcmBlOff();
Lcm_Cs(LCD_CS_OFF);
}
/********************************************************************************
* 函数说明: Initial LCD
* 输入参数: void
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_Init(void)
{
byte x, y;
#define LCM_RST_DIR pd7_7
#define LCM_RST p7_7
// reset LCM.
// LCM_RST_DIR = 1;
// LCM_RST = 1;
// Wait(5);
// LCM_RST = 0;
// Wait(30);
// LCM_RST = 1;
prc2 = 1;
LCM_CS0_DIR = 1;
prc2 = 1;
LCM_CS1_DIR = 1;
prc2 = 1;
LCM_RS_DIR = 1;
prc2 = 1;
LCM_CS2_DIR = 1;
LCM_EN_DIR = 1;
LCM_PORT_DIR = 0xff;
LCM_RS = 0;
LCM_CS0 = 0;
LCM_CS1 = 0;
LCM_CS2 = 0;
// LcmBlOff();
LCM_BL_DIR = 1;
LcmBlOn();
// g_LcdBLCnt = LCM_BL_TIME;
// Wait(200);
Lcm_Cs(CS0);
Lcm_Write(LCM_ON, LCD_INST);
Lcm_Write(RAM_START_LINE, LCD_INST);
Lcm_Cs(CS1);
Lcm_Write(LCM_ON, LCD_INST);
Lcm_Write(RAM_START_LINE, LCD_INST);
Lcm_Cs(CS2);
Lcm_Write(LCM_ON, LCD_INST);
Lcm_Write(RAM_START_LINE, LCD_INST);
memset(Lcm_mirror[0], 0, 8*LCMLIMIT);
memset(Lcm_mirrorOld[0], 0, 8*LCMLIMIT);
for (y=0; y<8; y++) // Total 8 pages,
{
for (x=0; x<LCMLIMIT; x++) // 128 rows for every page.
{
Lcm_WriteDot(x, y, 0x00);
}
}
// g_LcdBLCnt = LCM_BL_TIME;
// LcmBlOn();
// memset(Lcm_dotBuf, 0, 10);
}
/********************************************************************************
* 函数说明: QC测试: LCD测试--按点行依次显示.
* 输入参数: void
* 输出参数: void
* 返回值: OK / NG
********************************************************************************/
void Qc_LcdTest(void)
{
byte line, col,dotline,dispdata;
byte i;
Lcm_ClrLine(0, 8, FALSE);
for (line=0; line<8; line++) // Total 8 pages,
{
dispdata=0x01;
for (dotline=0; dotline<8; dotline++)
{
for(col=0;col<LCMLIMIT;col++)
Lcm_WriteDot(col,line,dispdata);
dispdata=(dispdata<<1)|0x01;
// Wait(2);
}
}
// Wait(300);
for (i=0; i<6; i++)
{
if ((i % 2) == 0)
{
LcmBlOn();
// Lcm_SetBL(TRUE);
}
else
{
LcmBlOff();
// Lcm_SetBL(FALSE);
}
// Wait(500);
}
LcmBlOn();
// Lcm_SetBL(TRUE);
Lcm_ClrLine(0, 8, FALSE);
}
/********************************************************************************
* 函数说明: 以指定格式显示字符串到指定位置.
* 输入参数: posX -- 行 点起始坐标,
* posY -- 列 点起始坐标.
* font -- 字体: 0(5*7), 1(16*8), 2(sp)
* len -- 字符串长度,0(字符串长度).
* rev -- 是否反显. 0(正常)
* pop -- 是否在弹出窗口显示.
* 输出参数: void
* 返回值: void
* 说明: 暂时不支持非整数行的显示,即行坐标必须为8的倍数.
* 只支持单行显示,超出部分自动抛弃.
********************************************************************************/
void Lcm_Disp(byte *str, byte posX, byte posY, byte len, byte font, byte rev, byte pop)
{
byte tmp_dot_code[32];
byte i, j;
byte dispX = 0, dotIncY = 0;
if (pop == TRUE)
{
posX += lcmPopStX;
posY += lcmPopStY;
}
if ((posX % 8) != 0) // 暂时不支持非整数行的显示.
{
return;
}
if (len == 0)
{
len = strlen(str);
}
for (; (len != 0) && (*str != 0x00); len--)
{
switch (font)
{
case FONT_5: // 5*7
dispX = 1;
dotIncY = 6;
memcpy(tmp_dot_code, &dotBuf5x7[(*str++-0x20)*5], 5);
tmp_dot_code[5] = 0;
break;
case FONT_16: // 16*8
dispX = 2;
dotIncY = 8;
memcpy(tmp_dot_code, &dotBuf16x8[(*str++-0x20)*16], 16);
break;
case FONT_SP: // 特殊小图标. 5*7.
dispX = 1;
dotIncY = 6;
memcpy(tmp_dot_code, &dotBufSp[*str++*6], 6);
break;
default: return;
}
if ((posY + dotIncY) > LCMLIMIT) // 本函数只支持单行显示,超出部分自动抛弃.
{
return;
}
if (rev == TRUE)
{
for (i=0; i < (dotIncY*dispX); i++)
{
tmp_dot_code[i] = ~tmp_dot_code[i];
}
}
for (i=0; i<dispX; i++)
{
if (i != 0)
{
posY -= dotIncY;
}
for (j=0; j<dotIncY; j++)
{
if (posY >= LCMLIMIT) // 本函数只支持单行显示,超出部分自动抛弃.
{
continue;
}
Lcm_WriteDot(posY++, posX/8+i, tmp_dot_code[j+i*8]);
}
}
}
}
/********************************************************************************
* 函数说明: Get dot matrix data for Chinese char
* 输入参数: *obj, qu, wei
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_GetDot(byte qu, byte wei, byte *obj)
{
byte *cfontp;
dword offset;
if (wei < 0xa1)
{
memset(obj, 0, 32);
}
else
{
offset = ((qu - 0xb0) * 94UL + (wei - 0xa1)) * 32;
cfontp = (byte *)(offset + FLS_KOREA_FONT16_BASE);
// 16*16字库(纵向取模).
// 韩文字库: 按纵向排列,倒序的方式从字模3软件转换得来.
memcpy(obj, cfontp, 32);
}
}
/********************************************************************************
* 函数说明: write Chinese Char dot data to LCD module
* Chinese character arrangment:
X <- Bit 0
X <- Bit 1
X <- Bit 2
. . . . .
X <- Bit 7 ===== For Higher half
--------------------------------------------------------------------------------
X <- Bit 0
X <- Bit 1
X <- Bit 2
. . . . .
X <- Bit 7 ===== For Lower half
* 输入参数: x, y,
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_WriteChinese(byte x, byte y, byte *array)
{
byte j, dd;
// 32 byte for every charcter.
Lcm_WriteDot(x++, y, array[0]);
for (j=1; j<16; j++)
{
dd = array[j];
// Lcm_WriteDot(x, y, dd);
if ((x % 64) == 0)
Lcm_WriteDot(x, y, dd);
else
{
Lcm_mirror[y][x] = dd;
Lcm_Write(dd, LCD_DATA);
}
x++;
}
y += 1;
x -= 16;
Lcm_WriteDot(x++, y, array[16]);
for (j=17; j<32; j++)
{
dd = array[j];
// Lcm_WriteDot(x, y, dd);
if ((x % 64) == 0)
Lcm_WriteDot(x, y, dd);
else
{
Lcm_mirror[y][x] = dd;
Lcm_Write(dd, LCD_DATA);
}
x++;
}
Lcm_Cs(LCD_CS_OFF);
}
/********************************************************************************
* 函数说明: Write Chinese format digit & letter to LCD
* dot matrix: 16 * 8
* 输入参数: void
* 输出参数: void
* 返回值: void
********************************************************************************/
void Lcm_WriteChnDigit(byte x, byte y, byte *array)
{
byte j, dd;
// 16 byte for every charcter.
Lcm_WriteDot(x++, y, array[0]);
for (j=1; j<8; j++)
{
dd = array[j];
// Lcm_WriteDot(x, y, dd);
if ((x % 64) == 0)
Lcm_WriteDot(x, y, dd);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -