C51单片机怎么让lcd1602显示两行?

2024-10-31 12:13:05
推荐回答(5个)
回答(1):

我给你写个测试程序,第一行显示A,第二行显示B

/*******************************************************************************************
* LCD1602液晶显示程序 51&AVR实验程序
*
* LCD1602液晶: 写指令;
*
* LCD1602液晶: 写数据;
*
* LCD1602液晶: 写指令和据;
********************************************************************************************/

#include "reg52.h"

sbit LCD_RS=P3^5;
sbit LCD_EN=P3^4;

#define Data_addr P0 //定义LCD1602液晶数据I口

void Delay_1ms(unsigned int Time)
{
unsigned int x, y;
for(x = Time; x > 0; x--)
for(y = 120; y > 0; y--);
}
/*********************************************************************************************
* 函数名称: Write_lcd1602_com(unsigned char com);
*
* 输入: 无
*
* 输出: 无
*
* 说明: 给LCD1602液晶写入指令*********************************************************************************************/
void Write_lcd1602_com(unsigned char com)
{
LCD_RS=0;
Data_addr=com;
Delay_1ms(5);
LCD_EN=1;
Delay_1ms(5);
LCD_EN=0;
}
/**********************************************************************************************
函数名称: Write_lcd1602_data(unsigned char date);
*
* 输入: 无
*
* 输出: 无
*
* 说明: 给LCD1602液晶写数据*********************************************************************************************/
void Write_lcd1602_data(unsigned char date)
{
LCD_RS=1;
Data_addr=date;
Delay_1ms(5);
LCD_EN=1;
Delay_1ms(5);
LCD_EN=0;
}
/*********************************************************************************************
* 函数名称: Init_lcd1602(void);
*
* 输入: 无
*
* 输出: 无
*
* 说明: 给LCD1602液晶指令初始化*********************************************************************************************/
void Init_lcd1602(void)
{
LCD_RS=0;
LCD_EN=0;
Write_lcd1602_com(0x38);
Write_lcd1602_com(0x0C);
Write_lcd1602_com(0x06);
Write_lcd1602_com(0x01);
}

int main(void)
{
Init_lcd1602();
Write_lcd1602_com( 0x80); //第一行显示A
Write_lcd1602_data("A");
Delay_1ms(5);
Write_lcd1602_com( 0x80 + 0x40); //第二行显示B
Write_lcd1602_data("B");
while(1);
}

回答(2):

LCD1602,都是显示两行的。
不需要什么特殊的操作,就能显示两行。

楼主提出这样的问题,也不给出电路和语言的要求,很难回答的。

看看我的百度空间吧,有这样的程序和电路。

回答(3):

好像是在指令六:DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示

回答(4):

主函数:
#include "reg52.h"
#include "lcd.h"

typedef unsigned int u16;
typedef unsigned char u8;

u8 Disp1[]="zhao meng sha bi";
u8 Disp2[]="ha ha ha ha ha ";

void main(void)
{
u8 i;
LcdInit();
if(i<40)
{
LcdWriteCom(0x80);
}
else
{
LcdWriteCom(0xc0);
}

for(i=0;i<40;i++)
{
LcdWriteData(Disp1[i]);
Lcd1602_Delay1ms(50);
}
for(i=40;i<80;i++)
{
LcdWriteData(Disp2[i-40]);
Lcd1602_Delay1ms(50);
}
while(1)
{
}

}
lcd函数:
#include "lcd.h"

void Lcd1602_Delay1ms(uint c)
{
uchar a,b;
for(;c>0;c--)
{
for(b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}

#ifndef LCD1602_4PINS
void LcdWriteCom(uchar com)
{
LCD1602_E=0;
LCD1602_RS=0;
LCD1602_RW=0;

LCD1602_DATAPINS=com;
Lcd1602_Delay1ms(1);

LCD1602_E=1;
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#else
void LcdWriteCom(uchar com)
{
LCD1602_E=0;
LCD1602_RS=0;
LCD1602_RW=0;

LCD1602_DATAPINS=com;
Lcd1602_Delay1ms(1);
LCD1602_E=1;
Lcd1602_Delay1ms(5);
LCD1602_E=0;

LCD1602_DATAPINS=com<<4;
Lcd1602_Delay1ms(1);
LCD1602_E=1;
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#endif

#ifndef LCD1602_4PINS

void LcdWriteData(uchar dat)
{
LCD1602_E=0;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DATAPINS=dat;
Lcd1602_Delay1ms(1);
LCD1602_E=1;
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#else
void LcdWriteData(uchar dat)
{
LCD1602_E=0;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DATAPINS=dat;
Lcd1602_Delay1ms(1);
LCD1602_E=1;
Lcd1602_Delay1ms(5);
LCD1602_E=0;
LCD1602_DATAPINS=dat<<4;
Lcd1602_Delay1ms(1);
LCD1602_E=1;
Lcd1602_Delay1ms(5);
LCD1602_E=0;
}
#endif

#ifndef LCD1602_4PINS
void LcdInit()
{
LcdWriteCom(0x38);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
//LcdWriteCom(0xc0);

}
#else
void LcdInit()
{
LcdWriteCom(0x32);
LcdWriteCom(0x28);
LcdWriteCom(0x0c);
LcdWriteCom(0x06);
LcdWriteCom(0x01);
LcdWriteCom(0x80);
}
#endif
头文件:
#ifndef _LCD_H_
#define _LCD_H_

//#define LCD1602_4PINS

#include "reg52.h"

#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^7;
sbit LCD1602_RW=P2^5;
sbit LCD1602_RS=P2^6;

void Lcd1602_Delay1ms(uint c);
void LcdWriteCom(uchar com);
void LcdWriteData(uchar dat);
void LcdInit();
#endif

回答(5):

定位指令时,一个是0x80,第二行是0x80+0x40