《单片机实践项目》之《电子DIY》之基于51单片机LCD1602基本驱动代码

LCD1602程序

#include "lcd1602.h"
#include <intrins.h>

sbit RS = P2^0;   //定义端口 
sbit RW = P2^1;
sbit EN = P2^2;

#define RS_CLR RS=0 
#define RS_SET RS=1

#define RW_CLR RW=0 
#define RW_SET RW=1 

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0


/*
*	函数名称: LCD uS延时函数
*	参数:	  延时数
*	返回值:  无
*/
void delay_us(uchar t)
{
    
       
	while(--t);
}


/*
*	函数名称: LCD mS延时函数
*	参数:	  延时数
*	返回值:  无
*/
void DelayMs(uchar t)
{
    
    
     
	while(t--)
	{
    
    
		 delay_us(245);
		 delay_us(245);
	}
}
         
/*
*	函数名称:  判忙函数
*	参数:	  无
*	返回值:  无
*/
bit LCD_Check_Busy(void) 
{
    
     
	DataPort= 0xFF; 
	RS_CLR; 

	RW_SET; 
	EN_CLR; 
	_nop_(); 
	EN_SET;
	return (bit)(DataPort & 0x80);//D7 1000 0000
}

/*
*	函数名称: 写入命令函数
*	参数:	  命令
*	返回值:  无
*/
void LCD_Write_Com(uchar com) 
{
    
      
//	while(LCD_Check_Busy()); //忙则等待
	DelayMs(5);
	RS_CLR; 
	RW_CLR; 
	EN_CLR;
	DataPort= com; 
	EN_SET; 	
	_nop_(); 
	EN_CLR;
}

/*
*	函数名称:  写入数据函数
*	参数:	  数据
*	返回值:  无
*/
void LCD_Write_Data(uchar Data) 
{
    
     
//	while(LCD_Check_Busy()); //忙则等待
//延时
	DelayMs(5);
	RS_SET; 
	//1

	RW_CLR;
	//0
	EN_CLR;
	//0 
	DataPort= Data; //DB0-7 中转站
	EN_SET; 	
	_nop_();
	EN_CLR;

}

/*
*	函数名称: 清屏函数
*	参数:	  无
*	返回值:  无
*/
void LCD_Clear(void) 
{
    
     
	LCD_Write_Com(0x01); 
	DelayMs(5);
}

/*
*	函数名称:写入字符串函数
*	参数:	  坐标,待写字符串
*	返回值:  无
*/
void LCD_Write_String(uchar x,uchar y,uchar *s) 
{
    
         
	if (y == 0) 
	{
    
         
		LCD_Write_Com(0x80 + x);     //表示第一行
	}
	else 
	{
    
          
		LCD_Write_Com(0xC0 + x);      //表示第二行
	}        
	while (*s) 
	{
    
         
		LCD_Write_Data(*s);     
		s ++;     
	}
}

/*
*	函数名称:Calc写入字符串函数
*	参数:	  坐标,待写字符串
*	返回值:  无
*/
void LCD_Calc_String(uchar posx,uchar posy,uchar *str)
{
    
    
	LCD_Write_Com(0x04);
	if (posy == 0) 
	{
    
         
		LCD_Write_Com(0x80 + posx);     
	}    
	else 
	{
    
         
		LCD_Write_Com(0xC0 + posx);     
	} 

	while (*str=='\0') 
	{
    
         
		LCD_Write_Data(*str);     
		str ++;     
	}       	 	
}

/*
*	函数名称:写入字符函数
*	参数:	  坐标,待写字符
*	返回值:  无
*/
void LCD_Write_Char(uchar x,uchar y,uchar Data) 
{
    
         
	if (y == 0) 
	{
    
         
		LCD_Write_Com(0x80 + x);     
	}    
	else 
	{
    
         
		LCD_Write_Com(0xC0 + x);     
	}        
	LCD_Write_Data( Data);  
}

/*
*	函数名称:初始化函数
*	参数:	  坐标,待写字符
*	返回值:  无
*/
void LCD_Init(void) 
{
    
    
//RS=0 R/W=0 写命令
//RS=1 R/W=0 写数据
//RS=0 R/W=1 读状态
	LCD_Write_Com(0x38);  // 0011 1000  
	DelayMs(5); 
	LCD_Write_Com(0x38); 
	DelayMs(5); 
	LCD_Write_Com(0x38); 
	DelayMs(5); 
	LCD_Write_Com(0x38);  
	LCD_Write_Com(0x08);  // 0000 1000   
	LCD_Write_Com(0x01);  // 0000 0001
	LCD_Write_Com(0x06);  // 0000 0110  
	DelayMs(5); 
	LCD_Write_Com(0x0F);  // 0000 1111
	//
	//  

}

#ifndef __LCD1602_H
#define __LCD1602_H

#include "reg51.h"

#define uint unsigned int 
#define uchar unsigned char

void LCD_Write_Com(uchar com); 
void LCD_Write_Data(uchar Data);
void LCD_Clear(void);
void LCD_Write_String(uchar x,uchar y,uchar *s);
void LCD_Write_Char(uchar x,uchar y,uchar Data);
void LCD_Init(void);
void LCD_Calc_String(uchar posx,uchar posy,uchar *str);
void DelayMs(uchar t);
void delay_us(uchar t);

#endif





猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/107298079