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

📄 lcd.c

📁 用pic单片机做的一个温度计 实现实时时钟显示和存储
💻 C
字号:
#include<p18f452.h>
#include"delays.h"
/**
*   LCD.[R/W]        RC5         1=读   0=写
*   LCD.[R/S]        RC7         1=数据 0=指令
//*   LCD.[E]          RC6         1->0  写数据或指令  1=读数据或指令
*   LCD.[DATA]       PORTD
**/




#define   LCD_Data      PORTD
#define   DIR_Data	    TRISD
#define   DIR_Con	    TRISC
#define   LCD_RS	    PORTCbits.RC5    	// 命令或数据
#define   LCD_WR        PORTCbits.RC6       // 读写控制
#define   LCD_E		    PORTCbits.RC7     // 使能控制



/***********************************************************************
** 函数名称: 	 lcdbusywait()
** 功能描述:     等待液晶空闲
** 输 入: 	 无    
** 输 出:       状态   

***********************************************************************/
/*char lcdbusywait(void)							//等待LCD就绪
{
    char Status;
	LCD_RS=0;
	LCD_WR=1;
	LCD_Data=0xFF;
	LCD_E=1;
	Status=LCD_Data;
	LCD_E=0;
	while(Status & 0x80)
	{
		
		LCD_E=1;
		Status=LCD_Data;
		LCD_E=0;
	}
	LCD_WR=0;
	return Status;
}*/


/***********************************************************************
** 函数名称: 	writedatalcd( char lcd_data)
** 功能描述: 	写入一字节数据
** 输 入: 	    unsigned char lcd_data
** 输 出:             无

***********************************************************************/

void writedatalcd( char date) 
{   
 
  //  lcdbusywait();
    LCD_WR=0;
	LCD_RS= 1;
    Nop();
    Nop();
    LCD_E = 1;
    Nop();
    Nop();
    LCD_Data= date;
	LCD_E = 0;
    
    delays(60,2);  // delay for more than X uS	 
}

/***********************************************************************
** 函数名称: 	 writecmdlcd(char lcd_cmd)
** 功能描述:       send command  
** 输 入: 	      unsigned char LCD_Cmd
** 输 出:             无

***********************************************************************/
void writecmdlcd(char cmd)
{
//	lcdbusywait();
    LCD_WR=0;	
	LCD_RS = 0;
    Nop();
    Nop();
    LCD_E = 1;
    Nop();
    Nop();
    LCD_Data= cmd;
	LCD_E = 0;
    delays(60,2);  // delay for more than X uS	     
}
/*********************************************************************
** 函数名称: 	lcd_initial()
** 功能描述: 	LCD初始化
** 输 入: 	无
** 输 出:      无
** 备注  :
***********************************************************************/
void lcd_initial(void)
{
    DIR_Data = 0x00;

	DIR_Con = DIR_Con&0x1f;
	LCD_E = 0;
	LCD_WR = 0;
	LCD_RS = 0;
    
	writecmdlcd(0x3B);     //数据选择8位
        delays( 60,2 );  

	writecmdlcd(0x3B);     //数据选择8位
        delays( 60,2 );        
	
	writecmdlcd(0x0c);     // 显示开,光标开, 游标位置反白允许
        delays( 60,2 );       	

	writecmdlcd(0x01);     //清屏
	delays( 60,2 );      
	
}

/***********************************************************************
** 函数名称: 	lcd_set_cursor( char CurY,  char CurX)
** 功能描述: 	set position
** 输 入: 	 char CurY,  char CurX
** 输 出:      无
***********************************************************************/
void lcd_set_cursor( char CurY,  char CurX)
{   
	switch(CurY)
	  {
		  case 1:  writecmdlcd(0X80+CurX-1); 
		           break;    // 写入第一行CurX列的地址
		  case 2:  writecmdlcd(0X90+CurX-1);
		           break;    // 写入第二行CurX列的地址
		  case 3:  writecmdlcd(0X88+CurX-1);
		           break;    // 写入第三行CurX列的地址
		  case 4:  writecmdlcd(0X98+CurX-1);
		           break;    // 写入第四行CurX列的地址
		  default: break;
	   }
           
}


/***********************************************************************
** 函数名称: 	putslcd( char *Str)
** 功能描述: 	输出字符串
** 输 入: 	     *Str
** 输 出:           无
***********************************************************************/
void putslcd( char *Str)
{   
   char Str_Temp;
   while (1)
   {
	Str_Temp = *Str ;

		if (Str_Temp != 0x00 )
		   {
			writedatalcd(Str_Temp) ;
			Str ++ ;
		   }
		else
			return ;
   }
}

/***********************************************************************
** 函数名称: 	display_int
** 功能描述: 	在指定位置显示一个整数
** 输 入: 	int intdata   
** 输 出:     
***********************************************************************/
void display_int(int intdata)
{
     char i=0;
     char temp[5];
     char lenghth;
 
   if (intdata==0)
    {
     writedatalcd('0');
    }  

while (intdata>0)
    {
       temp[i]=intdata%10+48;
       intdata/=10;
       i++;
    }
	   
	lenghth = i;  
	   
    for (i=lenghth;i-- ;)
    {
	    writedatalcd(temp[i]);    
	}	   
	   
}

/***********************************************************************
** 函数名称: 	display_float
** 功能描述: 	在指定位置显示一个小数
** 输 入: 	int fltdata   
** 输 出:      
** 备注  :     显示四位小数
***********************************************************************/
void display_float(float fltdata)
{  
    float fltfrag;
    char temp[4];
    char i;
	
    fltfrag = fltdata -(int)fltdata;
	display_int((int)fltdata);
	
	writedatalcd('.');
	
	for (i=0 ;i<4 ;i++)
	{ 
	   fltfrag*=10;
       temp[i]=(int)(fltfrag)+48;
       fltfrag-=(int)fltfrag;

	}
	
	for (i=0 ; i<4; i++)
	{
       writedatalcd(temp[i]);
    }
}
/***********************************************************************
** 函数名称: 	display_float
** 功能描述: 	在指定位置显示一个小数
** 输 入: 	int fltdata   
** 输 出:      
** 备注  :     显示四位小数
***********************************************************************/
void display_float3bit(float fltdata)
{  
    float fltfrag;
    char temp[3];
    char i;
	
    fltfrag = fltdata -(int)fltdata;
	display_int((int)fltdata);
	
	writedatalcd('.');
	
	for (i=0 ;i<3 ;i++)
	{ 
	   fltfrag*=10;
       temp[i]=(int)(fltfrag)+48;
       fltfrag-=(int)fltfrag;

	}
	
	for (i=0 ; i<3; i++)
	{
       writedatalcd(temp[i]);
    }
}



/***********************************************************************
** 函数名称: 	 clearlcd(void)
** 功能描述:     清除液晶显示
** 输 入: 	 无    
** 输 出:       无   

***********************************************************************/
void clearlcd(void)
{

       writecmdlcd(0x01);     //清屏
       delays( 60,5 );      
	
}




⌨️ 快捷键说明

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