一、简介

Proteus是一款功能丰富的电子设计和仿真软件,它允许用户设计电路图、进行PCB布局,并在虚拟环境中测试电路功能。这款软件广泛应用于教育和产品原型设计,特别适合于快速原型制作和电路设计教育。Proteus的3D可视化功能使得设计更加直观,而其对多种微控制器编程的支持,包括对LCD滚动显示汉字的仿真,进一步增强了其在电子设计领域的实用性。使用Proteus,工程师和学生可以在不实际搭建电路的情况下,安全、高效地进行设计验证和教学演示,从而节省成本并提高工作效率。

二、Proteus软件概述

Proteus是一款综合性的电子设计自动化软件,它广泛应用于电子工程领域,特别是在教育和产品原型设计中。以下是Proteus软件的概述:

功能特点

电路仿真:Proteus能够模拟电子电路的工作,包括数字、模拟和微控制器电路。
PCB设计:提供印刷电路板(PCB)的设计和布局功能,可以生成专业的PCB图纸。
3D可视化:支持将电路设计以三维形式展示,帮助用户更直观地理解产品外观。
代码仿真:支持与多种编程语言和编译器结合,可以仿真微控制器程序的运行。

适用领域

教育:作为教学工具,帮助学生理解电子电路的工作原理和设计过程。
产品原型设计:在产品开发初期,用于快速搭建和测试电路设计。
研发:工程师可以用它来验证电路设计,减少实际搭建电路的次数。

主要组件

ISIS:Proteus的PCB设计和仿真组件,用于创建和测试电路图。
ARES:PCB布局和设计工具,用于设计电路板的物理布局。
MAKING:用于将设计转换为可制造的PCB文件。

用户界面

图形化操作:提供直观的拖放界面,用户可以通过图形化操作来搭建电路。
丰富的元件库:包含大量的电子元件和模型,方便用户选择和使用。

仿真测试

实时反馈:仿真过程中,可以实时观察电路的工作状态和波形。
错误检测:帮助用户发现电路设计中的错误和潜在问题。

兼容性

多种编程语言:支持C语言、汇编语言等多种编程语言的仿真。
不同微控制器:可以模拟多种类型的微控制器,如51、PIC、AVR等。

优势

成本效益:减少了实际电路搭建和测试的成本。
安全性:在虚拟环境中进行测试,避免了操作真实电路的风险。
效率提升:加快了原型设计和问题解决的速度。
Proteus软件以其强大的功能和直观的操作界面,在电子设计和教育领域中扮演着重要的角色。通过Proteus,用户可以在一个安全、经济且高效的环境中进行电子设计和仿真。

三、LCD示屏基础

LCD显示屏(液晶显示屏)是一种广泛使用的显示技术,它利用液晶材料的特性来控制光线的通过,从而实现图像的显示。以下是LCD显示屏的一些基础知识:

工作原理

液晶分子:液晶分子在电场的作用下可以重新排列,改变光线的传播路径。
偏振光:LCD屏幕使用偏振光,液晶分子的排列决定了哪些光能通过,哪些被阻挡。

类型

TN(Twisted Nematic):最基本的LCD类型,响应时间快,但视角较小。
STN(Super Twisted Nematic):改进了TN型,提供了更好的显示效果和更宽的视角。
TFT(Thin Film Transistor):每个像素点都有自己的晶体管控制,可以提供更好的图像质量。
显示特性
分辨率:屏幕能够显示的像素点数量,分辨率越高,显示的图像越清晰。
颜色:现代LCD屏幕可以显示数百万种颜色,通常使用RGB(红绿蓝)模型。
亮度和对比度:影响屏幕显示效果的两个关键因素。

接口

并行接口:通过多条数据线传输数据,速度快,但需要更多的引脚。
串行接口:如I2C或SPI,通过单条或双条线传输数据,适合远距离传输。

控制器

LCD控制器:一种集成电路,用于控制LCD显示屏的显示内容和显示方式。

应用

计算机显示器:笔记本电脑和桌面显示器。
电视和视频播放器:提供高清晰度的图像显示。
手机和平板电脑:触摸屏技术与LCD显示屏结合,提供交互式操作。

编程和控制

