51单片机控制1602LCD字符滚动三

51单片机控制1602LCD字符滚动三

1.概述

这篇文章介绍单片机控制1602LCD屏幕上的字符滚动显示

2.字符滚动

2.1.第一种方式

使用LCD内置指令设置整屏左移或者右移,在读入字符时每读一个字符都要有个延迟,否则会因为速度太快,看到屏幕上就是没有字符。

c 复制代码
#define LCD_DIS_MODE_LEFT 0x07 	// AC自增,画面左移
#define LCD_DIS_MODE_RIGHT 0X05	// AC自增,画面右移
设置字符左移核心代码
c 复制代码
void main(){
	unsigned char str1[] = "Beyound Self Beyound Time Beyound Sky";
	unsigned char i;
	LCD1602_Init();
	// 1.设置整屏幕左移
	LCD1602_WriteCMD(LCD_DIS_MODE_LEFT);
	
	while(1){
		//设置字符显示起始位置
		LCD1602_WriteCMD(0x80);
		//读取字符,注意每读取一个字符时都要有个延迟时间。
		for(i=0;i<strlen(str1);i++){
			LCD1602_WriteData(str1[i]);
			DELAY_MS(500);
		}
		
	}
	
}
字符移动完整代码
c 复制代码
#include <STC12C2052AD.H>
#include <string.h> 
typedef unsigned char uint8;
// 定义引脚
#define	LCD1602_DB0_DB7	P1			// 定义LCD1602的数据总线
sbit LCD1602_RS = P3 ^ 2;					// 定义LCD1602的RS控制线
sbit LCD1602_RW = P3 ^ 3;					// 定义LCD1602的RW控制线
sbit LCD1602_E  = P3 ^ 4;					// 定义LCD1602的E控制线
sbit LCD1602_Busy = P1 ^ 7;					// 定义LCD1602的测忙线(与LCD1602_DB0_DB7关联)


// 定义指令集
/*设置显示模式*/
#define LCD_MODE_PIN8 0x38	// 8位数据线,两行显示
#define LCD_MODE_PIN4 0x28	// 4位数据线,两个显示
#define LCD_SCREEN_CLR 0x01	// 清屏
#define LCD_CURSOR_RET 0x02	// 光标复位
#define LCD_CURSOR_RIGHT 0x06	// 光标右移,显示不移动
#define LCD_CURSOR_LEFT 0x04	// 光标左移,显示不移动
#define LCD_DIS_MODE_LEFT 0x07 	// AC自增,画面左移
#define LCD_DIS_MODE_RIGHT 0X05	// AC自增,画面右移


/*光标开关控制*/
#define LCD_DIS_CUR_BLK_ON 0x0f	// 显示开,光标开,光标闪烁
#define LCD_DIS_CUR_ON 0x0e	// 显示开,光标开,光标不闪烁
#define LCD_DIS_ON 0x0c	// 显示开,光标关,光标不闪烁
#define LCD_DIS_OFF 0x08	// 显示关,光标关,光标不闪烁

/*光标、显示移动*/
#define LCD_CUR_MOVE_LEFT 0x10	// 光标左移
#define LCD_CUR_MOVE_RIGHT 0x14	// 光标右移
#define LCD_DIS_MOVE_LEFT 0x18	// 显示左移
#define LCD_DIS_MOVE_RIGHT 0x1c	// 显示右移


/**
LCD1602忙碌状态不会接收新指令,因此在发送新指令前先检测是否忙碌。
判断LCD1602_Busy变量的值为低电平则为不忙。
*/
void LCD1602_TestBusy(void){
	LCD1602_DB0_DB7 = 0xff;	//将数据引脚置为高电平
	LCD1602_RS = 0; // 指令状态
	LCD1602_RW = 1;	// 读状态
	LCD1602_E = 1;	// 打开LCD显示器读指令
	while(LCD1602_Busy);	//读取LCD1602_Busy(P1.7)为低电平则结束循环
	LCD1602_E = 0;	// 关闭LCD显示器读指令
}


