51 lcd1602使用

LCD 1602 使用

这个显示模块只能显示英文和日文。 使用简单价格便宜。

下面是测试通过的程序,可以直接用

51 lcd1602使用

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>

sbit RS = P1^0;   //定义端口 
sbit RW = P1^1;
sbit EN = P1^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
/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{   
 while(--t);
}
/*------------------------------------------------
 mS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
     
 while(t--)
 {
     //大致延时1mS
     DelayUs2x(245);
	 DelayUs2x(245);
 }
}
/*------------------------------------------------
              判忙函数
------------------------------------------------*/
 bit LCD_Check_Busy(void) 
 { 
 DataPort= 0xFF; 
 RS_CLR; 
 RW_SET; 
 EN_CLR; 
 _nop_(); 
 EN_SET;
 return (bit)(DataPort & 0x80);
 }
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
 void LCD_Write_Com(unsigned char com) 
 {  
// while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_CLR; 
 RW_CLR; 
 EN_SET; 
 DataPort= com; 
 _nop_(); 
 EN_CLR;
 }
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
 void LCD_Write_Data(unsigned char Data) 
 { 
 //while(LCD_Check_Busy()); //忙则等待
 DelayMs(5);
 RS_SET; 
 RW_CLR; 
 EN_SET; 
 DataPort= Data; 
 _nop_();
 EN_CLR;
 }

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
 void LCD_Clear(void) 
 { 
 LCD_Write_Com(0x01); 
 DelayMs(5);
 }
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
 {     
 if (y == 0) 
 	{     
	 LCD_Write_Com(0x80 + x);     //表示第一行
 	}
 else 
 	{      
 	LCD_Write_Com(0xC0 + x);      //表示第二行
 	}        
 while (*s) 
 	{     
 LCD_Write_Data( *s);     
 s ++;     
 	}
 }
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
 {     
 if (y == 0) 
 	{     
 	LCD_Write_Com(0x80 + x);     
 	}    
 else 
 	{     
 	LCD_Write_Com(0xC0 + x);     
 	}        
 LCD_Write_Data( Data);  
 }
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
 void LCD_Init(void) 
 {
   LCD_Write_Com(0x38);    /*显示模式设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/ 
   LCD_Write_Com(0x01);    /*显示清屏*/ 
   LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
   }
   
/*------------------------------------------------
                    主函数
------------------------------------------------*/ 
void main(void) 
{ 
LCD_Init(); 
LCD_Clear();//清屏
while (1) 
 {  
  LCD_Write_Char(7,0,'o');
  LCD_Write_Char(8,0,'k');
  LCD_Write_Char(9,0,'!');
  LCD_Write_String(1,1,"www.iamffs.com.cn");
  while(1);
 }
}

其它示例:

------------------------------------------------------------------

动态显示字符

void main(void) 

unsigned char i; 
unsigned char *p; 


LCD_Init(); 


while (1) 
 {  
 i = 1;  
 p = "www.iamffs.net";  
 LCD_Clear();  
 LCD_Write_String(2,0,"Welcome to");  
 DelayMs(250);   
 while (*p) 
{   
LCD_Write_Char(i,1,*p);   
i ++;   
p ++;   
DelayMs(250);   
}  
  DelayMs(250);  
 }
}


------------------------------------------------------------------

字符移动 左移,右移

void main(void) 

  LCD_Init(); 
  LCD_Clear();//清屏
  LCD_Write_Char(7,0,'o');
  LCD_Write_Char(8,0,'k');
  LCD_Write_String(1,1,"www.iamffs.net");
while (1) 
 {  


  DelayMs(200); 
  LCD_Write_Com(0x18);//左平移画面 0x1C 是右平移
 }
}

------------------------------------------------------------------

变化的动态显示字符

1.显示整体,

2.清除

3.一个个显示出来

void main(void) 

unsigned char i; 
unsigned char *pa,*pb; 


LCD_Init(); 
LCD_Write_Com(0x0f);//光标开,光标闪烁开
while (1) 
 {  
 pa = "Welcome to";
 pb = "www.iamffs.net";  
 LCD_Clear();  
 LCD_Write_String(2,0,pa);  //显示2行信息
 LCD_Write_String(1,1,pb);
 for(i=0;i<8;i++)            //延时2s左右
     DelayMs(250); 
 LCD_Clear();                //清屏显示其他信息
 i = 2; 
 while (*pa)                 //循环输入方式显示2行信息
{   
LCD_Write_Char(i,0,*pa);   
i ++;   
pa ++;   
DelayMs(250);   
}  
 i=1;  
 while (*pb) 
{   
LCD_Write_Char(i,1,*pb);   
i ++;   
pb ++;   
DelayMs(250);   
}  
  DelayMs(250);  
 }
}

你可能感兴趣的:(51 lcd1602使用)