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

📄 lcd.c

📁 F040 的一些软件学习
💻 C
字号:
/*************************************************/

/**************液晶显示屏*******************/

/***************2003年1月20日*******************/

/************WROTE BY WANGSW********************/





#include <absacc.h>			/*XBYTE绝对外部内存空间头文件*/
#include <string.h>
#include <intrins.h>
#include "define.h"
#include "ascii.h"
#include "lcd.h"


#ifdef DP_51
#define WLCD XBYTE[0xF800]		/*r定义WLCD为写LCD的内容*/
#define RLCD XBYTE[0xF801]		/*r定义RLCD为读LCD的内容*/
#define RS XBYTE[0xF802]		/*对于TG19264A1,RS=0为命令,RS=1为数据*/
#endif

#ifdef TG19264
#define MAX_COLUMN 			64
#define MAX_PAGE      		8
#endif


#define SendCtr(value)	RS = 0; RS = 0; WLCD = value;
#define SendData(value)	RS = 1; RS = 1; WLCD = value;

/*******************************************************************/
//static void SendCtr(byte value);
//static void SendData(byte value);
static void SetPage(byte value);
static void SetColumn(byte value);
static void InitTg19264(void);




/******************************************************************************************
*函数名:		SetPage
*参数:			value			设置的页码值,从0~7有效
*返回值:		无
*描述:			对于TG19264液晶屏,设置当前操作的页码值
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
static void SetPage(byte value)
{
#ifdef TG19264
	SendCtr(0xB8 + value);
#endif
}


/******************************************************************************************
*函数名:		SetColumn
*参数:			value			设置的X坐标位置,从0~63有效
*返回值:		无
*描述:			设置当前液晶屏操作的X坐标位置
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
static void SetColumn(byte value)
{
#ifdef TG19264
	SendCtr(0x40 + value);
#endif
}


/******************************************************************************************
*函数名:		InitTg19264
*参数:			无
*返回值:		无
*描述:			初始化液晶屏Tg19264,对液晶屏从DDRAM中哪一行开始显示数
				据以及设置初始的页码值和X坐标位置
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
static void InitTg19264(void)
{
	SendCtr(0xC0);		/*起始显示DDRAM行(D5-D0)为第0行*/
	SendCtr(0xB8);		/*起始页位置(D2-D0)为第0页*/
	SendCtr(0x40);		/*X方向起始位置(D5-D0)为0*/
}


/******************************************************************************************
*函数名:		lcd_init
*参数:			无
*返回值:		无
*描述:			液晶屏初始化程序,主要是清屏,开显示
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void lcd_init(void)
{
#ifdef TG19264
	InitTg19264();
#endif
	lcd_clear();
	SendCtr(0x3F);		/*显示ON/OFF	D0*/
}


/******************************************************************************************
*函数名:		lcd_clear
*参数:			无
*返回值:		无
*描述:			LCD清屏程序
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void lcd_clear(void)					
{
	byte page;
	byte column;

	for(page = 0; page < MAX_PAGE; page++)
	{
		RS = 0;				/*r发送命令*/
		WLCD = 0xB8 + page;		/*r设置清空的页码*/
		_nop_();
		WLCD = 0x40;			/*r设置清空的X坐标起始位置为0*/
		_nop_();
		RS = 1;				/*r发送数据*/
		_nop_();
		for(column = 0; column < MAX_COLUMN; column++)
		{
			WLCD = 0x00;		/*r相应显示寄存器清零*/
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}
	}
}


/******************************************************************************************
*函数名:		lcd_display_graphic
*参数:			XStart		X轴起始位置,为像素点位置
				YStart		Y轴起始位置,为像素点位置
				Width		图像宽度像素值
				Height		图像高度像素值
				bReverseDisplay		标识是否反显
				GraphicIndex		图像显示索引
*返回值:		无
*描述:			显示一幅图像的程序
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
 extern void lcd_display_graphic(				/*为整个PAGE显示,不能任意位置*/
							 	byte XStart,
							 	byte YStart,
							 	byte Width,
							 	byte Height,
							 	bool bReverseDisplay,
							 	byte GraphicIndex)                        
{	
	byte PageCounter;		/*页计数值*/
	byte ColumnCounter;		/*X位置计数值*/
	byte PageStart;			/*起始页码*/
	byte PageEnd;			/*终止页码*/
	byte code *pGraphic;	/*指向发送显示数据的指针*/

	pGraphic = g_Graphic[GraphicIndex];	/*r取出要显示的图像区头地址给指针pGraphic*/
	PageStart = YStart >> 3;		/*r由于是整页显示,不能随意位置,所以指定除8*/
	PageEnd = (YStart + Height) >> 3;

	
	for(PageCounter = PageStart; PageCounter < PageEnd; PageCounter++)
	{
		SetColumn(XStart);
		SetPage(PageCounter);
		RS = 1;
		for(ColumnCounter = 0; ColumnCounter < Width; ColumnCounter++)
		{
			if(!bReverseDisplay)
			{
				WLCD = *pGraphic++;		/*r正常显示,白屏黑字*/
			}
			else
			{
				WLCD = ~(*pGraphic++);	/*r反转显示,黑屏白字*/
			}	
		}
	}
}


