lcd1.c

来自「这是一段开始学单片机时写的LCD程序」· C语言 代码 · 共 213 行

C
213
字号
#include<reg51.h>	        //包含常用头文件
#include<stdio.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char	   //定义常用数据类型
int cnt;
void LCD_INIT(void);		   //LCD的初始化函数
void LCD_DISPLAY_STR(uchar x,uchar y,char *DATA);//在指定的位置显示字符串
void LCD_CLR(uchar y);							 //清除LCD指定的行
void LCD_SEND_COMMAND(uchar COMMAND);			 //向LCD发送命令
void LCD_SEND_DATA(uchar DATA);					 //向LCD发送数据
void LCD_WAIT(void);	                         //检查LCD空闲
uchar LCD_GET_FLAG(void);						 //检查LCD状态
/*定义所要显示的数据*/
char code PLAY_1[]="Finished time:";
char code PLAY_2[]="2007.07.23.21:16";
char code PLAY_3[]="desiger:";
char code PLAY_4[]="Li Xijang";
char code PLAY_5[]="When I finish it";
char code PLAY_6[]="I very happy!";
/*定义LCD控制字*/
#define LCD_MODE 0x3C        /* 接口数据8位,显示2行,字体为1号 */          
#define LCD_NO_FLASH 0x0C    /* 屏幕显示开,无光标 */        
#define LCD_HIDE 0x08        /* 屏幕显示关 */       
#define LCD_FLASH 0x0D       /* 屏幕显示开,并打开闪烁光标 */    
#define LCD_SHIFT 0x07       /* 模块数据输入为增量方式,显示内容移动 */      
#define LCD_NO_SHIFT 0x06    /* 模块数据输入为增量方式,显示光标移动 */     
#define LCD_SH 0x14          /* 移动光标及整体显示 */ 
#define LCD_LINE1  0x80		 /*第一行DDRAM起始地址*/
#define LCD_LINE2  0xc0		 /*第二行DDRAM起始地址*/
#define SEND_IN  XBYTE[0xff00] /*定义LCD的实际地址*/
sbit LCD_RS=P3^4;			   //定义LCD的RS控制位
sbit LCD_RW=P3^5;			   //定义LCD的RW控制位
//*************************************************
//LCD显示字符串的主程序
//利用中断间隔循环显示
//
//*************************************************  
main()
{
TMOD=0x02;					  //设置中断T0工作于方式2(自动装载)
TH0=0x06;
TL0=0X06;
TR0=1;
ET0=1;
EA=1;
LCD_INIT();					  //初始化LCD
LCD_DISPLAY_STR(1,1,PLAY_1);  //在第一行显示第一行字符串
LCD_DISPLAY_STR(1,2,PLAY_2);  //在第二行显示第一行字符串
while(1);					  //等待中断
}
void timer0(void) interrupt 1 using 0  //进入中断T0函数
{
cnt++;
if(cnt==4000)					   //使蟒显示停留1S
   {							   //清除LCD第一行
     LCD_CLR(1);				   //清除LCD第二行
   	 LCD_CLR(2);
	 LCD_DISPLAY_STR(1,1,PLAY_3);	//在第一行显示第三行字符串
	 LCD_DISPLAY_STR(1,2,PLAY_4); 	//在第一行显示第四行字符串
   }
if(cnt==8000)
   {
     LCD_CLR(1);				   //清除LCD第一行
   	 LCD_CLR(2);				   //清除LCD第二行
	 LCD_DISPLAY_STR(1,1,PLAY_5);  //在第一行显示第五行字符串
	 LCD_DISPLAY_STR(1,2,PLAY_6);  //在第一行显示第六行字符串
   }
if(cnt==12000)
   {
     cnt=0;
     LCD_CLR(1);					//清除LCD第一行
   	 LCD_CLR(2);					//清除LCD第二行
	 LCD_DISPLAY_STR(1,1,PLAY_1);
	 LCD_DISPLAY_STR(1,2,PLAY_2); 
   }
}
//*************************************************
//函数功能:LCD初始化
//输入变量:无
//输出变量:无
//调用模块:LCD_SEND_COMMAND(),LCD_CLR()
//*************************************************
void LCD_INIT(void)
  {								   
   LCD_SEND_COMMAND(LCD_MODE);	   //设置工作方式
   LCD_SEND_COMMAND(LCD_NO_FLASH); //设置显示方式
   LCD_SEND_COMMAND(LCD_NO_SHIFT); //设置光标画面滚动方式
   LCD_SEND_COMMAND(LCD_SH);	   //设置输入方式
   LCD_CLR(1);					   //清除LCD第一行
   LCD_CLR(2);					   //清除LCD第二行
    }
