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

📄 lcd.c

📁 128×64液晶屏显示汉字
💻 C
字号:
/*******************************************************************************
程序名称:LCD驱动程序
显示功能:显示ASCII码
硬件接法:D/I---------A0
          R/W---------A1
          E-----------读写0xA000~0xA003时,选中
          CSA---------(前半屏选通,低电平有效)
          CSB---------(后半屏选通,低电平有效)
          DB0~DB7----D0~D7
*******************************************************************************/


#include "Lcd.h"
#include "ASCII.h"
#include "HanZi.h"
#include "uniondef.h"


//定义I/O接口
unsigned char bdata XIO = 0;
#define LCD_SET_CSA()	{XIO|=0x10;XBYTE[0x8000]=XIO;}
#define LCD_CLR_CSA()	{XIO&=0xEF;XBYTE[0x8000]=XIO;}
#define LCD_SET_CSB()	{XIO|=0x20;XBYTE[0x8000]=XIO;}
#define LCD_CLR_CSB()	{XIO&=0xDF;XBYTE[0x8000]=XIO;}


/*******************************************************************************
函数:LcdWaitBusy()
功能:读取LCD的Busy标志,如果LCD忙则等待,如果空闲则返回
说明:每次操作之前都应当确认LCD处于空闲状态
*******************************************************************************/
void LcdWaitBusy()
{
	while ( (XBYTE[0xA002] & 0x80) != 0 );
}


/*******************************************************************************
函数:LcdOn()
功能:打开LCD显示
*******************************************************************************/
void LcdOn()
{
	LcdWaitBusy();
	XBYTE[0xA000] = 0x3F;
}


/*******************************************************************************
函数:LcdOff()
功能:关闭LCD显示
*******************************************************************************/
void LcdOff()
{
	LcdWaitBusy();
	XBYTE[0xA000] = 0x3E;
}


/*******************************************************************************
函数:LcdStartLine()
功能:设置显示起始行
参数:line是行号,取值0~63
*******************************************************************************/
void LcdStartLine(unsigned char line)
{
	LcdWaitBusy();
	XBYTE[0xA000] = line | 0xC0;
}


/*******************************************************************************
函数:LcdSetP()
功能:设置页地址
参数:page取值0~7
*******************************************************************************/
void LcdSetP(unsigned char page)
{
	LcdWaitBusy();
	XBYTE[0xA000] = (page & 0x07) | 0xB8;
}


/*******************************************************************************
函数:LcdSetY()
功能:设置Y地址
参数:y取值0~63
*******************************************************************************/
void LcdSetY(unsigned char y)
{
	LcdWaitBusy();
	XBYTE[0xA000] = (y & 0x3F) | 0x40;
}


/*******************************************************************************
函数:LcdWriteDat()
功能:写显示数据
参数:dat为显示数据
说明:写完后,Y地址自动加1
*******************************************************************************/
void LcdWriteDat(unsigned char dat)
{
	LcdWaitBusy();
	XBYTE[0xA001] = dat;
}


/*******************************************************************************
函数:LcdReadDat()
功能:读显示数据
返回:读到的数据
*******************************************************************************/
/*
unsigned char LcdReadDat()
{
	LcdWaitBusy();
	return XBYTE[0xA003];
}
*/


void _LcdClear_()
{
	unsigned char p,y;
	for ( p=0; p<8; p++ )
	{
		LcdSetP(p);
		LcdSetY(0);
		for ( y=0; y<64; y++ )
		{
			LcdWriteDat(0x00);
		}
	}
}


//定义光标的横纵坐标
unsigned char LcdCursorX;
unsigned char LcdCursorY;


/*******************************************************************************
函数:LcdGotoXY()
功能:把光标移到(x,y)处
参数:(x,y)为屏幕坐标,x=0~15,y=0~4
*******************************************************************************/
void LcdGotoXY(unsigned char x, unsigned char y)
{
	LcdCursorX = x & 0x0F;
	LcdCursorY = y & 0x03;
}


