找回密码
 立即注册
查看: 110|回复: 6

求指教!LCD1602模块的使用

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-29 16:02:07
已绑定手机

1

主题

3

回帖

27

积分

新手上路

积分
27
发表于 2025-3-28 11:07:14 | 显示全部楼层 |阅读模式

如题,我遇到的问题是这个模块在显示不等长字符的时候,第二行就会错位

#define STR1LEN 16
#define STR2LEN 11

bit is500ms = 0;
u8 flag     = 0x00;

// 这两个是不等长的
u8 code str1[STR1LEN] = "A test sentence";
u8 code str2[STR2LEN] = "Let's move!";

void ConfigT0();

void main()
{
    u8 i = 0;
    u8 j = 0;

    ConfigT0();
    // 设置lcd1602为 8bit的两行显示,不显示光标,光标向右移动,屏幕清零
    // 相当于`LcdInit(0x38, 0x0C, 0x06, 0x01);`
    LcdInit(SET_8BIT_2LINE_5X7, NO_CURSOR, CURSOR_RIGHT, CLR_SCREEN);
    while (1) {
        // 定时,每 0.5s 显示一个字符
        if (is500ms) {
            is500ms = 0;
            // 设置为在第一行显示
            LcdSetCursor(i, ROW_1);
            LcdWriteChar(str1[i]);
            i++;
            // STR1LEN - 1 是为了不显示 '\0'
            if (i > STR1LEN - 1) {
                i = 0;
                flag |= (1 << 0);
            }

            // 设置为在第二行显示
            LcdSetCursor(j, ROW_2);
            LcdWriteChar(str2[j]);
            j++;

            if (j > STR2LEN - 1) {
                j = 0;
                flag |= (1 << 1);
            }
            // 当两行都显示完之后清屏
            if (flag == 0x03) {
                flag = 0x00;
                LcdWriteCmd(CLR_SCREEN);
            }
        }
    }
}

void ConfigT0()
{
    EA = 1;
    TMOD &= 0xF0;
    TMOD |= 0x01;
    // 10ms
    TH0 = 0xDC;
    TL0 = 0x00;
    TR0 = 1;
    ET0 = 1;
}

void InterruptT0() interrupt 1
{
    static u8 cnt = 0;
    TH0           = 0xDC;
    TL0           = 0x00;

    cnt++;
    if (cnt >= 50) {
        cnt     = 0;
        is500ms = 1;
    }
}

首先这段代码在第一遍显示的时候没有问题,str1和str2都是从左往右显示的,但是到了第二遍就:

image.png

想问下各位大佬有啥比较好的解决方法

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-29 16:02:07
已绑定手机

1

主题

3

回帖

27

积分

新手上路

积分
27
发表于 2025-3-28 11:09:28 | 显示全部楼层
不要在意str1和屏幕上显示的不一样,我修改了一下代码,但还没烧录,另外这个是普中的板子(89c52rc)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-28 12:26:33 | 显示全部楼层
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-28 12:32:10 | 显示全部楼层
#include <STC8.H>
#include <intrins.h>
#define		LCD1602_RS		P32
#define		LCD1602_EN		P33
#define		LCD1602_D4		P34
#define		LCD1602_D5		P35
#define		LCD1602_D6		P36
#define		LCD1602_D7		P37
#define		Command								0
#define		Data								1
#define		Clear_Display						0x01	//Clear_Display
#define		Return_Home							0x02	//Return_Home
#define		Entry_Mode_Cursor_Left				0x04	//Entry_Mode_Set
#define		Entry_Mode_Entire_Right				0x05	//Entry_Mode_Set
#define		Entry_Mode_Cursor_Right				0x06	//Entry_Mode_Set
#define		Entry_Mode_Entire_Left				0x07	//Entry_Mode_Set
#define		Display_Off							0x08	//Display_ON/OFF
#define		Display_On							0x0c	//Display_ON/OFF
#define		Display_On_Cursor_Off_Blink_On		0x0d	//Display_ON/OFF
#define		Display_On_Cursor_On_Blink_Off		0x0e	//Display_ON/OFF
#define		Display_On_Cursor_On_Blink_On		0x0f	//Display_ON/OFF
#define		Cursor_Move_Left					0x10	//Cursor_or_Display_Shift
#define		Cursor_Move_Right					0x14	//Cursor_or_Display_Shift
#define		Display_Move_Left					0x18	//Cursor_or_Display_Shift
#define		Display_Move_Right					0x1c	//Cursor_or_Display_Shift
#define		Setting_Basic_Instruction_Set		0x28	//Function_Set
#define		Setting_Extended_Instruction_Set	0x29	//Function_Set
#define		Function_Set						0x38	//Function_Set
#define		Contrast_Set						0x78	//Contrast_Set
#define		Internal_OSC						0x14	//Internal_OSC
#define		Power_ICON_Contrast					0x5e	//Power_ICON_Contrast
#define		Follower_Control					0x6a	//Follower_Control
#define		Power_ICON_Contrast					0x5e	//Power_ICON_Contrast
unsigned char code Display_Hex[16]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46};
unsigned char code Display_Data1[32]=
{
	"LCD_1602_Program"	//0x80
	"Conter:000000000"	//0xc0
};