/******************************************************************************************
*函数名:		lcd_display_char
*参数:			XStart				开始显示的X坐标像素值
				YStart				开始显示的Y坐标像素值
				bReverseDisplay		标识是否反显,1为反显,0为不反显
				character			显示字符的ASCII码表值
*返回值:		无
*描述:			字符显示程序
*编写:			王绍伟
*版本信息:		V1.0				2003年8月15日
******************************************************************************************/
extern void lcd_display_char(				/*为整个PAGE显示,不能任意位置*/
						 	byte XStart,
						 	byte YStart,
						 	bool bReverseDisplay,
						 	byte character)                        
{	
	byte PageCounter;		/*页标志*/
	byte ColumnCounter;		/*X位置标志*/
	byte PageStart;			/*起始页码*/
	byte PageEnd;			/*终止页码*/
	byte code *pChar;		/*指向字符存放数据(按page划分存储)区的指针*/

	pChar = g_ASCII[character-0x20];	/*r根据ASCI码表,*/
	PageStart = YStart >> 3;		/*r由于是整页显示,不能随意位置,所以指定除8*/
	PageEnd = PageStart + 2;		/*r一个字符在纵向占两个page*/
	
	for(PageCounter = PageStart; PageCounter < PageEnd; PageCounter++)
	{
		SetColumn(XStart);
		SetPage(PageCounter);

		RS = 1;
		for(ColumnCounter = 0; ColumnCounter < 8; ColumnCounter++)	/*r一个字符在横向占8列*/
		{
			if(!bReverseDisplay)
			{
				WLCD = *pChar++;
			}
			else
			{
				WLCD = ~(*pChar++);
			}
		}
	}
}


/******************************************************************************************
*函数名:		lcd_display_text
*参数:			XStart			字符串开始X坐标像素值
				YStart			字符串开始Y坐标像素值,实际得按照page显示
				bReverseDisplay	标识是否反显
				pText			指向字符串ASCII码存放首址的指针
*返回值:		无
*描述:			显示小于8个字符的字符串文本
*编写:			王绍伟
*版本信息:		V1.0			2003年8月15日
******************************************************************************************/
extern void lcd_display_text( byte XStart,
 							 byte YStart, 
 							 bool bReverseDisplay,
 							 byte* pText)
{
	byte i;
	byte len;
	len = strlen(pText);
	if(len > 8)
	{
		len = 8;
	}
	for(i = 0; i < len; i++)
	{
		lcd_display_char(XStart + i * 8, YStart, bReverseDisplay, *pText++);
	}
}


/******************************************************************************************
*函数名:		lcd_display_byte
*参数:			XStart
				YStart
				bHex			标识是否为十六进制数据
				bReverseDisplay	标识是否反显
				value
*返回值:		无
*描述:			在LCD液晶屏上显示一个字节的内容,若此字节中数标识用
				十六进制显示,则其中字节的高四位为				一个字符的ASCII码
				值,低四位又是另外一个字符的ASCII码字
*编写:王绍伟
*版本信息:V1.0			2003年8月15日
******************************************************************************************/
extern void lcd_display_byte(byte XStart,
 							 byte YStart, 
 							 bool bHex,
 							 bool bReverseDisplay,
 							 byte value)
 {
	 byte Shift;		/*暂存余数*/
	 byte Result;		/*暂存除得结果值*/

	 if(bHex)
	 {
		lcd_display_char(XStart + 8, YStart, bReverseDisplay, g_Data2Char[value&0x0F]);
		lcd_display_char(XStart, YStart, bReverseDisplay, g_Data2Char[value>>4]);
	 }
	 else
	 {
	 	Shift = value % 100;
	 	Result = value / 100;
	 	if(Result)
	 	{
	 		lcd_display_char(XStart, YStart, bReverseDisplay, g_Data2Char[Result]);
	 	}
	 	Result = Shift / 10;
	 	Shift = Shift % 10;
	 	if(Result)
		{
			lcd_display_char(XStart + 8, YStart, bReverseDisplay, g_Data2Char[Result]);
	 	}	
		lcd_display_char(XStart + 16, YStart, bReverseDisplay, g_Data2Char[Shift]);
	 }
 }

⌨️ 快捷键说明

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