/*******************************************************************************
函数:LcdClear()
功能:LCD清屏
*******************************************************************************/
void LcdClear()
{
	LCD_CLR_CSA();
	_LcdClear_();
	LCD_SET_CSA();
	LCD_CLR_CSB();
	_LcdClear_();
	LCD_SET_CSB();
	LcdCursorX = 0;
	LcdCursorY = 0;
}


/*******************************************************************************
函数:LcdInit()
功能:LCD初始化
*******************************************************************************/
void LcdInit()
{
	LCD_SET_CSA();
	LCD_SET_CSB();
	LcdStartLine(0);
	LcdClear();
	LcdOn();
}


/*******************************************************************************
函数:LcdPutchar()
功能:在LCD上显示ASCII码
*******************************************************************************/
void LcdPutchar(unsigned char c)
{
	unsigned char i;
	unsigned char n;
	unsigned char code *p;
//检查是否为可显示字符
	if ( c < ' ' )	//如果是控制字符
	{
		if ( c == '\r' )	//如果是回车符
		{
			LcdCursorX = 0;
		}
		else if ( c == '\n' )	//如果是换行符
		{
			LcdCursorY++;
			if ( LcdCursorY >= 4 )
			{
				LcdCursorY = 0;
			}
		}
		return;
	}
//计算字符点阵位置
	p = ASCII_TAB + (c - ' ') * 16;
//确定显示位置在左半屏还是右半屏
	if ( LcdCursorX < 8 )
	{
		LCD_CLR_CSB();
//		x = 0;
	}
	else
	{
		LCD_CLR_CSA();
//		x = 64;
	}
//显示ASCII码
	for ( i=0; i<2; i++ )
	{
		LcdSetP(LcdCursorY*2+i);	//设置页地址
		LcdSetY(LcdCursorX*8);		//设置Y地址
		n = 8;
		do
		{
			LcdWriteDat(*p++);		//写入显示数据
		} while ( --n != 0 );
	}
//取消选中
	if ( LcdCursorX < 8 )
	{
		LCD_SET_CSB();
	}
	else
	{
		LCD_SET_CSA();
	}
//光标移到下个位置
	LcdCursorX++;
	if ( LcdCursorX >= 16 )
	{
		LcdCursorX = 0;
		LcdCursorY++;
		if ( LcdCursorY >= 4 )
		{
			LcdCursorY = 0;
		}
	}
}


//显示汉字(小汉字库汉字编码:0x8000~0x80FF)
void LcdPutHZ(unsigned char ch, unsigned char cl)
{
	unsigned char i;
	unsigned char n;
	unsigned char code *p;
	UnionInt hz;
	hz.CharPart.H = ch;
	hz.CharPart.L = cl;
	hz.i -= 0x8000;
//计算字符点阵位置
	p = HanZi_TAB + hz.i * 32;
//确定显示位置在左半屏还是右半屏
	if ( LcdCursorX < 8 )
	{
		LCD_CLR_CSB();
	}
	else
	{
		LCD_CLR_CSA();
	}
//显示汉字
	for ( i=0; i<2; i++ )
	{
		LcdSetP(LcdCursorY*2+i);	//设置页地址
		LcdSetY(LcdCursorX*8);		//设置Y地址
		n = 16;
		do
		{
			LcdWriteDat(*p++);		//写入显示数据
		} while ( --n != 0 );
	}
//取消选中
	if ( LcdCursorX < 8 )
	{
		LCD_SET_CSB();
	}
	else
	{
		LCD_SET_CSA();
	}
//光标移到下个位置
	LcdCursorX += 2;
	if ( LcdCursorX >= 16 )
	{
		LcdCursorX = 0;
		LcdCursorY++;
		if ( LcdCursorY >= 4 )
		{
			LcdCursorY = 0;
		}
	}
}

⌨️ 快捷键说明

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