/********************************************************************************************
// 写指令程序 //
// 向LCD1602写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCD1602_WriteCMD(uint8 LCD1602_command) { 
	LCD1602_TestBusy();
	//输入的命令赋值给LCD1602_DB0_DB7
	LCD1602_DB0_DB7 = LCD1602_command;
	LCD1602_RS = 0;
	LCD1602_RW = 0;
	LCD1602_E = 1;
	LCD1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCD1602写数据 //
/********************************************************************************************/
void LCD1602_WriteData(uint8 LCD1602_data){ 
	LCD1602_TestBusy();
	LCD1602_DB0_DB7 = LCD1602_data;
	LCD1602_RS = 1;
	LCD1602_RW = 0;
	LCD1602_E = 1;
	LCD1602_E = 0;
}


// LCD1602初始化
void LCD1602_Init(void){
	LCD1602_WriteCMD(LCD_MODE_PIN8);	// 显示模式设置:显示2行,每个字符为5*7个像素
	LCD1602_WriteCMD(LCD_DIS_ON); 	// 显示开及光标设置:显示开,光标关
	LCD1602_WriteCMD(LCD_CURSOR_RIGHT);		//显示光标移动设置:文字不动,光标右移
	LCD1602_WriteCMD(LCD_SCREEN_CLR);	// 显示清屏
}

void DELAY_MS (unsigned int a){
	unsigned int i;
	while( --a != 0){
		for(i = 0; i < 600; i++);
	}
}

void main(){
	unsigned char str1[] = "Beyound Self Beyound Time Beyound Sky";
	unsigned char i;
	LCD1602_Init();
	// 设置整屏幕左移
	LCD1602_WriteCMD(LCD_DIS_MODE_LEFT);
	while(1){
		LCD1602_WriteCMD(0x80);
		for(i=0;i<strlen(str1);i++){
			LCD1602_WriteData(str1[i]);
			DELAY_MS(500);
		}
		
	}
	
}

2.2.第二种移动方式

这种移动方式不需要在初始化时设置好移动方式,而是在需要的时候开启移动,不需要时候关闭移动。

核心代码

1602的内置指令中提供了显示左移或右移的指令#define LCD_DIS_MOVE_LEFT 0x18,使用该指令可以使内容移动。

下面是实现屏幕左移的核心代码,其他代码同上面实例代码一致就不在展示。

c 复制代码
void main(){
	unsigned char str1[] = "Beyound Self Beyound Time Beyound Sky";
	unsigned char i;
	LCD1602_Init();
	// 输出字符内容
	LCD1602_WriteCMD(0x80);
	for(i=0;i<strlen(str1);i++){
		LCD1602_WriteData(str1[i]);
	}
		
	while(1){
		// 设置屏幕左移
		LCD1602_WriteCMD(LCD_DIS_MOVE_LEFT);
		DELAY_MS(500);
		
		
		
	}
	
}
相关推荐
LCG米21 小时前
STM32硬件CRC外设实测:多项式固定陷阱、CRC-32校验不匹配根因与软件查表法耗时对比落地
stm32·单片机·嵌入式硬件
La Pulga1 天前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
女神下凡1 天前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
硅基手札1 天前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
何粥学1 天前
Vivado 2024.2 开发记录(AC820 Zynq-7020)——软件使用,点亮led灯
单片机·嵌入式硬件·zynq
Sakura_j_h_1 天前
51 单片机驱动四位数码管:动态扫描、限流电阻与消影的取舍
单片机·嵌入式硬件·51单片机·嵌入式·数码管·动态扫描·限流电阻
HANDY092001 天前
从“不照人”到“剂量达标”:扇叶遮挡式UV-C空气消毒的工程边界与可验证评估框架
开发语言·人工智能·嵌入式硬件·智能家居
飞凌嵌入式2 天前
千次静电放电试炼,守住飞凌嵌入式硬件可靠底线
嵌入式硬件
蹊黎2 天前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
无敌贵点大王2 天前
从寄存器层面重学STM32(6)——串口USART实战部分
stm32·单片机·嵌入式硬件