//*************************************************
//函数功能:清除LCD指定行
//输入变量:y
//输出变量:无
//调用模块:LCD_SEND_COMMAND(),LCD_SEND_DATA()
//************************************************* 
void LCD_CLR(uchar y)
   {
    uchar i;
	i=0;
	if(y==1)
	    {
		 LCD_SEND_COMMAND(LCD_LINE1);  //发送命令使LCD指向第一行
		 i=16;
		 }
    if(y==2)
	    {
		 LCD_SEND_COMMAND(LCD_LINE2);  //发送命令使LCD指向第二行
		 i=16;
		 }
	 if(i!=0)
		 {
		  do
		   {
		    LCD_SEND_DATA(' ');		   //让LCD的相应位置显示空格
		   }while(--i!=0);
     }
 }
//*************************************************
//函数功能:向LCD发送命令
//输入变量:COMMAND
//输出变量:无
//调用模块:LCD_WAIT()
//*************************************************
void LCD_SEND_COMMAND(uchar COMMAND)
{
  LCD_WAIT();	 //等待空闲
  LCD_RS=0;		 //命令方式
  LCD_RW=0;		 //写方式
  SEND_IN=COMMAND;//写实际的命令到LCD
}
//*************************************************
//函数功能:向LCD发送数据
//输入变量:DATA
//输出变量:无
//调用模块:LCD_WAIT()
//*************************************************
void LCD_SEND_DATA(uchar DATA)
{
  LCD_WAIT();  //等待空闲
  LCD_RS=1;	   //数据方式
  LCD_RW=0;	   //写方式
  SEND_IN=DATA;//写实际的数据到LCD
}
//*************************************************
//函数功能:等待LCD空闲
//输入变量:无
//输出变量:无
//调用模块:LCD_GET_FLAG()
//*************************************************
void LCD_WAIT(void)
{
 uchar i;
 i=1000;  //定义等待时间,可以防止由于LCD损坏而使程序死循环
 do
   {
   	if((LCD_GET_FLAG()&0x80)==0) //判断BF是否为0
       {
	    break; 
		 }
	 }while(--i!=0); 

}
//*************************************************
//函数功能:检查LCD状态
//输入变量:无
//输出变量:LCD显示的当前状态
//调用模块:无
//*************************************************
uchar LCD_GET_FLAG(void)
{
  LCD_RS=0;
  LCD_RW=1;
  return(SEND_IN);
}
//*************************************************
//函数功能:检查LCD状态
//输入变量:无
//输出变量:LCD显示的当前状态
//调用模块:无
//*************************************************
void LCD_DISPLAY_STR(uchar x,uchar y,char *DATA)
{
 if(y==1)
    {
	 if(x<(16+1))		   //判断显示位置是否超出第一行
	    {
		 LCD_SEND_COMMAND(LCD_LINE1-1+x);//发送显示位置命令
		 for(;x<(16+1)&&*DATA!='\0';x++)
		   {
		   	LCD_SEND_DATA(*DATA++);		 //发送数据
		    }
		 if(*DATA!='\0')				 //判断是否发送完毕
		     {
			  x=1;
			  y=2;						 //未完毕转到第二行显示
			  }
		 }
     }
 if(y==2)
    {
	 LCD_SEND_COMMAND(LCD_LINE2-1+x);
	 for(;x<(16+1)&&*DATA!='\0';x++)
	   {
	   	LCD_SEND_DATA(*DATA++);
	    }
	  }
}


⌨️ 快捷键说明

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