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

📄 lcdbase.c

📁 c8051f040单片机的lcd显示源码。包括三个例程。
💻 C
字号:
//#include "define.h"
#include "LcdBase.h"
#include "string.h"

uchar intBuf[16];

void lcdDelay1ms(uint time, uchar freDiv)		// 延迟1ms * time,大概值
{
	uint i, j, J;
	J = DELAY_LOOP / freDiv;
	for (i=0; i<time; i++)
	{
		for (j=0; j<J; j++);
	}
}

uchar isLcdBusy(void)
{
	uchar result;
	uchar lcdIBPage = SFRPAGE;
	SFRPAGE = CONFIG_PAGE;
	lcd_e = 0;
	lcd_rw = 1;
	lcd_rs = 0;
	P4 = 0xff;
	lcd_e = 1;
	result = P4&0x80;
	lcd_e = 0;
	SFRPAGE = lcdIBPage;
	return result;
}

void lcdWriteCmd(uchar cmd)
{
	uchar lcdWCPage = SFRPAGE;
	SFRPAGE = CONFIG_PAGE;
	while (isLcdBusy() != 0);
	lcd_e = 0;
	lcd_rw = 0;
	lcd_rs = 0;
	P4 = cmd;
	lcd_e = 1;
	lcd_e = 0;
	SFRPAGE = lcdWCPage;
}
/*
void lcdPos(uchar pos)
{
	while (isLcdBusy() != 0);
	lcdWriteCmd(pos | 0x80);
}*/
uchar lcdReadData()
{
	uchar result;
	uchar lcdRDPage = SFRPAGE;
	SFRPAGE = CONFIG_PAGE;
	while (isLcdBusy() != 0);
	lcd_e = 0;
	P4 = 0xff;	
	lcd_rw = 1;
	lcd_rs = 1;
	lcd_e = 1;
	result = P4;
	lcd_e = 0;
	SFRPAGE = lcdRDPage;
	return result;
}

void lcdWriteData(uchar dat)
{
	uchar lcdWDPage = SFRPAGE;
	SFRPAGE = CONFIG_PAGE;
	while (isLcdBusy() != 0);
	lcd_e = 0;
	lcd_rw = 0;
	lcd_rs = 1;
	P4 = dat;
	lcd_e = 1;
	lcd_e = 0;
	SFRPAGE = lcdWDPage;
}


void lcdInit(void)
{
	lcdWriteCmd(0x38);		// 8 bits, 2 lines
	lcdDelay1ms(2, 2);
	lcdWriteCmd(0x08);		// display off, cursor off, cursor blink off
	lcdDelay1ms(2, 2);
	lcdWriteCmd(0x06);		// increment mode, no shifting
	lcdDelay1ms(2, 2);
	lcdWriteCmd(0x01);		// clear all
	lcdDelay1ms(2, 2);
	lcdWriteCmd(0x0c);		// display on, cursor off, cursor blink off
	lcdDelay1ms(2, 2);
}

// 一些高级函数
void lcdDisplay(char *p)
{
	uchar i;
	char *pt = p;
	lcdWriteCmd(0x01);
	lcdWriteCmd(0x80|0x00);
	for (i = 0; i < 15; i++)
	{
		if (*p == '\0')
			break;
		lcdWriteData(*(p++));
	}
	lcdWriteCmd(0x80|0x40);
	for (i = 0; i < 15; i++)
	{
		if (*p == '\0')
			break;
		lcdWriteData(*(p++));
	}
}

void putLong(long inum)
{    
/*将一个int型数据转化成ascii码字符串,结尾以'\0'结束,并将结果存于intBuf(全局变量数组,可在任何地方被调用)*/
	long data t;
 	uchar data c = 0;
	bit flag = 1;
	t = 100000000L;
	for (; c<16; c++)
		intBuf[c] = '\0';
	c = 0;
	if (inum < 0)
	{
		intBuf[0] = '-';
		c++;
		inum = -inum;
	}
	for (; t>=10; t/=10)	//此为将int型转化成字符串算法
	{
		if (t == 10)
		{
			intBuf[c] = inum/t+'0';
			intBuf[++c] = inum%t+'0';
			intBuf[++c] = '\0';
			break;
		}
		if (inum < t&flag)
			continue;
		else	
		{
			flag = 0;
			intBuf[c] = inum/t;
			inum -= (long)(intBuf[c]) * t;
			intBuf[c] += '0';
			c++;
		}
	}
}