/*----------------------------延时10us@STC-Y6@11.0592MHz----------------------------*/
void Delay_10us(void)
{
	unsigned char i;
	i=35;
	while(--i);
}

/*----------------------------延时x10us----------------------------*/
void Delay_x10us(unsigned char x)
{
	while(x--)
		Delay_10us();
}

/*----------------------------延时10ms@STC-Y6@11.0592MHz----------------------------*/
void Delay_10ms(void)
{
	unsigned char i,j;
	_nop_();
	_nop_();
	i=144;
	j=157;
	do
	{
		while(--j);
	}
	while(--i);
}

/*----------------------------延时x10ms----------------------------*/
void Delay_x10ms(unsigned char x)
{
	while(x--)
		Delay_10ms();
}

/*----------------------------LCD1602_Enable----------------------------*/
void LCD1602_Enable(void)
{
	LCD1602_EN=1;
	Delay_10us();
	LCD1602_EN=0;
	Delay_10us();
}

/*----------------------------写命令或数据,x=0传送命令,x=1传送数据----------------------------*/
void LCD1602_Write(unsigned char temp,bit x)
{
	LCD1602_RS=x;	//x=0传送命令,x=1传送数据
	LCD1602_D4=temp&0x10;
	LCD1602_D5=temp&0x20;
	LCD1602_D6=temp&0x40;
	LCD1602_D7=temp&0x80;
	LCD1602_Enable();
	LCD1602_D4=temp&0x01;
	LCD1602_D5=temp&0x02;
	LCD1602_D6=temp&0x04;
	LCD1602_D7=temp&0x08;
	LCD1602_Enable();
}

/*----------------------------整页显示字符----------------------------*/
void Display_Text(unsigned char code *addr)
{
	unsigned char i;
	LCD1602_Write(0x80,Command);	//设置DDRAM地址
	Delay_10us();
	for(i=0;i<16;i++)
	{
		LCD1602_Write(*addr,Data);
		addr++;
	}
	LCD1602_Write(0xc0,Command);	//设置DDRAM地址
	Delay_10us();
	for(i=0;i<16;i++)
	{
		LCD1602_Write(*addr,Data);
		addr++;
	}
}

/*----------------------------指定位置显示字符----------------------------*/
void Display_Data(unsigned char x,unsigned char y,unsigned char temp)
{
	switch(y)
	{
		case 0:
			LCD1602_Write(0x80+x,Command);	//设置DDRAM地址
			Delay_10us();
			LCD1602_Write(temp,Data);
			break;
		case 1:
			LCD1602_Write(0xc0+x,Command);	//设置DDRAM地址
			Delay_10us();
			LCD1602_Write(temp,Data);
			break;
	}
}

