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

📄 lcm.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************************************************************************
 *										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 + -