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

📄 lcd.c

📁 基于AT89S51的开发
💻 C
字号:
/**********************************************************************************
  				Copyright(C)桂林电子科技大学电子工程系科技协会  
  							All right reserved
                     
 文 件 名:lcd.c

**********************************************************************************/
#include "lcd.h"


//////////////////////////////////////////////////////////////////////////////////
//本文件的私有函数,外部不可调用
 bool  LCDisBusy();
 bool SendToLCD(uchar dataType,uchar val) ;
 uchar LCDInfo();
 void SendByteToLCD(uchar data1);
 uchar GetByteFromLCD();

/////////////////////////////////////////////////////////////////////////////////
//初始化TS12864A液晶
void InitLCD()                                      
{               
    SendToLCD(FUNCTION, CMD);       
    SendToLCD(DISPLAY_ON_OFF, CMD);
    SendToLCD(ENTRY_MODE, CMD);
    EraseLCD();
}

/*********************************************************************
  函数名称: EraseLCD()
  函数功能: 清屏
  输入参数: 无
  输出参数: 无
  返回值:   无
*********************************************************************/
void EraseLCD()
{
	uint timeout = 0x0aff;

	SendToLCD(0x01, CMD); 

	while (timeout--);
}

/*********************************************************************
  函数名称: SendByteToLCD()
  函数功能: 把一字节发送到LCD
  输入参数: data:	 	要发送的字节
  输出参数: 无
  返回值:   无
*********************************************************************/
void SendByteToLCD(uchar data1)
{
	uchar i;
	
	LCD_CS=1;//
	
	for (i = 0; i < 8; i++)//从高到低传送8位数据
	{
		if (data1 & 0x80)
		{
			LCD_SDA=1;
		}
		else
		{
			LCD_SDA=0;
		}
		
		LCD_CLK=1;
		LCD_CLK=0;
		
		data1 <<= 1;
	}
	
	LCD_CS=0;
}
/*********************************************************************
  函数名称: SendToLCD()
  函数功能: 把数据或命令发送到LCM 
  输入参数: val	 	要发送的数据或命令
  			flag	1:发送数据;0:发送命令
  输出参数: 无    
  返回值:   0:发送失败;1:发送成功
*********************************************************************/
bool SendToLCD(uchar dataType,uchar val)  
{ 
	uint timeout = 0x0366;
	
    
    //if (!timeout)
    //{
    //	return 0;
    //}
    
    while (timeout--);
	
    SendByteToLCD(val);				// 发送写数据命令,1111,E,RW,RS,0	
    
    SendByteToLCD(dataType & 0xf0);				// 发送数据高4位,再发4个0
    SendByteToLCD((dataType&0x0f) << 4);		// 发送数据低4位,再发4个0
    
    return 1;
}
//////////////////////////////////////////////////////////////////////////////////
//在当前位置显示字符串
void DispStr(const uchar *str)
{                          
    while(*str != '\0')
    {
        SendToLCD(*str++, DAT); 
    }        
}

////////////////////////////////////////////////////////////////////////////////
//在特定地址显示字符串
#if (DISP_STR_AT_ENB)
void DispStrAt(const uchar *str, uchar x, uchar y)
{   
    GotoXY(x, y);                        
  	DispStr(str);        
}
#endif

///////////////////////////////////////////////////////////////////////////////
//在当前位置显示数字
#if (DISP_NUM_ENB || DISP_NUM_AT_ENB)  
void DispNum(ulong num)     
{  
    uchar i = 9;
    uchar vec[10];  
    vec[i]  = 0;         
    do
	{
        vec[--i] = num%10 + '0';
        num /= 10;
    }
	while (num!=0);
    
    DispStr( vec + i);     
}
#endif

////////////////////////////////////////////////////////////////////////////////////
//在特定地址显示数字
#if (DISP_NUM_AT_ENB)  
void DispNumAt(ulong num, uchar x, uchar y)     
{  
	GotoXY(x, y);                                                        
	DispNum(num);    
}
#endif

/////////////////////////////////////////////////////////////////////////////////////
//在当前位置显示长度为len的数字(数字向右对齐,左边有空位则补空格)
#if ( DISP_NUM_SPACE_ENB || DISP_NUM_SPACE_AT_ENB)
void DispNumSpace(ulong num, uchar len)
{
	uchar i = 9;
	uchar vec[10] = {' ', ' ', ' ', ' ', ' ', ' ', ' ',' ', ' ', ' '};
	
	vec[9] = '\0';
 
	do
	{
		vec[--i] = num%10 + '0';
		num /= 10;
	}
	while(num);

	len = 9-len;
	DispStr(vec + len);
}
#endif

////////////////////////////////////////////////////////////////////////////////////
//在指定位置显示长度为len的数字(数字向右对齐,左边有空位则补空格)
#if (DISP_NUM_SPACE_AT_ENB)
void DispNumSpaceAt(ulong num, uchar x, uchar y, uchar len)
{   
	GotoXY(x, y);
	DispNumSpace(num, len);
}
#endif

////////////////////////////////////////////////////////////////////////////////////
//在当前位置显示带小数点的数字,数字向左对齐
#if (DISP_NUM_SHIFT_ENB || DISP_NUM_SHIFT_AT_ENB)
void DispNumShift(ulong num, uchar dotPos)
{
	uchar i = 9;
	uchar vec[10];

	vec[9] = '\0';

	do
	{
	    if ( i == 9 - dotPos && dotPos)
		{
           vec[--i] = '.';
		}
		vec[--i] = num%10 + '0';
		num /= 10;
	}
	while(num);

	while(dotPos >= 9-i)
	{
		if (dotPos == 9 - i)
		{
			vec[--i]   = '.';
		}
		vec[--i] = '0';
	}

	DispStr(vec + i);
}
#endif

/*********************************************************************
  函数名称: DispNumShiftAt()
  函数功能: 在指定位置显示带小数点的数字
  输入参数: num:	要显示的数据
  			x:  	水平方向坐标(0 <= x <= 7)
  			y:  	垂直方向坐标(0 <= y <= 3)
  			dotPos: 小数点所在的位置
  输出参数: 无    
  返回值:   无
*********************************************************************/
#if (DISP_NUM_SHIFT_AT_ENB)
void DispNumShiftAt(ulong num, uchar x, uchar y, uchar dotPos)
{
	GotoXY(x, y);
	DispNumShift(num, dotPos);
}
#endif

/*********************************************************************
  函数名称: GotoXY()
  函数功能: 设置当前地址
  输入参数: x:  	水平方向坐标(0 <= x <= 7)
  			y:  	垂直方向坐标(0 <= y <= 3)
  输出参数: 无
  返回值:   无
*********************************************************************/
void GotoXY(uchar x, uchar y)
{  
    uchar addr;
    
    if (y < 2)
    {
    	addr = 0x80 + x + y*16;
    }
    else
    {
    	addr = 0x88 + x + (y-2)*16;
    }
    
    SendToLCD(addr, CMD);   
}

/************************************************************************
* End of file
************************************************************************/

⌨️ 快捷键说明

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