void showString(uchar *str, bit line)	//line值为0,显示第一行,line为1,显示第二行
{
	uchar idata  k;
	if (line == 0)	//控制显示在第几行是通过k的地址不同来实现的
	{
		for (k=0x80; k<0x90; k++)
		{
           	if (*str == '\0')	//*str的指针不下移,会执行到k=0x8f为止
			{
				lcdWriteCmd(k);
				lcdWriteData(' ');//显示空格清掉上次显示部分
			}
			else
			{
				lcdWriteCmd(k); 
				lcdWriteData(*str);
				str++;
			}
		}
	}
	if (line == 1)
	{
		for (k=0xc0; k<0xd0; k++)
		{
			if(*str == '\0')
			{
				lcdWriteCmd(k);
				lcdWriteData(' ');
			}
			else	
			{
				lcdWriteCmd(k); 
				lcdWriteData(*str);
				str++;
			}
		}
	}
}

void putDot(uchar fBit)
{
	//将intBuf数组由后向前数第fBit位插入小数点'.',在系统避免用浮点数运算场合下,用long型数据的乘除得到运算结果,再在结果中取小数位
	//比如,32/456结果的显示处理可以如此:将32乘10000,再除以456,将结果(int型数据)用putLong()处理,此时是整数,再调用putDot(4),保留四位小数即可,这样处理比调用浮点运算+浮点显示要快得多
	char idata  t0;
	char idata  pf;
	pf = strlen(intBuf) - fBit;
	if(intBuf[0] != '-')
	{
		if(pf > 0)
		{
			t0 = strlen(intBuf);
			for(pf=t0; pf>t0-fBit; pf--)
			{
				intBuf[pf] = intBuf[pf-1];			
			}
			intBuf[pf] = '.';
		}
		else
		{
			pf = strlen(intBuf) - 1;
			for (t0=fBit+1; t0>=0; t0--,pf--)
			{
				if (pf>=0)
					intBuf[t0] = intBuf[pf];
				else
					intBuf[t0] = '0';
			}
			intBuf[1] = '.';
		}
		
	}
	else
	{
		if (pf > 1)
		{
			t0 = strlen(intBuf);
			for (pf=t0; pf>t0-fBit; pf--)
			{
				intBuf[pf] = intBuf[pf-1];			
			}
			intBuf[pf] = '.';
		}
		else
		{
			pf = strlen(intBuf) - 1;
			for (t0=fBit+2; t0>=1; t0--,pf--)
			{
				if (pf >= 1)
					intBuf[t0] = intBuf[pf];
				else
					intBuf[t0] = '0';
			}
			intBuf[0] = '-';
			intBuf[2] = '.';
		}
	}
}

void showLong(long l, bit line)
{
	putLong(l);
	showString(intBuf, line);
}

void showFloat(float f, uchar fBit, bit line)
{
	int i;
	for (i = 0; i < fBit; i++)
	{
		f *= 10;
	}
	showFloatL(f, fBit, line);
}

void showFloatL(long l, uchar fBit, bit line)
{
	putLong(l);
	putDot(fBit);
	showString(intBuf, line);
}

void showStringAndLong(uchar *str, long inum, bit line)
{
	long data t;
 	uchar data c = 0;
	bit flag = 1;
	t = 100000000L;
	for (; c<16; c++)
		intBuf[c] = '\0';
		
	//字符串数组复制
	for (c=0; *str!='\0'; c++)
	{
		if (*str == ' ')
			intBuf[c] = '\0';
		else
			intBuf[c] = *str;	
		str++;		
	}
	
	//int转换成字符串
	if (inum < 0)
	{
		intBuf[c] = '-';
		c++;
		inum = -inum;
	}
	for (; t>=10; t/=10)	//此为将int型转化成字符串算法
	{
		if (t == 10)
		{
			intBuf[c] = inum/t+'0';
			intBuf[++c] = inum%t+'0';
			intBuf[++c] = '\0';
			break;
		}
		if (inum < t&flag)
			continue;
		else	
		{
			flag = 0;
			intBuf[c] = inum/t;
			inum -= (long)(intBuf[c]) * t;
			intBuf[c] += '0';
			c++;
		}
	}
	showString(intBuf, line);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -