微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > lcd1602显示程序

lcd1602显示程序

时间:09-18 来源:电子发烧友网 点击:

据***********************************/

  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时,也可以从//最左边开

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top