lcd1602的显示流程及代码
侧边栏壁纸
  • 累计撰写 192,421 篇文章
  • 累计收到 3 条评论

lcd1602的显示流程及代码

admin
2022-12-18 / 0 评论 / 0 阅读 / 正在检测是否收录...

LCD1602是一种工业字符型液晶,能够同时显示16x02即32个字符。LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

1.管脚:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

2.操作时序:读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;

所以对控制器每次进行读写操作前,必须进行读写检测。

3.指令集:LCD_1602 初始化指令小结:

0x38 设置16*2显示,5*7点阵,8位数据接口

0x01 清屏

0x0F 开显示,显示光标,光标闪烁

0x08 只开显示

0x0e 开显示,显示光标,光标不闪烁

0x0c 开显示,不显示光标

0x06 地址加1,当写入数据的时候光标右移

0x02 地址计数器AC=0;(此时地址为0x80) 光标归原点,但是DDRAM中断内容不变

0x18 光标和显示一起向左移动

4.显示地址:LCD1602内部RAM显示缓冲区地址的映射图,00~0F、40~4F分别对应LCD1602的上下两行的每一个字符,只要往对应的RAM地址写入要显示字符的ASCII代码,就可以显示出来。

5.读写时序:时序图1602手册中有,这里不引用了。时序图很重要,编程就是根据时序图设置寄存器,让LCD工作。

lcd1602显示程序代码

 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  // - - 初始化接口

  # define LCD_DB P0 // - - P0 = DB0~DB7

  sbit LCD_RS=P2^0; // - - p2.0 = RS

  sbit LCD_RW=P2^1; // - - p2.1 = RW

  sbit LCD_E=P2^2; // - - p2.2 = E

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  // - - 定义函数

  # define uchar unsigned char

  # define uint unsigned int

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  // - - 定义子程序函数

  void LCD_init(void); // - - 初始化LCD1602函数

  void LCD_write_command(uchar command); // - - 向LCD1602写指令函数

  void LCD_write_data(uchar dat); // - - 向LCD1602写数据函数

  void LCD_set_xy(uchar x,uchar y); // - - 设置LCD1602显示位置 X(0-16),y(1-2)

  void LCD_disp_char(uchar x,uchar y,uchar dat); // - - 在LCD1602上显示一个字符

  void LCD_disp_string(uchar X,uchar Y,uchar *s); // - - 在LCD1602上显示一个字符串

  //void LCD_check_busy(void);//检查忙函数。我没用到此函数,因为通过率极低。

  void LCD_delay_10us(uint n); // - - 10微秒的延时子程序

  void LCD_delay_50us(uint n); // - - 50微秒的延时子程序

  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

  // - - 初始化LCD1602

  void LCD_init(void)

  {

  LCD_delay_10us(20);

  LCD_write_command(0x38); // - - 设置8位格式,2行,5x7

  LCD_delay_10us(5);

  LCD_write_command(0x0c); // - - 整体显示,关光标,不闪烁

  LCD_delay_10us(5);

  LCD_write_command(0x06); // - - 设定输入方式,增量不移位

  LCD_delay_10us(5);

  LCD_write_command(0x01); // - - 清除屏幕显示

  LCD_delay_50us(40);

  }

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

  // - - 向LCD1602写指令

  void LCD_write_command(uchar dat)

  {

  LCD_delay_10us(5);

  LCD_RS=0; // - - 指令

  LCD_RW=0; // - - 写入

  LCD_DB=dat;

  LCD_delay_10us(5);

  LCD_E=1; // - - 允许

  LCD_delay_10us(5);

  LCD_E=0;

  }

  // - - 向LCD1602写数据

  void LCD_write_data(uchar dat)

  {

  LCD_delay_10us(5);

  LCD_RS=1;// - - 数据

  LCD_RW=0;// - - 写入

  LCD_DB=dat;

  LCD_delay_10us(5);

  LCD_E=1;// - - 允许

  LCD_delay_10us(5);

  LCD_E=0;

  }

  // - - 设置显示位置

  void LCD_set_xy(uchar x,uchar y)

  {

  uchar address;

  if(y==1)

  {

  address=0x80+x; // - - 第一行位置

  } else {

  address=0xc0+x; // - - 第二行位置

  }

  LCD_delay_10us(5);

  LCD_write_command(address);

  }

  // - - 显示一个字符函数

  void LCD_disp_char(uchar x,uchar y,uchar dat) // - - LCD_disp_char(0,1,0x38); // - - 显示8

  {

  LCD_set_xy(x,y);

  LCD_delay_10us(5);

  LCD_write_data(dat);

  }

  // - - 显示一个字符串函数

  void LCD_disp_string(uchar x,uchar y,uchar *s)

  {

  LCD_set_xy(x,y);

  LCD_delay_10us(5);

  while(*s!=‘\0’)

  {

  LCD_write_data(*s);

  s++;

  }

  }

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

  /*******检查忙函数*************

  void LCD_check_busy() //实践证明,在我的LCD1602上,检查忙指令通过率极低,以

  { //至于不能正常使用LCD。因此我没有再用检查忙函数。而使

  do //用了延时的方法,延时还是非常好用的。我试了一下,用

  { LCD_E=0; //for循环作延时,普通指令只要1次循就可完成。清屏指令

  LCD_RS=0; //要用200次循环便能完成。

  LCD_RW=1;

  LCD_DB=0xff;

  LCD_E=1;

  }while(LCD_DB^7==1);

  }

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

  void LCD_delay_10us(uint n) // - - 10微秒的延时子程序

  {

  uint i,j;

  for(i=n;i》0;i--)

  for(j=2;j》0;j--);

  }

  void LCD_delay_50us(uint n) // - - 50微秒的延时子程序

  {

  uint i,j;

  for(i=n;i》0;i--)

  for(j=22;j》0;j--);

  }

0

评论 (0)

取消