/*----------------------------初始化LCD1602----------------------------*/
void LCD12864_Init(void)
{
	Delay_10ms();
	Delay_10ms();
	Delay_10ms();
	Delay_10ms();		//延时40ms
//	LCD1602_Write(Function_Set,Command);						//Function_Set
//	Delay_x10us(200);	//延时2ms
//	LCD1602_Write(Function_Set,Command);						//Function_Set
//	Delay_x10us(3);		//延时3us
	LCD1602_Write(Function_Set,Command);						//Function_Set
	Delay_x10us(3);		//延时3us
	LCD1602_Write(Setting_Basic_Instruction_Set,Command);		//Setting_Basic_Instruction_Set
	Delay_x10us(3);		//延时3us
	LCD1602_Enable();
	LCD1602_Write(Setting_Extended_Instruction_Set,Command);	//Setting_Extended_Instruction_Set
	Delay_x10us(3);		//延时3us
//	LCD1602_Write(Cursor_Move_Right,Command);					//Cursor_Move_Right
//	Delay_x10us(3);		//延时3us
//	LCD1602_Write(Contrast_Set,Command);						//Contrast_Set
//	Delay_x10us(3);		//延时3us
//	LCD1602_Write(Internal_OSC,Command);						//Internal_OSC
//	Delay_x10us(3);		//延时3us
//	LCD1602_Write(Power_ICON_Contrast,Command);					//Power_ICON_Contrast
//	Delay_x10us(3);		//延时3us
//	LCD1602_Write(Follower_Control,Command);					//Follower_Control
//	Delay_x10ms(20);	//延时200ms
	LCD1602_Write(Display_On,Command);							//Display_On
	Delay_x10us(3);		//延时3us
	LCD1602_Write(Clear_Display,Command);						//Clear_Display
	Delay_x10us(200);	//延时2ms
//	LCD1602_Write(Entry_Mode_Cursor_Right,Command);				//Entry_Mode_Cursor_Right
//	Delay_x10us(3);		//延时3us
}

void main(void)
{
	unsigned int a=0,b=0;
	LCD12864_Init();
	while(1)
	{
		Display_Text(Display_Data1);
		while(1)
		{
			Display_Data(7,1,Display_Hex[a/10000]);
			Display_Data(8,1,Display_Hex[a%10000/1000]);
			Display_Data(9,1,Display_Hex[a%1000/100]);
			Display_Data(10,1,Display_Hex[a%100/10]);
			Display_Data(11,1,Display_Hex[a%10]);
			Display_Data(12,1,Display_Hex[b%10000/1000]);
			Display_Data(13,1,Display_Hex[b%1000/100]);
			Display_Data(14,1,Display_Hex[b%100/10]);
			Display_Data(15,1,Display_Hex[b%10]);
			b++;
			if(b>=10000)
			{
				b=0;
				a++;
			}
		}
	}
}
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-29 16:02:07
已绑定手机

1

主题

3

回帖

27

积分

新手上路

积分
27
发表于 2025-3-28 15:23:58 来自手机 | 显示全部楼层
DebugLab 发表于 2025-3-28 12:26
可以用空格补齐
LCD-1602 ST7032例程:
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&p ...

我尝试过这个方案,确实可行,但我在想有没有不使用空格的方案。大佬你试过吗?

点评

先设置地址显示一行,再设置地址显示另一行,不要放在一个循环里  详情 回复 发表于 2025-3-28 15:49
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-28 15:49:09 | 显示全部楼层
Fern*** 发表于 2025-3-28 15:23
我尝试过这个方案,确实可行,但我在想有没有不使用空格的方案。大佬你试过吗? ...

先设置地址显示一行,再设置地址显示另一行,不要放在一个循环里
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-03-29 16:02:07
已绑定手机

1

主题

3

回帖

27

积分

新手上路

积分
27
发表于 2025-3-28 16:06:47 来自手机 | 显示全部楼层
DebugLab 发表于 2025-3-28 15:49
先设置地址显示一行,再设置地址显示另一行,不要放在一个循环里

好的,我整整
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:37 , Processed in 0.144914 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表