图形库:如SDL或Qt,提供API来控制LCD屏幕的显示。
直接控制:通过编程设置控制器的寄存器,控制像素的显示。

维护和保养

避免极端温度:过高或过低的温度都可能影响LCD屏幕的性能。
避免压力:不要对屏幕施加过大的压力,以免损坏液晶层。
LCD显示屏因其轻薄、低功耗和高分辨率等优点,在现代电子设备中得到了广泛应用。了解LCD显示屏的基础知识,对于设计和使用基于LCD的系统非常重要。、

四、仿真项目创建

新建项目:
打开Proteus软件。
选择工作界面(如ISIS用于电路设计)。
点击“File”菜单,选择“New Project”或使用工具栏上的快捷图标。
为项目选择保存位置并命名。
点击“Save”保存项目。
通过左侧元件库添加元件到设计视图中。
使用导线工具连接元件。
双击元件设置属性(如需要)。
完成设计后,再次点击“File”菜单选择“Save Project”保存工作。
若要进行仿真,点击工具栏上的仿真按钮。

添加元件:
在元件库浏览器中,使用搜索栏输入“51”或“8051”来快速找到51单片机模型。
浏览列出的元件,选择适合您项目的具体型号。

点击找到的51单片机元件,它通常会以图标形式出现在搜索结果中。
将鼠标指针移动到设计视图中您希望放置单片机的位置,然后点击鼠标左键放置元件。

在元件库浏览器的搜索栏中输入“LCD”来查找LCD显示屏元件。
根据您项目的需求选择合适类型的LCD显示屏。

五、电路设计

1.微控制器引脚分配:通常,微控制器具有多个引脚,每个引脚都有特定的功能。如”P0.0”到”P0.7”等引脚,是通用输入/输出(GPIO)引脚,可以被配置为不同的用途。

2.多功能引脚:引脚如”PO.1.AD1”、”PO.2.AD2”等表明这些引脚既可以作为数字I/O使用,也可以作为模拟输入(AD转换器的输入)使用。

3.地址和数据总线:”ALE”(Address Latch Enable)引脚用于锁存地址总线上的地址信息,这通常与外部存储器接口有关。

4.存储器接口:”HTAL1”表示高八位地址总线,用于扩展存储器的寻址范围。

5.复位和启动:”RST”是复位引脚,用于将微控制器重置到初始状态。
6.通信接口:”P3.0RXD”和”P3.1.TxD”是串行通信接口的接收和发送引脚,用于实现串行通信。
7.中断:”P3.2/INT0”和”P3.3/INT1”是中断请求引脚,允许外部设备通过硬件中断请求微控制器的注意。
8.定时器/计数器:”P3.4/T0”和”P3.5/T1”是定时器或计数器的输入引脚,用于时间控制或计数。
9.逻辑芯片:”74HC373”是一个8位的寄存器芯片,可能用于数据锁存或扩展存储器。
“74HC00”是一个四路二输入与门,可能用于实现逻辑控制。
10.特殊功能引脚:”P2.0A8”、”P2.17A10”等可能表示具有特定功能的引脚,如PWM输出、通信接口等。
11.电源和地:专门的电源引脚(如”VCC”或”VDD”)和地引脚(如”GND”或”VSS”)。
12.编程和配置:”PSEN”与编程时钟使能有关,用于存储器编程时的时钟控制。

电路设计原理通常包括以下几个方面:

功能需求:电路设计首先需要满足特定的功能需求,如数据处理、存储、通信、控制等。
信号完整性:确保信号在电路中传输时的完整性和稳定性。
电磁兼容性(EMC):设计要考虑到减少电磁干扰,提高电路的抗干扰能力。
热管理:合理布局和散热设计,以防止过热。
电源管理:确保电路的电源供应稳定,并且电源电路设计要满足负载要求。
安全性:设计要考虑到安全性,防止电气故障导致的危险。
测试和维护:设计要便于测试和维护,以便于发现和解决问题。
为了获得更深入的分析,通常需要查看完整的电路原理图和相关的设计文档,包括微控制器

六、编写控制程序

头文件和相关全局变量

