lcd1602显示程序

发表于 2017-10-18 19:37:53 收藏 已收藏
赞(0) •  评论(0

lcd1602显示程序

发表于 2017-10-18 19:37:53

  液晶显示简介

lcd1602显示程序

  ①液晶显示原理

  液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

  ②液晶显示器的分类

  液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。

  ③液晶显示器各种图形的显示原理:

  线段的显示

  点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。

  字符的显示

  用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

  汉字的显示

  汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。

  1602LCD主要技术参数:

  显示容量:16×2个字符

  芯片工作电压:4.5—5.5V

  工作电流:2.0mA(5.0V)

  模块最佳工作电压:5.0V

  字符尺寸:2.95×4.35(W×H)mm

  引脚说明

  第1脚:VSS为地电源。

  第2脚:VDD接5V正电源。

  第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。

  第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

  第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

 

  第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

  第7~14脚:D0~D7为8位双向数据线。

  第15脚:背光源正极。

  第16脚:背光源负极。

  用51单片机编写lcd1602显示程序

  #include 《reg51.h》

  #define uchar unsigned char

  #define uint unsigned int

  sbit LCD_E=P3^5; //定义接口

  sbit LCD_RW=P3^6;

  sbit LCD_RS=P3^7;

  #define LCD_Data P1 //数据接口

  uchar up[]={“IvU,hupeixian”};

  uchar code down[]={“_by fu ”}

  /*************************延时函数*****************************/

  void Delay_ms(uint time)

  {

  uint i,j;

  for(i = 0;i 《 time;i ++)

  for(j = 0;j 《 930;j ++);

  }

  /**********************检测状态************************************/

  uchar LCD_ReadStatus(void)

  {

  LCD_Data = 0xFF;

  LCD_RS = 0;

  LCD_RW = 1;

  LCD_E = 1;

  LCD_E = 1;

  LCD_E = 0;

  while (LCD_Data & 0x80); //检测忙信号

  return(LCD_Data);

  }

  /************************写数据***********************************/

  void LCD_WriteData(uchar WDLCD)

  {

  LCD_ReadStatus();//检测忙

  LCD_Data = WDLCD

  LCD_RS = 1;

  LCD_RW = 0;

  LCD_E = 1;//若晶振速度太高可以在这后加小的延时

  LCD_E = 1;//延时

  LCD_E = 0;

  }

  /************************写指令********************************/

  void LCD_WriteCommand(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测

  {

  if (BuysC)

  LCD_ReadStatus(); //根据需要检测忙

  LCD_Data = WCLCD;

  LCD_RS = 0;

  LCD_RW = 0;

  LCD_E = 1;

  LCD_E = 1;

  LCD_E = 0;

  }

  /*****************初始化***********************************/

  void LCD_Init(void)

  {

  LCD_Data = 0;

  LCD_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号

  Delay_ms(5);

  LCD_WriteCommand(0x38,0);

  Delay5Ms();

  LCD_WriteCommand(0x38,0);

  Delay_ms(5);

  LCD_WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号

  LCD_WriteCommand(0x08,1); //关闭显示

  LCD_WriteCommand(0x01,1); //显示清屏

  LCD_WriteCommand(0x06,1); // 显示光标移动设置

  LCD_WriteCommand(0x0C,1); // 显示开及光标设置

  }

  /***********************显示一个字符********************************/

  void DisplayOneChar(uchar X, uchar Y, uchar DData)

  {

  Y &= 0x1;

  X &= 0xF; //限制X不能大于15,Y不能大于1

  if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;

  X |= 0x80; // 算出指令码

  LCD_WriteCommand(X, 0); //这里不检测忙信号,发送地址码

  LCD_WriteData(DData);

  }

  /************************显示一串字符*******************************/

  void DisplayListChar(uchar X, uchar Y, uchar code *DData)

  {

  uchar ListLength;

  ListLength = 0;

  Y &= 0x1;

  X &= 0xF; //限制X不能大于15,Y不能大于1

  while (DData[ListLength]》0x20) //若到达字串尾则退出

    {

  if (X 《= 0xF) //X坐标应小于0xF

      {

  DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符

  ListLength++;

  X++;

      }

    }

  }

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

  void main(void)

  {

  Delay_ms(400); //启动等待,等LCD讲入工作状态

  LCD_Init(); //LCD初始化

  Delay_ms(5); //延时片刻(可不要)

  DisplayListChar(0, 1, up);

  DisplayListChar(6, 0, down);

  LCD_Data=0xff;

  while(1);

  }

  用16F877A编写lcd1602显示程序

  #include《pic.h》

  #define uchar unsigned char

  #define uint unsigned int

  #define DB PORTD //定义端口

  #define rs RB0 #define e RB1

  __CONFIG(0x3B31);

  const uchar data[]=“happy everyday”;//输入的字符串 第一行

  const uchar data1[]=“xiexie”;//第二行

  void init();

  void write_commond(uchar dat);//写指令函数

  void write_data(uchar dat);//写数据函数

  void delay(uint x);

  void delay(uint x)

  {

  uint a,b;

  for(a=x;a》0;a--)

  for(b=110;b》0;b--); }

  void init()//初始化指令

  {

  write_commond(0x01);//0000000001,清除屏幕显示

  write_commond(0x28);//设置4位格式,2行,5X7,功能设定

  write_commond(0x0C);//0000001100,开显示,无光标,不闪烁

  write_commond(0x06);//0000000110,置输入模式,光标右移,屏幕上的文字不移动

  write_commond(0x14);//0001000100,设定CGRAM地址显示屏或光标移动方向

  }

  void write_commond(uchar dat)

  {

  rs=0;//指令 DB=dat;

  e=1;//允许 下降沿触发1-0

  delay(5);

  e=0;

  DB=DB《《4;//左移四位从RD4~RD7进入LCD

  delay(5);

  e=1; delay(5);

  e=0;

  }

  void write_data(uchar dat)

  {

  rs=1;//数据

  DB=dat;

  e=1;//允许

  delay(5);

  e=0;

  delay(5);

  DB=DB《《4;

  e=1;

  delay(5);

  e=0;

  }

  void main()

  {

  uchar i;

  TRISD=0X00;//定义端口寄存器

  PORTD=0X00;

  PORTB=0X00;

  TRISB=0X00;

  init();

  write_commond(0x80);//第一行的DDRAM的地址,不加0x10时,也可以从//最左边开始

  for(i=0;i《12;i++)

  {

  write_data(data[i]);//第一行的数据字符

  delay(5);

  }

  write_commond(0xc0);//第二行的DDRAM地址不加0x10也可

  for(i=0;i《16;i++)

  {

  write_data(data[i]);//第二行的数据字符

  delay(5);

  }

  /* for(i=0;i《16;i++)

  {

  write_commond(0x18);//光标不动,数据左移一位

  delay(5);

  }*/

  while(1);

  }

  写近一个字符A程序如下:

  #include《pic.h》

  #define uchar unsigned char

  #define uint unsigned int

  #define DB PORTD

  #define rs RB0

  #define e RB1

  __CONFIG(0x3B31);

  void init();

  void write_commond(uchar dat);//写指令函数

  void write_data(uchar dat);//写数据函数

  void disp_char(uchar x,uchar y,uchar dat);//在屏幕某个位置显示一个字符,x(0-16),y(1-2)

  void delay(uint x);

  void delay(uint x)

  {

  uint a,b;

  for(a=x;a》0;a--)

  for(b=110;b》0;b--);

  }

  void init()//初始化指令

  {

  write_commond(0x01);//0000000001,清除屏幕显示

  write_commond(0x28);//设置4位格式,2行,5X7,功能设定

  write_commond(0x0C);//0000001100,开显示,无光标,不闪烁

  write_commond(0x06);//0000000110,置输入模式,光标右移,屏幕上的文字不移动

  write_commond(0x80);//0001000100,设定CGRAM地址显示屏或光标移动方向

  }

  void write_commond(uchar dat)

  {

  rs=0;//指令

  DB=dat;

  e=1;//允许

  delay(5);

  e=0;

  DB=DB《《4;

  delay(5);

  e=1;

  delay(5);

  e=0;

  }

  void write_data(uchar dat)

  {

  rs=1;//数据

  DB=dat;

  e=1;//允许

  delay(5);

  e=0;

  delay(5);

  DB=DB《《4;

  e=1;delay(5);

  e=0;

  }

  void disp_char(uchar x,uchar y,uchar dat)

  {

  uchar address;

  if(y==1) address=0x80+x;

  else

  address=0xc0+x;

  write_commond(address);

  write_data(dat);

  delay(5);

  }

  void main()

  {

  TRISD=0X00;

  PORTD=0X00;

  PORTB=0X00;

  TRISB=0X00;

  init();

  disp_char(0,1,‘A’);

  while(1);

  }

  也可以是如下:

  void disp_char(uchar x,uchar y,uchar dat)

  {

  uchar i;

  write_commond(0x80+x);

  if(i=0;i《16;i++)

  {

  write_data(‘A’);

  delay(5);

  }

  }

收藏

相关话题
文章来源栏目
+关注

评论(0)

加载更多评论

参与评论

分享到

QQ空间 QQ好友 微博
取消