51单片机LCD1602滚动显示两行字符有个问题请教大家,代码如下

该程序用于51单片机在LCD上显示文本并实现滚动效果。关键函数包括初始化LCD、写命令(wrc)和写数据(wrd),以及延迟函数(delay)。显示过程首先写入两行文本,然后通过循环和延迟实现文本的滚动效果。注释表明,`wrc(0x00+0x80)`和对应的for循环是必要的,否则滚动功能将无法正常工作,且第二行字符无法完整显示。
摘要由CSDN通过智能技术生成
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit rs=P2^6;
sbit rw=P2^5;
sbit e=P2^7;
uint8 a[16]="perchin designed";
uint8 b[27]="welcome to the world of mcu";
void delay(uint16 i)  //1us
{
	while(i--);
}
void wrc(uint8 c)
{
	delay(1000);
	rs=0;
	rw=0;
	e=0;
	P0=c;
	e=1;
	delay(10);
	e=0;
	/*
	P0=c<<4;
	e=1;
	e=0;*/       //四位的LCD要加上
}
void wrd(uint8 dat)
{
	delay(1000);
	rs=1;
	rw=0;
	e=0;
	P0=dat;
	e=1;
	delay(10);
	e=0;
	/*
	P0=dat<<4;
	e=1;
	e=0;*/	   //四位的LCD要加上
	rs=0;	
}
void init()
{
	delay(1000);
	/*wrc(0x32);	 
	wrc(0x28);
	wrc(0x28);	*/	//四位的LCD要加上
	wrc(0x38);
	wrc(0x38);
	wrc(0x38);	
	wrc(0x0c);	
	wrc(0x01);	
}
void display()
{
	uint8 i;
	wrc(0x00+0x80);
	for(i=0;i<16;i++)
	{
		wrd(a[i]);	
	}
	wrc(0x40+0x80);
	for(i=0;i<27;i++)
	{
		wrd(b[i]);
	} 
	wrc(0x07);	 //每写一个数据屏幕就要右移一位,就相对于数据来说就是左移了;
	while(1)
	{	
		wrc(0x00+0x80);
		for(i=0;i<16;i++)
		{
			wrd(a[i]);
			delay(30000);	//如果不加这条延时语句的话滚动会非常快。
		}
	}
}
void main()
{
	init();
	while(1)
	{
		display();
	}	
} 

(注:代码来源于普中51单片机开发板V2.2C教程)
这一段程序:wrc(0x00+0x80);
        for(i=0;i<16;i++)
        {
            wrd(a[i]);
为什么要写两遍呢?这段显示第一行的不是写过了嘛?我注释掉之后发现不滚动了,然后第二行第16个字符之后的就显示不出来了

谢谢大佬指点!

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用51单片机控制LCD1602显示两行字符串,可以按照以下步骤进行: 1. 将LCD160251单片机进行连接,可以参考电路图进行连接。 2. 在程序中定义LCD1602所连接的I/O口。 3. 编写初始化程序,对LCD1602进行初始化,包括清屏、设定显示模式等。 4. 编写程序将需要显示字符串写入LCD1602的DDRAM(显示数据存储器)中,可以使用指令“WriteDataToLCD”实现。 5. 将光标位置移动到第二行开始处,再写入需要显示字符串。 以下是示例代码: ``` #include <reg52.h> #include <intrins.h> #define LCD1602_DB P0 sbit LCD1602_RS = P2^6; sbit LCD1602_RW = P2^5; sbit LCD1602_E = P2^7; void DelayMs(unsigned int i) { unsigned char j; while(i--) { j = 250; while(j--); } } void WriteCommandToLCD(unsigned char Command) { LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_E = 1; LCD1602_DB = Command; _nop_(); _nop_(); LCD1602_E = 0; } void WriteDataToLCD(unsigned char Data) { LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_E = 1; LCD1602_DB = Data; _nop_(); _nop_(); LCD1602_E = 0; } void InitLCD1602() { WriteCommandToLCD(0x38); WriteCommandToLCD(0x0c); WriteCommandToLCD(0x06); WriteCommandToLCD(0x01); } void main() { InitLCD1602(); WriteCommandToLCD(0x80); // 光标移到第一行开始处 WriteDataToLCD('H'); WriteDataToLCD('e'); WriteDataToLCD('l'); WriteDataToLCD('l'); WriteDataToLCD('o'); WriteCommandToLCD(0xC0); // 光标移到第二行开始处 WriteDataToLCD('W'); WriteDataToLCD('o'); WriteDataToLCD('r'); WriteDataToLCD('l'); WriteDataToLCD('d'); while(1); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值