#include<reg51.h>  // 包含51单片机寄存器定义的头文件
#include<absacc.h>  // 包含绝对地址访问的头文件,用于LCD数据的读写
typedef unsigned char uchar;  // 定义无符号字符类型为uchar
typedef unsigned int uint;      // 定义无符号整型为uint

// 定义LCD控制和数据端口的宏
#define LLCD_CMD_WR PBYTE[0x10]  // 左侧LCD控制端口
#define LLCD_CMD_RD PBYTE[0x11]  // 左侧LCD读端口
#define LLCD_DATA_WR PBYTE[0x12] // 左侧LCD数据写端口
#define LLCD_DATA_RD PBYTE[0x13] // 左侧LCD数据读端口
#define RLCD_CMD_WR PBYTE[0x20]  // 右侧LCD控制端口
#define RLCD_CMD_RD PBYTE[0x21]  // 右侧LCD读端口
#define RLCD_DATA_WR PBYTE[0x22] // 右侧LCD数据写端口
#define RLCD_DATA_RD PBYTE[0x23] // 右侧LCD数据读端口

sbit busy=P0^1; // 定义一个单位变量busy,用于检测LCD忙信号

以下是汉字字模数组,每个数组代表一个汉字的点阵数据

uchar code hz0[]=
{
0x00, 0x00, 0xf8, 0x88, 0x99, 0xea, 0x8c, 0xf8, 0x88, 0xcc, 0xab, 0x99, 0x88, 0xf8, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0xfe, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0xfe, 0x00, 0x00, 0x00, 0x00,

0x20, 0x30, 0xac, 0x63, 0x10, 0x00, 0x40, 0x42, 0x22, 0x22, 0x12, 0x1a, 0x26, 0x42, 0xc0, 0x00, 
0x22, 0x23, 0x22, 0x12, 0x12, 0x00, 0x20, 0x21, 0x21, 0x21, 0x3f, 0x21, 0x21, 0x21, 0x20, 0x00,

0x10, 0x60, 0x01, 0x86, 0x60, 0x20, 0xd0, 0x48, 0x44, 0x43, 0x44, 0xc8, 0x30, 0x60, 0x20, 0x00, 
0x04, 0x04, 0xfe, 0x01, 0x00, 0x00, 0x7f, 0x80, 0x80, 0x84, 0x88, 0x87, 0x80, 0xe0, 0x00, 0x00, 

0x10, 0x60, 0x01, 0xf6, 0x00, 0x10, 0xf8, 0x17, 0x34, 0x54, 0x14, 0x14, 0xf4, 0x04, 0x04, 0x00, 
0x04, 0x04, 0xff, 0x00, 0x01, 0x01, 0x1f, 0x11, 0x13, 0x15, 0x51, 0x91, 0x7f, 0x11, 0x11, 0x00, 

0x14, 0x24, 0x44, 0x84, 0x7c, 0x40, 0x30, 0xfc, 0x4b, 0x48, 0xf9, 0x4e, 0x48, 0x48, 0x08, 0x00, 
0x10, 0x08, 0x06, 0x01, 0x03, 0x0c, 0x00, 0xff, 0x22, 0x22, 0x3f, 0x22, 0x22, 0x22, 0x20, 0x00, 

0x00, 0x10, 0x10, 0x12, 0x14, 0x1c, 0x10, 0xf0, 0x9f, 0x10, 0x10, 0x10, 0x10, 0xf8, 0x10, 0x00, 
0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x06, 0x01, 0x00, 0x11, 0x26, 0x40, 0x20, 0x1f, 0x00, 0x00, 

0x00, 0x10, 0x10, 0x10, 0x90, 0x70, 0x00, 0xff, 0x20, 0x60, 0x90, 0x08, 0x04, 0x00, 0x00, 0x00, 
0x10, 0x10, 0x08, 0x06, 0x01, 0x40, 0x80, 0x7f, 0x00, 0x00, 0x01, 0x06, 0x0c, 0x18, 0x08, 0x00, 

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x58, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

uchar code hz1[]=
{
0xfe, 0x02, 0x32, 0xca, 0x46, 0x20, 0x30, 0x2c, 0xe3, 0x24, 0x28, 0x10, 0x20, 0x20, 0x00, 0x00, 
0xff, 0x02, 0x04, 0x43, 0x20, 0x11, 0x4d, 0x81, 0x7f, 0x01, 0x05, 0x09, 0x11, 0x30, 0x00, 0x00, 

0x80, 0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x00, 0xfe, 0x02, 0x02, 0x02, 0xfe, 0x00, 0x00, 
0x00, 0x10, 0x3c, 0x13, 0x10, 0x08, 0x0a, 0x1c, 0x08, 0xff, 0x00, 0x08, 0x10, 0x0f, 0x00, 0x00, 

0x00, 0x02, 0x82, 0x7a, 0x92, 0x02, 0x02, 0xfe, 0x02, 0x02, 0x02, 0xfa, 0x02, 0x02, 0x00, 0x00, 
0x48, 0x46, 0x41, 0x40, 0x41, 0x46, 0x40, 0x7f, 0x48, 0x44, 0x43, 0x40, 0x41, 0x4e, 0x44, 0x00, 

0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 
0x00, 0x20, 0x7f, 0x20, 0x20, 0x20, 0x20, 0x3f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7f, 0x00, 0x00, 

0x00, 0x02, 0x02, 0x02, 0x02, 0x82, 0x42, 0xfe, 0x06, 0x42, 0xc2, 0x82, 0x02, 0x03, 0x02, 0x00, 
0x00, 0x08, 0x04, 0x02, 0x01, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x01, 0x07, 0x02, 0x00, 0x00, 

0x80, 0x80, 0x80, 0x80, 0xbe, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xbe, 0x80, 0x80, 0x80, 0x00, 
0x00, 0x40, 0x20, 0x10, 0x0e, 0x10, 0x20, 0x3f, 0x44, 0x44, 0x44, 0x44, 0x44, 0x40, 0x40, 0x00, 

0x40, 0x40, 0x44, 0x44, 0x44, 0x44, 0xc4, 0xc4, 0x44, 0x44, 0x46, 0x46, 0x64, 0x60, 0x40, 0x00, 
0x00, 0x20, 0x70, 0x38, 0x2c, 0x27, 0x23, 0x31, 0x10, 0x12, 0x14, 0x18, 0x70, 0x20, 0x00, 0x00, 

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x5b, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

uchar code hz2[]=
{
0x02, 0x02, 0xfe, 0x92, 0x92, 0x92, 0xfe, 0x02, 0x02, 0x7c, 0x84, 0x04, 0x84, 0x7c, 0x04, 0x00, 
0x10, 0x10, 0x0f, 0x08, 0x08, 0x04, 0xff, 0x04, 0x22, 0x10, 0x09, 0x06, 0x09, 0x30, 0x10, 0x00, 

0x00, 0x02, 0x1c, 0xc0, 0x30, 0x4c, 0x30, 0x0f, 0x08, 0xf8, 0x08, 0x08, 0x28, 0x18, 0x08, 0x00, 
0x02, 0x5e, 0x43, 0x20, 0x20, 0x10, 0x08, 0x04, 0x03, 0x01, 0x06, 0x08, 0x30, 0x60, 0x20, 0x00, 

0x04, 0x04, 0x04, 0x84, 0xf4, 0x2f, 0x04, 0x04, 0xe4, 0x0f, 0x04, 0xc4, 0x84, 0x04, 0x04, 0x00, 
0x00, 0x02, 0x01, 0x00, 0xff, 0x00, 0x08, 0x04, 0x3f, 0x42, 0x41, 0x40, 0x40, 0x78, 0x20, 0x00, 

0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x20, 0x30, 0x2c, 0x23, 0x20, 0x21, 0x36, 0x2c, 0x23, 0x20, 0x20, 0x23, 0x26, 0x3c, 0x28, 0x00, 

0xe0, 0x00, 0xff, 0x10, 0xf4, 0x94, 0xff, 0x94, 0xf4, 0x08, 0xf4, 0x13, 0x92, 0x1a, 0xf6, 0x00, 
0x00, 0x00, 0xff, 0x10, 0x08, 0x06, 0xff, 0x02, 0x04, 0x80, 0x4f, 0x20, 0x1f, 0x20, 0xcf, 0x00, 

0x00, 0xfe, 0x02, 0x02, 0xf2, 0x12, 0x12, 0x12, 0x12, 0x12, 0xf2, 0x02, 0x02, 0xfe, 0x00, 0x00, 
0x00, 0x7f, 0x40, 0x40, 0x47, 0x44, 0x44, 0x44, 0x44, 0x44, 0x47, 0x40, 0x40, 0x7f, 0x00, 0x00, 

0x00, 0xfe, 0x02, 0xf2, 0x12, 0x12, 0xf2, 0x00, 0xf2, 0x12, 0x1a, 0xd6, 0x12, 0xf2, 0x02, 0x00, 
0x20, 0x1f, 0x00, 0x3f, 0x10, 0x09, 0x45, 0x40, 0x2f, 0x20, 0x10, 0x0f, 0x10, 0x2f, 0x60, 0x00, 

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x58, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
};

uchar code hz3[]=
{
0x00, 0x00, 0x42, 0x44, 0x5c, 0x48, 0x40, 0xff, 0x40, 0x50, 0x48, 0x46, 0x64, 0x40, 0x00, 0x00, 
0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0xff, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x04, 0x00, 

0x20, 0x38, 0xa7, 0x62, 0x10, 0x20, 0xa0, 0x6c, 0x6b, 0xaa, 0x2a, 0x3a, 0x26, 0xa0, 0x20, 0x00, 
0x12, 0x13, 0x12, 0x0a, 0x29, 0x25, 0x12, 0x12, 0x49, 0x85, 0x7f, 0x02, 0x0d, 0x18, 0x08, 0x00, 

0x20, 0x10, 0xfc, 0x07, 0xf2, 0x20, 0x98, 0x8f, 0x54, 0xa4, 0x24, 0x54, 0xcc, 0x80, 0x80, 0x00, 
0x00, 0x00, 0x7f, 0x00, 0x03, 0x54, 0x54, 0x4a, 0x2b, 0x25, 0x15, 0x12, 0x0a, 0x09, 0x00, 0x00, 

0x40, 0x42, 0xcc, 0x00, 0x04, 0x04, 0xe5, 0xb6, 0xac, 0xa4, 0xa6, 0xe5, 0x04, 0x04, 0x00, 0x00, 
0x40, 0x20, 0x1f, 0x20, 0x40, 0x40, 0x5f, 0x4a, 0x4a, 0x4a, 0x4a, 0x5f, 0x40, 0x40, 0x40, 0x00, 

0x00, 0x00, 0x42, 0x44, 0x5c, 0x48, 0x40, 0xff, 0x40, 0x50, 0x48, 0x46, 0x64, 0x40, 0x00, 0x00, 
0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0xff, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x04, 0x00, 

0x20, 0x38, 0xa7, 0x62, 0x10, 0x20, 0xa0, 0x6c, 0x6b, 0xaa, 0x2a, 0x3a, 0x26, 0xa0, 0x20, 0x00, 
0x12, 0x13, 0x12, 0x0a, 0x29, 0x25, 0x12, 0x12, 0x49, 0x85, 0x7f, 0x02, 0x0d, 0x18, 0x08, 0x00, 

0x10, 0x10, 0x92, 0x92, 0x92, 0xf2, 0x9e, 0x92, 0x92, 0x92, 0x92, 0x92, 0xfe, 0x10, 0x10, 0x00, 
0x40, 0x20, 0x10, 0x0c, 0xfe, 0x45, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0xfd, 0x00, 0x00, 0x00, 

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x18, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

};

主函数,程序的入口点

void main()
{
  while(1) // 无限循环
  {
    lcd_init(); // 初始化LCD
    lcd_str_wr(0,0,8,hz0); // 在LCD的第一行第一列开始显示汉字hz0
    delay(100); // 延时100个时间单位
    cd_str_wr(1,0,8,hz1);//  其他类似的显示调用
    delay(100);
    lcd_str_wr(2,0,8,hz2);
    delay(100);
    lcd_str_wr(3,0,8,hz3);
    delay(100); 
    lcd_rol(); // 滚动函数
    delay(1000); // 延时1000个时间单位
    lcd_rol();//  滚动显示
    delay(1000);
  }
}

// 初始化LCD函数
void lcd_init()
{
  uint i;
  lcd_cmd_wr(0x3f,0);
  lcd_cmd_wr(0xc0,0);
  lcd_cmd_wr(0xb8,0);
  lcd_cmd_wr(0x40,0);
  lcd_cmd_wr(0x3f,1);
  lcd_cmd_wr(0xc0,1);
  lcd_cmd_wr(0xb8,1);
  lcd_cmd_wr(0x40,1);
  for(i=0;i<256;i++)
  {
    lcd_data_wr(0x00,0);
    lcd_data_wr(0x00,1);
  }
  lcd_cmd_wr(0xb8+4,0);
  lcd_cmd_wr(0xb8+4,1);
  for(i=0;i<256;i++)
  {
    lcd_data_wr(0x00,0);
    lcd_data_wr(0x00,1);
  }//  初始化代码,设置LCD工作模式
}

// 向LCD发送命令的函数
void lcd_cmd_wr(uchar cmdcode,uchar f)
{
  chech_busy(f);
  if(f==0) LLCD_CMD_WR=cmdcode;
  else RLCD_CMD_WR=cmdcode;
  // 发送命令前检查忙信号,然后发送命令
}

// 检查LCD忙信号的函数
void chech_busy(uchar f)
{
  if(f==0) LLCD_CMD_RD;
  else RLCD_CMD_RD;
  while(busy);
  //  检查忙信号
}

// 向LCD写入字符串的函数
void lcd_str_wr(uchar row,uchar col,uchar n,uchar *str)
{
  uchar i;
  for(i=0;i<n;i++)
  {
    lcd_hz_wr(row,col,str+i*32);
    delay(50);
    col++;
  }
  // 根据行列号和字模数组写入字符串
}

// 向LCD写入汉字的函数
void lcd_hz_wr(uchar posx,uchar posy,uchar *hz)
{
  uchar i;
  if(posy<4)
  {
    lcd_cmd_wr(0xb8+2*posx,0);
    lcd_cmd_wr(0x40+16*posy,0);
    for(i=0;i<16;i++) lcd_data_wr(hz[i],0);
    lcd_cmd_wr(0xb8+2*posx+1,0);
    lcd_cmd_wr(0x40+16*posy,0);
    for(i=16;i<32;i++) lcd_data_wr(hz[i],0);
  }
  else
  {
    lcd_cmd_wr(0xb8+2*posx,1);
    lcd_cmd_wr(0x40+16*(posy-4),1);
    for(i=0;i<16;i++) lcd_data_wr(hz[i],1);
    lcd_cmd_wr(0xb8+2*posx+1,1);
    lcd_cmd_wr(0x40+16*(posy-4),1);
    for(i=16;i<32;i++) lcd_data_wr(hz[i],1); 
  }
  //  根据行列号和汉字字模数组写入汉字
}

// 向LCD写入数据的函数
void lcd_data_wr(uchar ldata,uchar f)
{
  chech_busy(f);
  if(f==0) LLCD_DATA_WR=ldata;
  else RLCD_DATA_WR=ldata;
  //  发送数据前检查忙信号,然后发送数据
}

// 滚动显示函数
void lcd_rol()
{ 
  uchar i;
  for(i=0;i<64;i++)
  {
    lcd_cmd_wr(0xc0+i,0);
    lcd_cmd_wr(0xc0+i,1);
    delay(10);
  }
  //实现滚动显示的代码
}

// 延时函数
void delay(uint n)
{
  uint i;
  for(;n>0;n--)
      for(i=500;i>0;i--);
  //  实现延时的代码
}

七、运行仿真




八、总结

学习LCD滚动显示汉字是一个涉及硬件操作、编程技能和问题解决能力的综合性过程。从理解LCD显示原理和选择合适硬件开始,到掌握编程语言和接口协议,再到创建汉字字模、编写滚动显示逻辑,每一步都至关重要。在实践中,通过仿真软件如Proteus进行测试,调试程序,解决遇到的各种问题。最终,将所学知识应用到实际项目中,不断优化显示效果,并在社区中分享经验,与他人交流,以持续提升个人技术水平。这个过程不仅增强了对嵌入式系统设计的理解,也锻炼了解决复杂问题的能力。