Cheug's Blog

当前位置:网站首页 / 电子技术 / 正文

LCD1602A显示字符或字符串

2017-09-14 / 电子技术 / 1783 次围观 / 0 次吐槽 /
#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int

sbit EN=P1^4;
sbit RS=P1^6;
sbit RW=P1^5;

void LCD1602()
{
 EN=0;
 RS=1;
 RW=1;
 P0=0xff;   //这里P0为与LCD D0~D7相连的I/O口
}
void read_busy()
{
  P0=0xff;
  RS=0;
  RW=1;
  EN=1;
  while(P0&0x80);   //P0和10000000相与,D7位若不为0,停在此处
  EN=0;             //若为0跳出进入下一步;这条语句的作用就是检测D7位
 }
void write(uchar i,bit j)
{
  read_busy();
  P0=i;  //其中i=0,写指令;i=1,写数据;
  RS=j;
  RW=0;
  EN=1;
  EN=0;
}
void delay(uint c)    //功能为提供初始化等其他子程序中的延时1xc MS
{
  uint a,b;
  for(a=0;a<c;a++)
  for(b=0;b<120;b++);
}
void init()   //完全按照要求初始化流程来,中间省略了一步写指令38H
{
 
  delay(15);
  write(0x38,0);
  delay(5);
  write(0x38,0);
  write(0x08,0);
  write(0x01,0);
  write(0x06,0);
  write(0x0c,0);
}
void display_lcd_byte(uchar y,uchar x,uchar z)    //Y=0,1(起始行)X=0~15(起始列)Z=想写字符的ASCII码
{ if(y)     //是否显示在第二行(若在第一行Y=0,不进入IF语句,若在第二行,进入IF语句
  {        
   x+=0x40;  //第二行起始地址加上列数为字符显示地址
  }
  x+=0x80;      //设置数据指针位置
  write(x,0);  
  write(z,1);   //写入数据
}
void display_lcd_text(uchar y,uchar x,uchar table[])     //Y,X同上字符显示,table[]字符串数组 
{      
  uchar z=0;
  uchar t;
  t=strlen(table)+x;   //  求得字符串长度加上起始列位置
  while(x<t)        //功能为LCD显示到字符串最后一个字符,防止字符串
  {                  //没有16个字符,从而不够位产生乱码;
    display_lcd_byte(y,x,table[z]);    //逐位显示数组内字符
    x++;
    z++;
  }
}
void main()
{
  LCD1602();
  init();							 
  display_lcd_byte(0,0,'C');      //  显示一个字符
  display_lcd_text(1,0,"www.cheug.com");    //  显示字符串
  while(1);
}


Powered By Cheug's Blog

Copyright Cheug Rights Reserved.