LCD液晶显示屏显示设计(含转载)

发布于 2022-05-07  866 次阅读


设计思路:

第一行显示,设定的英文拼音

第二行显示,设定的数组

 

仿真器件:

AT89C51

BUTTON

CAP

CRYSTAL

LM016L

RES

RESPACK-8

实现程序:

  #include<reg51.h>
  #include<intrins.h>
  sbit RS=P3^0; 
  sbit RW=P3^1;
  sbit E=P3^2;
  #define  LCD_DB  P1
  unsigned char name[] = {"san guo sha"};
  unsigned char number[] = {"110 119 120"};
  extern unsigned char lcd_r_start();
  extern void lcd_w_cmd(unsigned char com); 
  extern void lcd_w_dat(unsigned char dat);
  extern void lcd_init();
  extern void delayms(unsigned int i);  
  extern void delayus();


  void delayms(unsigned int i)//延时函数
  {
    unsigned char k;
    while(i--)
    for(k=0;k<120;k++);     
  }

  void delayus()       
 {  
  _nop_();
  _nop_();
  _nop_();
 }


  void main()//主函数
  {
    int i;
    int j;
    lcd_init();
    lcd_w_cmd(0x81);
    for(i=0;i<11;i++)
    {
        lcd_w_dat(name[i]);
    }
    lcd_w_cmd(0xc1);
    for(j=0;j<11;j++)
    {
        lcd_w_dat(number[j]);
    }
    while(1);
 }

 unsigned char lcd_r_start()//读取函数 
 {
    unsigned char s;
    RW=1;
    delayus();
    RS=0;
    delayus();
    E=1;
    delayus();
    s=LCD_DB;
    delayus();
    E=0;
    delayus();
    RW=0;
    delayus(); 
    return(s);
 }
  
void lcd_w_cmd(unsigned char com)//写命令函数
{
    unsigned char i;
    do
    {
      i=lcd_r_start();
      i=i&0x80;
      delayms(1);
    }
    while(i!=0);
    RW=0;
    delayus();
    RS=0;
    delayus();
    E=1;
    delayus();
    LCD_DB =com;
    delayus();
    E=0;
    delayus();
    RW=1;
    delayms(50);
}

void lcd_w_dat(unsigned char dat)//写入数据函数
{

    unsigned char i;
    do
    {           
      i=lcd_r_start();               
      i=i&0x80;
      delayms(1);
    }
    while(i!=0);
    RW=0;
    delayus();
    RS=1;
    delayus();
    E=1;
    delayus();
    LCD_DB =dat;
    delayus();
    E=0;
    delayus();
    RW=1;
    delayms(50);
}

void lcd_init()           
{
  lcd_w_cmd(0x3c);                 // 设置工作方式
  lcd_w_cmd(0x0e);                 // 设置光标
  lcd_w_cmd(0x01);                 // 清屏
  lcd_w_cmd(0x06);                 // 设置输入方式
}


 

实现仿真图:

 

实现视频效果:

 

进阶程序:

//程序:ex4_10.c
//功能:LCD液晶显示程序,采用8位数据接口
#include <reg51.h>     //包含头文件reg51.h,定义了51单片机的专用寄存器
#include <intrins.h>   //包含头文件intrins.h,代码中引用了_nop_()函数
//定义控制信号端口
sbit RS=0xb0;                       	//P3.0
sbit RW=0xb1;                       	//P3.1
sbit E=0xb2;                       	//P3.2
//声明调用函数
void lcd_w_cmd(unsigned char com);	//写命令字函数
void lcd_w_dat(unsigned char dat);	//写数据函数
unsigned char lcd_r_start();       	//读状态函数
void lcd_int();		           	//LCD初始化函数
void delay(unsigned int i);		//可控延时函数
void delay1();				//软件延时函数,大约几个机器周期
void main()					//主函数
{
   unsigned char lcd[]="SHEN ZHEN";  
   unsigned char i;
   P1=0xff;                           	//送全1到P0口
   lcd_int();	                   	//初始化LCD
   delay(255);
   lcd_w_cmd(0x83);                   	//设置显示位置
   delay(255);
   for(i=0;lcd[i]!='\0';i++)        	//显示字符串,字符串结束符为'\0'
   {                    
    lcd_w_dat(lcd[i]);
    delay(200);
    }
   while(1);                          	//原地踏步,待机命令
}
  
//函数名:delay1
//函数功能:采用软件实现延时,大约几个机器周期 
//形式参数:无
//返回值:无
void delay1()       
{  
  _nop_();
  _nop_();
  _nop_();
}
//函数名:lcd_int
//函数功能:lcd初始化 
//形式参数:无
//返回值:无
void lcd_int()           
{
  lcd_w_cmd(0x3c);               	//设置工作方式
  lcd_w_cmd(0x0e);               	//设置光标
  lcd_w_cmd(0x01);               	//清屏
  lcd_w_cmd(0x06);               	//设置输入方式
  lcd_w_cmd(0x80);               	//设置初始显示位置
}
//函数名:lcd_r_start
//函数功能:读状态字 
//形式参数:无
//返回值:返回状态字,最高位D7=0,LCD控制器空闲;D7=1,LCD控制器忙
unsigned char lcd_r_start()          
{
  unsigned char s;
  RW=1;				//RW=1,RS=0,读LCD状态
  delay1();
  RS=0;
  delay1();
  E=1;			//E端时序			
  delay1();
  s=P1;				//从LCD的数据口读状态
  delay1();
  E=0;
  delay1();
  RW=0;
  delay1(); 
  return(s);				//返回读取的LCD状态字
}
//函数名:lcd_w_cmd
//函数功能:写命令字
//形式参数:命令字已存入com单元中
//返回值:无
void lcd_w_cmd(unsigned char com)   
{
  unsigned char i;
  do{                           	//查LCD忙操作
    i=lcd_r_start();		//调用读状态字函数
    i=i&0x80;                   	//"与"操作屏蔽掉低7位 
    delay(2);
     }while(i!=0);	           	//LCD忙,继续查询,否则退出循环
  RW=0;
  delay1();
  RS=0;				//RW=0,RS=0,写LCD命令字
  delay1();
  E=1;				//E端时序			
  delay1();
  P1=com;				//将com中的命令字写入LCD数据口
  delay1();
  E=0;
  delay1();
  RW=1;
  delay(255);
}
//函数名:lcd_w_dat
//函数功能:写数据
//形式参数:数据已存入dat单元中
//返回值:无
void lcd_w_dat(unsigned char dat)   
{
  unsigned char i;
  do{			             	//查忙操作
    i=lcd_r_start();		//调用读状态字函数
    i=i&0x80; 		      	//"与"操作屏蔽掉低7位 
    delay(2);            
      }while(i!=0);            	//LCD忙,继续查询,否则退出循环
  RW=0;
  delay1();
  RS=1;				//RW=0,RS=1,写LCD命令字
  delay1();
  E=1;				//E端时序			
  delay1();
  P1=dat;				//将dat中的显示数据写入LCD数据口
  delay1();
  E=0;
  delay1();
  RW=1;
  delay(255);
}
//函数名:delay
//函数功能:实现软件延时
//形式参数:无符号整型变量i,控制空循环的循环次数
//返回值:无
void     delay(unsigned int i) 	   //延时函数
{
  unsigned int k;
	for(k=0;k<i;k++);
}