单片机原理及接口技术设计报告——1602字符液晶滚动演示程序
单片机1602液晶显示原理
单片机1602液晶显示原理
首先,从硬件连接方面来看,单片机与1602液晶显示器之间的连接通常需要16个引脚。
这些引脚包括数据总线(D0-D7)、控制引脚(RS、RW、E)以及电源和地线。
数据总线用于传输要显示的数据,而控制引脚用于控制液晶显示器的工作状态。
单片机通过这些引脚与液晶显示器进行通信,从而实现对显示内容的控制。
其次,从工作原理方面来看,单片机控制1602液晶显示器的基本原理是利用单片机的IO口向液晶显示器发送指令和数据。
当单片机需要在液晶显示器上显示内容时,首先需要向液晶显示器发送控制指令,如清屏、定位光标等,然后再发送要显示的数据。
液晶显示器接收到指令和数据后,根据单片机发送的信号来控制液晶显示器的内部驱动电路,从而在屏幕上显示相应的内容。
总的来说,单片机1602液晶显示原理涉及到单片机与液晶显示器之间的硬件连接和通信协议。
通过单片机向液晶显示器发送指令和数据,实现对液晶显示器显示内容的控制。
这样的设计使得单片机能够方便地控制液晶显示器,实现各种复杂的显示效果。
单片机课程设计报告--LCD1602字符液晶滚动演示程序
单片机原理与应用综合实验报告LCD1602字符液晶滚动演示程序专业班级:姓名:学号:时间:指导教师:2012年 05月 23日LCD1602字符液晶滚动演示程序摘要:本设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机89C51,采用的液晶显示器是LCD1602,主要用来显示字母、数字、符号,滚屏、左右移动以及实时控制功能。
同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程。
本设计还介绍了显示原理、硬件电路和软件部分的设计原理。
关键词:1602液晶显示器 89C51单片机并行通信1 引言:液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其它显示器无法相比的优点。
近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。
液晶显示器分为字符型LCD显示模块和点阵型LCD显示模块。
字符型LCD是一种用5×7点阵图形来显示字符的液晶显示器。
点阵型液晶可显示用户自定义的任意符号和图形,并可卷动显示,它作为便携式单片机系统人机交互界面的重要组成部分被广泛应用于实时检测和显示的仪器仪表中。
支持汉字显示的点阵型液晶在现代单片机应用系统中是一种十分常用的显示设备,汉字BP机、手机上的显示屏就是点阵型LCD。
点阵型LCD是现代单片机应用系统中最常用的人机交互界面之利用单片机控制液晶显示系统的原理,完成单片机液晶显示系统的设计,我希望能够触类旁通,灵活应用其他型号的液晶显示控制器。
将来如果有机会从事这方面的工作,要运用的液晶显示控制器不一定是KS0108,但这次毕业设计中学到的东西为此打下了良好的基础,相信自己能做好这方面的工作。
2 总体设计方案2.1 设计思路2.1.1 本设计主要是通过控制89C51单片同的引脚来控制LCD1602显示给定的符号、字母、数字,以及控制显示内容的垂直移动和水平移动。
1602液晶滚动显示 C语言详细程序
/****************************************************************************** *** 描述: LCD1602 滚动显示** 显示方式:* * 1、从左到右逐字显示,闪动二次,清屏。
* * 2、再从右到左逐字显示,闪动二次,清屏。
* * 3、周期性地重复上述显示方式。
* ******************************************************************************* */#include <reg51.h>#include <intrins.h>typedef unsigned char BYTE;typedef bit BOOL;sbit LCD_RS = P2^6;sbit LCD_RW = P2^5;sbit LCD_EP = P2^7;BYTE code dis1[] = {" WELCOME TO "};BYTE code dis2[] = {" "};BYTE code dis3[] = {" OT EMOCLEW "};BYTE code dis4[] = {" MOC.NIHCERP.WWW "};delay(int ms){ // 延时子程序int i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}BOOL lcd_bz(){ // 测试LCD忙碌状态BOOL result;LCD_RS = 0;LCD_RW = 1;LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);LCD_EP = 0;return result;}lcd_wcmd(BYTE cmd){ // 写入指令数据到LCD while(lcd_bz());LCD_RS = 0;LCD_RW = 0;LCD_EP = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_pos(BYTE pos){ //设定显示位置lcd_wcmd(pos | 0x80);}lcd_wdat(BYTE dat){ //写入字符显示数据到LCD while(lcd_bz());LCD_RS = 1;LCD_RW = 0;LCD_EP = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();LCD_EP = 1;_nop_();_nop_();_nop_();_nop_();LCD_EP = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据delay(1);lcd_wcmd(0x0c); //显示开,关光标delay(1);lcd_wcmd(0x06); //移动光标delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}main(){BYTE i;lcd_init(); // 初始化LCDdelay(10);while(1){lcd_wcmd(0x06); //向右移动光标lcd_pos(0); //设置显示位置为第一行的第1个字符i = 0;while(dis1[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis1[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x40); //设置显示位置为第二行第1个字符i = 0;while(dis2[ i ] != '\0'){lcd_wdat(dis2[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(1);lcd_wcmd(0x04); //向左移动光标lcd_pos(15); //设置显示位置为第一行的第16个字符i = 0;while(dis3[ i ] != '\0'){ //显示字符"WLCOME TO"lcd_wdat(dis3[ i ]);i++;delay(30); //控制两字之间显示速度}lcd_pos(0x4F); //设置显示位置为第二行的第16个字符i = 0;while(dis4[ i ] != '\0'){lcd_wdat(dis4[ i ]); //显示字符" "i++;delay(30); //控制两字之间显示速度}delay(800); //控制停留时间lcd_wcmd(0x01); //清除LCD的显示内容delay(200); //控制两屏转换时间}}。
1602液晶滚动显示
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>sbit RS = P2^2; //定义端口sbit RW = P2^3;sbit EN = P2^4;sbit WEI=P2^7; //数码管位控制脚sbit DUAN=P2^6; //数码管段控制脚#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0void lcd1602_pos(unsigned char x,unsigned char y);void lcd1602_wrtie_string( char *str);/*------------------------------------------------uS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编,大致延时长度如下T=tx2+5 uS------------------------------------------------*/void DelayUs2x(unsigned char t){while(--t);}/*------------------------------------------------mS延时函数,含有输入参数unsigned char t,无返回值unsigned char 是定义无符号字符变量,其值的范围是0~255 这里使用晶振12M,精确延时请使用汇编------------------------------------------------*/void DelayMs(unsigned char t){while(t--){//大致延时1mSDelayUs2x(245);DelayUs2x(245);}}/*------------------------------------------------判忙函数------------------------------------------------*/ bit LCD_Check_Busy(void){DataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80);}/*------------------------------------------------写入命令函数------------------------------------------------*/ void LCD_Write_Com(unsigned char com) {while(LCD_Check_Busy()); //忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;}/*------------------------------------------------写入数据函数------------------------------------------------*/ void LCD_Write_Data(unsigned char Data) {while(LCD_Check_Busy()); //忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;}/*------------------------------------------------清屏函数------------------------------------------------*/void LCD_Clear(void){LCD_Write_Com(0x01);DelayMs(5);}/*确定位置************/void lcd1602_pos(unsigned char x,unsigned char y) //确定位置{unsigned char pos;if (x==1){x=0x80;}else if (x==2){x=0xc0;}pos=x+y-1;LCD_Write_Com(pos); //显示地址}void lcd1602_wrtie_string( char *str) //写字符串{while(*str!='\0') //未结束{LCD_Write_Data(*str++);}}/*------------------------------------------------初始化函数------------------------------------------------*/void LCD_Init(void){LCD_Write_Com(0x38); /*显示模式设置*/DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);LCD_Write_Com(0x08); /*显示关闭*/LCD_Write_Com(0x01); /*显示清屏*/LCD_Write_Com(0x06); /*显示光标移动设置*/DelayMs(5);LCD_Write_Com(0x0C); /*显示开及光标设置*/}/*------------------------------------------------主函数------------------------------------------------*/void main(void){WEI=0; //位锁存置0电平,防止LED亮的时候数码管亮DUAN=0; //段锁存置0电平,防止LED亮的时候数码管亮LCD_Init();LCD_Clear();//清屏lcd1602_pos(1,7);lcd1602_wrtie_string("Hello");lcd1602_pos(2,1);lcd1602_wrtie_string("Welcome to 2014");while (1){DelayMs(2000);LCD_Write_Com(0x18);//左平移画面0x1C 是右平移}}。
1602字符液晶显示原理+实例详解
1602详细资料和实例1602字符液晶在实际的产品中运用的也比较多了,前几天留意了一下,发现宿舍门前的自动售水机就是采用的1602液晶进行显示的。
而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。
在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给初学者带来一点指导,少走一点弯路。
所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM和CGRAM。
DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码(指A的字模代码,0x20~0x7F为标准的ASCII码,通过这个代码,在CGROM中查找到相应的字符显示)就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:DDRAM地址与显示位置的对应关系。
(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码,见字模关系对照表)并不能显示1出来。
这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。
单片机应用技术课程报告~1602LCD液晶显示屏的显示
单片机应用技术课程报告
实验名称1602LCD液晶显示屏的显示实验时间2020年 7月 9日学生姓名实验地点钉钉群线上
同组人员专业班级
1、实验目的
1、会使用单片机4个并行I/O端口连接外部设备并构建单片机最小应用系统。
2、能使用工具软件绘制单片机硬件原理图、能编写简LCD控制程序。
3、会使用LCD1602显示指定的内容。
2、任务设计要求
采用STC89C52单片机构建最小系统,在I/O口外接1602,编程实现在1602字符型LCD显示:实现字符的静态和动态显示。
显示字符为第一行:“I am xx”,第二行:“Hou are you”。
3、总体设计方案
根据实验任务要求,通过功能分析,设计的系统总体方案如图所示。
并
行接口AT89C51
单片机
电源
时钟电路
复位电路
实现led显示屏显示
4、硬件电路设计
5、软件程序设计
(2)程序清单
#include<reg51.h>
#include<intrins.h>//包含_nop_()空函数指令的头文件#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit RS=P2^0;//位变量
sbit RW=P2^1;//位变量
sbit E=P2^2;//位变量
void lcd_ini();//LCD初始化函数
void check_busy();//检查忙标志函数
2)性能指标测试及结果分析。
1602液晶滚动显示汇编程序
djnz 30h,ms1
ret
dely_us:mov 30h,#30
us:djnz 30h,us
ret
dely:mov 30h,#5
y1:mov 31h,#200
y2:mov 32h,#200
y3:djnz 32h,y3
djnz 31h,y2
djnz 30h,y1
ret
tab1:db "Baby I love you for life! "
db 00
end
sz7:clr rs
clr rw
mov p0,#90h
setb ep
nop
nop
clr ep
lcall dely_us
ret
//写入数据
xr: lcall sz4
setb rs //数据标志位
clr rw //写入标志位
mov a,r1
movc a,@a+dptr //查表
jz gret //检测是否显示完全//零为标志位
mov p0,a //并行输出数据
setb ep
nop
nop
clr ep
lcall dely
inc r1 //读下一个字符
lcall sz1 //清屏初始化设置
lcall sz7 //设置第一行显示坐标
mov dptr,#tab1 //设置段码表地址一行显示段码表
lcall xr
ys:lcall dely
ljmp main
//清屏指令写入
sz1:clr rs //写指令标志
我的51单片机之 液晶1602 的C语言和汇编编程
//三次显示模式设置,不检测忙信号
//显示模式设置,开始要求每次检测忙信号 //关闭显示 //显示清屏 // 显示光标移动设置 // 显示开及光标设置
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
#include<reg51.h>
#include<intrins.h>
#define DBPort P1 //液晶数据口
sbit RW=P0^1; //寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
sbit RS=P0^0; //读写信号线,高电平时进行读操作,低电平时进行写操作。
sbit E=P0^2;
void main(void) {
Delay400Ms(); Init(); //LCM 初始化 DisplayListChar(0, 1, uctech); DisplayListChar(0, 0, net); while(1); }
//第二行第一列开始 //第一行第一列开始
//写数据 void WriteData(unsigned char WD) {
ReadStatus(); //检测忙 DBPort = WD; RS = 1; RW = 0; E = 0; //可加小延时 delay(); E = 1; }
//写指令 void WriteCommand(unsigned char WC,BuysC) {
if (BuysC) ReadStatus(); DBPort = WC; RS = 0; RW = 0; E = 0; E = 1; }
LCD1602液晶显示实验实验报告及程序
LCD1602液晶显示实验实验报告及程序一、实验目的本次实验的主要目的是熟悉并掌握 LCD1602 液晶显示屏的工作原理和编程方法,能够成功实现字符在液晶屏幕上的显示和控制。
二、实验原理LCD1602 是一种工业字符型液晶,能够显示 16x2 个字符,即每行16 个字符,共 2 行。
它的工作原理是通过控制液晶分子的偏转来实现字符的显示。
LCD1602 有 16 个引脚,主要引脚功能如下:1、 VSS:接地。
2、 VDD:接电源(通常为+5V)。
3、 V0:对比度调整引脚,通过外接电位器来调节屏幕显示的对比度。
4、 RS:寄存器选择引脚,高电平时选择数据寄存器,低电平时选择指令寄存器。
5、 RW:读写选择引脚,高电平时进行读操作,低电平时进行写操作。
6、 E:使能引脚,下降沿触发。
7、 D0 D7:数据引脚,用于传输数据和指令。
LCD1602 的指令集包括清屏、归位、输入方式设置、显示开关控制、光标或显示移位、功能设置、CGRAM 和 DDRAM 地址设置以及读忙标志和地址等。
三、实验设备与材料1、单片机开发板2、 LCD1602 液晶显示屏3、杜邦线若干4、电脑四、实验步骤1、硬件连接将 LCD1602 的 VSS 引脚接地。
将 VDD 引脚接+5V 电源。
将 V0 引脚通过一个 10K 的电位器接地,用于调节对比度。
将 RS、RW、E 引脚分别连接到单片机的三个 I/O 口。
将 D0 D7 引脚连接到单片机的 8 个 I/O 口。
2、软件编程包含必要的头文件。
定义与 LCD1602 连接的 I/O 口。
编写初始化函数,包括设置显示模式、清屏、输入方式等。
编写写指令函数和写数据函数,用于向LCD1602 发送指令和数据。
编写显示字符串函数,实现字符在屏幕上的显示。
3、编译下载程序使用编译软件对编写的程序进行编译,生成可执行文件。
将可执行文件下载到单片机开发板中。
4、观察实验结果给开发板上电,观察 LCD1602 液晶显示屏上是否正确显示预设的字符。
1602程序
1602程序
简介
1602程序是一种用于控制1602液晶屏幕的程序。
1602
液晶屏幕是一种常见的单色液晶显示屏,广泛应用于各种电子设备中。
这个程序能够实现在1602液晶屏幕上显示文本、数字和特殊字符等功能。
功能
1602程序具有以下功能:
1.文本显示:程序可以在1602液晶屏幕上显示自定
义的文本信息,可以显示多行文本,并且支持中英文字符。
2.数字显示:程序可以在1602液晶屏幕上显示数字,
并支持数字的滚动显示功能。
3.特殊字符显示:程序支持在1602液晶屏幕上显示
特殊字符,比如箭头、心形等。
使用方法
用户可以按照以下步骤来使用1602程序:
1.连接1602液晶屏幕:首先,将1602液晶屏幕与
单片机或其他控制器正确连接。
确保数据线和控制线的接口连接正确。
2.导入1602程序:将1602程序的代码导入到单片
机或其他控制器中,例如Arduino等。
3.设置程序参数:根据实际需求,在程序中设置相应
参数,例如要显示的文本内容、数字等。
4.运行程序:将控制器与电源连接,运行程序,即可
在1602液晶屏幕上看到相应的显示效果。
示例代码
下面是一个示例代码,演示了如何使用1602程序显示文本和数字:
```markdown #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() { lcd.begin(16, 2); lcd.print(。
单片机控制的lcd1602字符液晶滚动电路功能说明
单片机控制的lcd1602字符液晶滚动电路功能说明功能说明:单片机控制的LCD1602字符液晶滚动电路该电路是由单片机控制的LCD1602字符液晶显示屏的滚动功能。
通过单片机的程序控制,可以实现字符的滚动显示,从而达到信息展示的目的。
具体功能说明如下:1. 显示屏控制:该电路使用LCD1602字符液晶显示屏作为显示器,通过单片机的控制,可以控制显示屏上的字符显示。
显示屏具有2行16列的字符显示区域。
2. 滚动显示:通过单片机的程序控制,可以实现字符的滚动显示。
滚动显示可以从左向右或者从右向左进行,可以设置滚动速度和滚动内容。
3. 单片机控制:该电路使用单片机作为控制核心,通过单片机的GPIO口控制显示屏的数据和控制信号。
单片机可以根据用户的需求,通过编程实现不同的滚动效果。
4. 滚动速度调节:用户可以通过调节单片机程序中的延时参数,来控制滚动速度。
延时时间越短,滚动速度越快;延时时间越长,滚动速度越慢。
5. 滚动内容设置:用户可以通过编程将需要滚动显示的内容存储在单片机的内存中,然后通过单片机控制,将内容逐个字符地显示在LCD1602字符液晶显示屏上。
6. 滚动方向选择:用户可以通过编程设置滚动的方向,可以选择从左向右滚动或者从右向左滚动。
7. 硬件连接:该电路需要将单片机的GPIO口与LCD1602字符液晶显示屏的数据和控制信号引脚连接起来,通过连接线进行数据传输和控制。
总结:该电路通过单片机控制LCD1602字符液晶显示屏的滚动功能,可以实现字符的滚动显示,从而达到信息展示的目的。
用户可以通过编程设置滚动速度、滚动内容和滚动方向,灵活控制滚动效果。
这种电路在信息展示、广告宣传等领域有着广泛的应用。
单片机液晶显示(以1602为例)
液晶显示(所有程序都经过测试合格)一、基础部分。
(以1602与12864介绍)本部分以液晶1602为主,来引出关于单片机操作液晶的基本知识。
为以后液晶的高级应用打好基础。
Ⅰ、本程序最终目的为:显示一个双行数字,并实现整屏移动。
总的原理图及源程序如下:原理图:液晶电路图\液晶显示.ddb源程序:液晶例程\液晶显示.c#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="I LIKE MCU!";uchar code table1[]="";sbit lcdwr=P2^5;//R/S命令选择端,H/L;sbit lcden=P2^7;//使能端sbit lcdrs=P2^6;//RS数据/命令选择端。
H/L;//sbit dula=P2^6;//sbit wela=P2^7;uchar num;void delay(uint z)//延时程序,z的数是几就是几ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//写命令函数,{lcdrs=0;//写入命令初始化,设置为低电平表示命令选择端。
P0=com; //由时序图可知,在使能en触发时,早就有数据写入。
delay(5); //并且有一段延时,此处设置为5毫秒lcden=1; //使能端开始拉高delay(5); //由时序图,使能端拉低一段时间thD2后,数据传输?lcden=0; //然后将使能端拉低}void write_data(uchar date){lcdrs=1;P0=date;delay(5);//此处延时,是为了对应数据中:在E拉高之前,有数据的一段准备时间。
1602液晶显示工作原理及其在单片机中的应用(基于Proteus仿真)
1602液晶显示原理及其在单片机中的应用基于Proteus仿真前言:本文详细介绍了1602液晶显示器的工作原理,并在后面举例说明了其在单片机中的应用,所举例子包含Proteus仿真电路图,源程序,程序注释详细清楚。
这有助于更好地理解与掌握1602液晶显示器。
1、1602 LCD基本参数:1602 LCD内置HD44780(目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的)专用液晶显示控制器,分为带背光和不带背光两种,带背光的比不带背光的厚,是否带背光在应用中并无差别。
显示容量为16×2个字符,即可以显示2行,每行16个字符。
芯片工作电压:4.5—5.5V;最佳工作电压为5.0V;工作电流:2.0mA(5.0V电压下);(补充说明:在电子工业中,背光是一种照明的形式,常被用于LCD显示上。
背光式和前光式不同之处在于背光是从侧边或是背后照射,而前光顾名思义则从前方照射。
他们被用来增加在低光源环境中的照明度和电脑显示器、液晶荧幕上的亮度,以和CRT显示类似的方式产生出光。
)2、1602 LCD引脚功能:1602芯片(在proteus中名字为LM016L) 采用标准的14脚(无背光)或16脚(带背光)接口,如右图所示,各引脚功能如下:VSS:电源地VDD:电源正极VEE:液晶显示偏压,为对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
(补充说明:整体回路中的某个点,测量它相对某个基准点的电压(是整体回路电压的1/n)就称之为该点的偏压,各段电路的偏压之和就是整体回路电压,相应位置的电流就是偏压电流。
)RS:数据/命令选择信号,高电平时选择数据寄存器、低电平时选择指令寄存器。
RW(read/write,读/写):读/写控制信号,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
LCD1602字符液晶滚动演示程序 2
//----------------------------------------------------------------------------------//LCD1602字符液晶滚动演示程序//----------------------------------------------------------------------------------#include <reg51.h>#include <string.h>#define uchar unsigned char#define uint unsigned intvoid Initialize_LCD();void ShowString (uchar,uchar,uchar *);sbit K1 = P3^0;sbit K2 = P3^1;sbit K3 = P3^2;uchar code Prompt[]="PRESS K1 - K4 TO START DEMO PROG" ;//待滚动显示的信息段落,每行不超过80个支符,共6行uchar const Line_Count = 6;uchar code Msg[][80]={"Many CAD users dismiss schematic capture as a necessary evil in the " , "process of creating PCB layout but we have always disputed this point ", "of view. With PCB layout now offering automation of both component ", "placement and track routing, getting the design into the computer ","can often be the most time consuming element of the exercise. ","and if you use circuit simulation to develop your ideas, ","you are going to spend even more time working on the schematic."};//显示缓冲(2)行uchar Disp_Buffer[32];//----------------------------------------------------------------------------------//延时//----------------------------------------------------------------------------------void Delayxms(uint x){uchar i;while (x--) for (i = 0;i < 120;i++);}//----------------------------------------------------------------------------------//垂直滚动显示//----------------------------------------------------------------------------------void V_Scroll_Display(){uchar i,j,k = 0;uchar *p = Msg[0];uchar *q = Msg[Line_Count]+strlen(Msg[Line_Count]);//以下仅使用显示缓存的前16个节空间while (p<q){for (i = 0; i < 16 && p < q;i++ ){//消除显示缓冲中待显示行首尾可能出现的空格if ( ( i==0 || i== 15)&& *p == ' ' ) p++ ;if (*p != '\0'){Disp_Buffer[i] = *p++;}else{if (++k > Line_Count) break;//p指向下一串的首地址p=Msg[k];Disp_Buffer[i] = *p++;}}//不足16个字符时用空格补充for (j=i;j<16;j++)Disp_Buffer[j] =' ' ;//垂直滚动显示while (F0) Delayxms (5);ShowString(0,0, " ");Delayxms (150);while (F0) Delayxms (5);ShowString(0,1, Disp_Buffer);Delayxms (150);while (F0) Delayxms (5);ShowString(0,0,Disp_Buffer);ShowString(0,1, " ");Delayxms (150);}//最后清屏ShowString(0,0," ");ShowString(0,1," ");}//-------------------------------------------------------------------//水平滚动显示//-------------------------------------------------------------------void H_Scroll_Display(){uchar i,j,k = 0,L = 0;uchar *p = Msg[0];uchar *q = Msg[Line_Count]+strlen(Msg[Line_Count]);//将32个字符的显示缓冲中前16个字符设为空格for (i = 0; i< 16; i++)Disp_Buffer[i] = ' ';while (p<q){//忽略缓冲中首尾可能出现的空格if ((i = 16||i == 31) && *p == ' ') p++;for (i = 16; i < 32 && p < q; i++){if (*p != '\0'){Disp_Buffer[i] = *p++;}else{if (++k >Line_Count) break;//p指向下一串的首地址p = Msg[k];Disp_Buffer[i] = *p++;}}//不足32个字符时用空格补充for (j = i;j < 32;j++)Disp_Buffer[j] = ' ';//水平滚动显示for (i = 0;i <= 16; i++){while (F0) Delayxms(5);ShowString(0,L,Disp_Buffer + i);while (F0) Delayxms (5);Delayxms(20);}L = (L == 0) ? 1 : 0; //行号在0,1间交替Delayxms(200);}//如果显示结束时停留在第0行,则清除第一行的内容if (L == 1)ShowString(0,1," "); }//---------------------------------------------------------------------//外部中断0,由K3控制暂停与继续显示//--------------------------------------------------------------------- void EX_INT0() interrupt 0{//暂停与继续显示控制标志位F0 = ! F0;}//--------------------------------------------------------------------//主程序//--------------------------------------------------------------------void main(){uint Count = 0;IE = 0x81; //允许外部中断0IT0 = 1 ; //下降沿触发F0 = 0; //暂停显示与继续显示控制标志位Initialize_LCD();ShowString(0,0,Prompt);ShowString(0,1,Prompt + 16);while(1){if (K1 == 0){V_Scroll_Display();Delayxms(200);}elseif (K2 ==0){H_Scroll_Display();Delayxms (200);}}}。
51单片机1602液晶-(教程)
51单片机1602液晶接口设计
51单片机的1602液晶
VL- 液晶屏对比度的调节
L命令是对液晶屏显示的设置 H数据是要显示的东西
51单片机的1602液晶
1602液晶的存储器结构
1. DDRAM:
显示数据RAM,用来寄存待显示的字符代码。共80个字 节,其地址和屏幕的对应关系如下图: 要在屏幕上显示字符,只需向相关DDRAM中写入该字符 的ASCII码即可。
1602液晶的存储器结构
2. CGROM:
字符发生存储器,已经存储了160个不同的点阵字符图形, 按ASCII码排列,如下图所示:
51单片机的1602液晶
51单片机的1602液晶
液晶显示
0x38
5
7
51单片机的1602液晶
பைடு நூலகம்
51单片机的1602液晶
51单片机的1602液晶
写命令子函数 命令选择 DB0-DB7 E使能高电平
使能E开
使能E关 写数据子函数 数据选择 DB0-DB7
E使能高电平
使能E开 使能E关
51单片机的1602液晶
字符代码:
0x00~0x0F为用户自定 义的字符图形RAM。
0x20~0x7F为标准的 ASCII码。 0xA0~0xFF为日文字符 和希腊文字符。
1602液晶的存储器结构
3. CGRAM:
用户自定义字符发生存储器,共64字节,地址为 0x00~0x3f,可存储8个5*8点阵图形,其中地址0x00~0x07 存储字符代码为0x00的字符图形,0x08~0x0f存储字符代码 为0x01的字符图形,以此类推。
最新最详细的单片机课程设计-基于单片机控制的1602液晶显示
单片机原理及系统课程设计专业:自动控制班级:控XX姓名: XX学号: XXX指导教师: XXX评语:平时(40)修改(30)报告(30)总成绩兰州交通大学自动化与电气工程学院2012 年 7月 1日基于单片机控制的1602液晶显示1.引言单片机作为微型计算机发展的一个重要的分支,以其高可靠性、高性价比、低电压、低功耗的优势,赢得了广泛的应用。
单片机技术是一门技术性、应用性很强的学科,在目前和今后相当长的一段时间仍有着广泛的应用。
实验教学作为其极为重要的组成环节,在硬件扩展、接口应用、编程方法以及程序调试等方面,都起到重要作用。
作为学习自动控制专业的学生,单凭课堂理论课学习,不切实认真的进行实践仿真,势必出现理论与实践脱节、学习与应用脱节等局面。
1.1课程设计的思想此次《单片机原理及系统》课程设计,选择的是利用1602液晶显示,利用AT89C52芯片实现一串滚动字符显示,本次设计使用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCⅡ字符集字库,只有并行接口,无串行接口。
通过C语言编程经keil软件生成可以在proteus软件中仿真装载的.hex文件,进而通过proteus软件进行硬件电路连接以及软件的仿真,利用LM016L显示器替代1602型液晶显示器,最终得出液晶显示。
1.2课程设计的目的此次程设计是在学习必修课程《单片机原理与系统设计》之后,为加强学生对单片机系统设计和应用能力的培养而开设的综合设计训练环节。
本课程设计应结合《单片机原理与系统设计》课程的基础理论,重点强调实际应用技能训练,包括单片机系统设计的软件和硬件两部分。
其课程设计任务是使学生通过应用单片机系统设计的基本理论,基本知识与基本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进行设备技术改造和产品开发的能力,培养学生的创新意识,提高学生的动手能力和分析问题、解决问题的能力。
LCD1602液晶显示实验实验报告及程序
实验三 LCD1602液晶显示实验姓名专业学号成绩一、实验目的1.掌握Keil C51软件与proteus软件联合仿真调试的方法;2.掌握LCD1602液晶模块显示西文的原理及使用方法;3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;4.掌握用LCM1602液晶模块显示数字的C语言编程方法。
二、实验仪器与设备1.微机一台 C51集成开发环境仿真软件三、实验内容1.用Proteus设计一LCD1602液晶显示接口电路。
要求利用P0口接LCD1602液晶的数据端,~做LCD1602液晶的控制信号输入端。
~口扩展3个功能键K1~K3。
参考电路见后面。
2.编写程序,实现字符的静态和动态显示。
显示字符为第一行:“1.姓名全拼”,第二行:“2.专业全拼+学号”。
3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。
显示字符为:“1.姓名全拼 2.专业全拼+学号 EXP8 DISPLAY ”主程序静态显示“My information!”四、实验原理液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。
当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。
1.LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:2.1602液晶模块内部的控制器共有11条控制指令,如表所示:3.芯片时序表:4.1602LCD的一般初始化(复位)过程(1) 延时15ms。
(2) 写指令38H(不检测忙信号)。
(3) 延时5ms。
(4) 写指令38H(不检测忙信号)。
(5) 延时5ms。
单片机1602液晶显示原理
单片机1602液晶显示原理单片机与1602液晶显示屏的原理涉及到单片机控制1602液晶显示屏进行显示的过程。
首先,1602液晶显示屏是一种常见的字符型液晶模块,它由16列和2行的字符组成,每个字符由5x8个像素点组成。
单片机与1602液晶显示屏之间的连接通常通过并行接口进行,这意味着单片机可以直接控制每个像素点的状态以及显示的内容。
在控制1602液晶显示屏时,单片机需要通过IO口来发送指令和数据。
指令可以控制液晶显示屏的工作模式,比如清屏、光标移动等;而数据则是要显示的内容,比如字符、数字等。
单片机与1602液晶显示屏之间的通信是通过并行通信进行的,需要使用一定数量的IO口来实现。
在具体的原理上,单片机通过控制1602液晶显示屏的引脚来实现显示。
其中,液晶显示屏的VSS和VDD引脚分别连接到地和电源,而V0引脚连接到一个可变电阻,用于调整显示的对比度。
而单片机的IO口则连接到液晶显示屏的RS、RW、E、D0-D7引脚,通过这些引脚来发送指令和数据。
在具体的操作过程中,单片机首先需要初始化液晶显示屏,设置显示模式、清屏等操作。
然后,单片机根据需要发送相应的指令和数据来控制液晶显示屏的显示内容。
通过适当的控制,单片机可以实现在1602液晶显示屏上显示各种字符、数字等内容。
总的来说,单片机控制1602液晶显示屏的原理涉及到单片机通过IO口向液晶显示屏发送指令和数据,从而控制液晶显示屏的显示内容。
这种控制方式是通过并行通信实现的,需要连接多个引脚来完成通信和控制。
希望这个回答能够帮助你理解单片机与1602液晶显示屏的原理。
verilog lcd1602滚动显示原理
verilog lcd1602滚动显示原理
LCD1602是一种常见的液晶显示模块,通常用于显示字符和数字。
在Verilog中,使用LCD1602模块进行滚动显示的基本原理可以概括如下:
1. 初始化LCD1602: 在开始任何显示之前,需要初始化LCD1602。
这通常
包括设置其工作模式、显示开/关、光标位置等。
2. 数据写入: 要在LCD上显示任何内容,你需要将数据写入其数据总线。
一般来说,你会将你要显示的字符或数字的ASCII码写入LCD。
3. 滚动显示: 滚动显示的基本原理是不断地改变写入LCD的数据,使显示的内容看起来像是从一端滚动到另一端。
这通常是通过在一个循环中重复上述数据写入步骤来实现的,每次循环都会将数据显示向右移动一位(或更多)。
4. 光标控制: LCD1602有一个光标功能,允许你控制字符在LCD上的位置。
通过适当地设置光标位置,你可以控制滚动显示的速度和方向。
5. 刷新显示: 为了产生平滑的滚动效果,你需要以足够快的速度重复上述步骤。
这通常意味着使用一个计时器或某种形式的延迟来定期更新LCD的内容。
在Verilog中,实现上述原理需要编写相应的硬件描述语言代码。
这可能涉及到对LCD模块的读/写操作、计时器控制以及数据路径的设计。
由于
Verilog主要用于硬件描述和逻辑设计,因此需要深入理解硬件和数字电路的概念才能有效地实现滚动显示功能。
LCD1602字符液晶滚动演示程序 2
//----------------------------------------------------------------------------------//LCD1602字符液晶滚动演示程序//----------------------------------------------------------------------------------#include <reg51.h>#include <string.h>#define uchar unsigned char#define uint unsigned intvoid Initialize_LCD();void ShowString (uchar,uchar,uchar *);sbit K1 = P3^0;sbit K2 = P3^1;sbit K3 = P3^2;uchar code Prompt[]="PRESS K1 - K4 TO START DEMO PROG" ;//待滚动显示的信息段落,每行不超过80个支符,共6行uchar const Line_Count = 6;uchar code Msg[][80]={"Many CAD users dismiss schematic capture as a necessary evil in the " , "process of creating PCB layout but we have always disputed this point ", "of view. With PCB layout now offering automation of both component ", "placement and track routing, getting the design into the computer ","can often be the most time consuming element of the exercise. ","and if you use circuit simulation to develop your ideas, ","you are going to spend even more time working on the schematic."};//显示缓冲(2)行uchar Disp_Buffer[32];//----------------------------------------------------------------------------------//延时//----------------------------------------------------------------------------------void Delayxms(uint x){uchar i;while (x--) for (i = 0;i < 120;i++);}//----------------------------------------------------------------------------------//垂直滚动显示//----------------------------------------------------------------------------------void V_Scroll_Display(){uchar i,j,k = 0;uchar *p = Msg[0];uchar *q = Msg[Line_Count]+strlen(Msg[Line_Count]);//以下仅使用显示缓存的前16个节空间while (p<q){for (i = 0; i < 16 && p < q;i++ ){//消除显示缓冲中待显示行首尾可能出现的空格if ( ( i==0 || i== 15)&& *p == ' ' ) p++ ;if (*p != '\0'){Disp_Buffer[i] = *p++;}else{if (++k > Line_Count) break;//p指向下一串的首地址p=Msg[k];Disp_Buffer[i] = *p++;}}//不足16个字符时用空格补充for (j=i;j<16;j++)Disp_Buffer[j] =' ' ;//垂直滚动显示while (F0) Delayxms (5);ShowString(0,0, " ");Delayxms (150);while (F0) Delayxms (5);ShowString(0,1, Disp_Buffer);Delayxms (150);while (F0) Delayxms (5);ShowString(0,0,Disp_Buffer);ShowString(0,1, " ");Delayxms (150);}//最后清屏ShowString(0,0," ");ShowString(0,1," ");}//-------------------------------------------------------------------//水平滚动显示//-------------------------------------------------------------------void H_Scroll_Display(){uchar i,j,k = 0,L = 0;uchar *p = Msg[0];uchar *q = Msg[Line_Count]+strlen(Msg[Line_Count]);//将32个字符的显示缓冲中前16个字符设为空格for (i = 0; i< 16; i++)Disp_Buffer[i] = ' ';while (p<q){//忽略缓冲中首尾可能出现的空格if ((i = 16||i == 31) && *p == ' ') p++;for (i = 16; i < 32 && p < q; i++){if (*p != '\0'){Disp_Buffer[i] = *p++;}else{if (++k >Line_Count) break;//p指向下一串的首地址p = Msg[k];Disp_Buffer[i] = *p++;}}//不足32个字符时用空格补充for (j = i;j < 32;j++)Disp_Buffer[j] = ' ';//水平滚动显示for (i = 0;i <= 16; i++){while (F0) Delayxms(5);ShowString(0,L,Disp_Buffer + i);while (F0) Delayxms (5);Delayxms(20);}L = (L == 0) ? 1 : 0; //行号在0,1间交替Delayxms(200);}//如果显示结束时停留在第0行,则清除第一行的内容if (L == 1)ShowString(0,1," "); }//---------------------------------------------------------------------//外部中断0,由K3控制暂停与继续显示//--------------------------------------------------------------------- void EX_INT0() interrupt 0{//暂停与继续显示控制标志位F0 = ! F0;}//--------------------------------------------------------------------//主程序//--------------------------------------------------------------------void main(){uint Count = 0;IE = 0x81; //允许外部中断0IT0 = 1 ; //下降沿触发F0 = 0; //暂停显示与继续显示控制标志位Initialize_LCD();ShowString(0,0,Prompt);ShowString(0,1,Prompt + 16);while(1){if (K1 == 0){V_Scroll_Display();Delayxms(200);}elseif (K2 ==0){H_Scroll_Display();Delayxms (200);}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机原理及接口技术设计报告设计题目:1602字符液晶滚动演示程序系别:电子工程系专业:电子信息工程班级:一班姓名:刘晓阳学号:201051804 指导教师:苏宝林时间:20120610绥化学院电气工程学院单片机原理及接口技术设计预习报告【注:主要写设计中的重点、难点】一、利用指针编写程序使字符水平和垂直滚动,指针的使用是本程序的最大难点二、本程序的重点是利用1602芯片的资料编写出控制1602的程序,这需要看懂和理解1602芯片的资料,看懂和理解资料是很重要的。
三、外部中断的使用单片机原理及接口技术设计报告设计目的:1、能够用1602液晶循环显示出自己想要表达出来的字母2、熟悉1602芯片的工作过程3、熟悉掌握51的c程序的编写4、掌握用Proteus进行系统设计仿真验证5、熟悉指针在51单片机中的应用设计工作原理:【注:结合自己的题目详细介绍各部分的工作原理】1602LCD主要技术参数:显示容量:16×2个字符芯片工作电压:4.5—5.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.95×4.35(W×H)mm引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表10-13所示:表10-13:引脚接口说明表第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。
第7~14脚:D0~D7为8位双向数据线。
第15脚:背光源正极。
第16脚:背光源负极。
10.8.2.3 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表10-14所示:表10-14:控制命令表1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置。
指令2:光标复位,光标返回到地址00H。
指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:显示开关控制。
D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标。
指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。
指令11:读数据。
与HD44780相兼容的芯片时序表如下:表10-15:基本操作时序表读写操作时序如图10-55和10-56所示:图10-55 读操作时序图10-56 写操作时序10.8.2.4 1602LCD的RAM地址映射及标准字库表液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图10-57是1602的内部显示地址。
图10-57 1602LCD内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。
每次输入指令前都要判断液晶模块是否处于忙的状态。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”图10-58 字符代码与图形对应图10.8.2.5 1602LCD的一般初始化(复位)过程延时15mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)延时5mS写指令38H(不检测忙信号)以后每次写指令、读/写数据操作均需要检测忙信号写指令38H:显示模式设置写指令08H:显示关闭写指令01H:显示清屏写指令06H:显示光标移动设置写指令0CH:显示开及光Protues仿真电路图设计部分源程序:【注:重要部分要有标注】一、LCD_1602.C#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;// 定义LCD功能管脚void Delayms(uint ms)//延时子函数{uchar i;while(ms--){for(i=0;i<120;i++);}}uchar Busy_Check()//检测LCD忙碌状态{uchar LCD_Status;RS = 0;RW = 1;EN = 1;Delayms(1);LCD_Status = P0;EN = 0;return LCD_Status;}void Write_LCD_Command(uchar cmd)//实现LCD写指令{while((Busy_Check()&0x80)==0x80);//对控制器的每次读写之前都应该进行读写检测.IO口的STA7必须保证为0时才可以进行读写.RS = 0;RW = 0;EN = 0;P0 = cmd;EN = 1;Delayms(1);EN = 0;}//根据1602资料时序图写出void Write_LCD_Data(uchar dat)//实现LCD写指令{while((Busy_Check()&0x80)==0x80);RS = 1;RW = 0;EN = 0;P0 = dat;EN = 1;Delayms(1);EN = 0;}//根据时序图写出void Initialize_LCD()//初始化函数{Write_LCD_Command(0x38); //设置16x2显示,5x7点阵,8位数据口Delayms(1);Write_LCD_Command(0x01); //清屏Delayms(1);Write_LCD_Command(0x06); //读写一个字符后,地址自动加1,不移动屏幕Delayms(1);Write_LCD_Command(0x0c); //开显示,不显示光标,光标不闪烁Delayms(1);}void ShowString(uchar x,uchar y,uchar *str) //显示字串位置并且写入数据{uchar i = 0;if(y == 0)Write_LCD_Command(0x80 | x);if(y == 1)Write_LCD_Command(0xc0 | x);for(i=0;i<16;i++){Write_LCD_Data(str[i]);}主函数程序#include <reg52.h>#include <string.h>#define uchar unsigned char#define uint unsigned intvoid Initialize_LCD();void ShowString(uchar,uchar,uchar *);sbit K1 = P3^0;sbit K2 = P3^1;sbit K3 = P3^2;//定义按键管脚接口********定义变量*************uchar code Prompt[]="PRESS K1--K4 TO START DEMO PROG";//想要显示的字符uchar const Line_Count = 6;uchar code Msg[][80]={"Many CAD users dismiss","process of creating PCB","of view.with PCB layout","placement and track routing,","can often be the most time","And if you use circuit simulation","you are going to spend even more"};.uchar Disp_Buffer[32];void Delayxms(uint ms)//延时子函数{uchar i;while(ms--){for(i=0;i<120;i++);}}void V_Scroll_Display()//垂直显示子函数{uchar i,j,k = 0;uchar *p = Msg[0];//定义指针变量uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);while(p<q) //根据指针的大小判断字符串是否全部输入{for(i=0;(i<16)&&(p<q);i++){if(((i==0)||(i==15))&& *p == ' ')p++;if(*p != '\0'){Disp_Buffer[i] = *p++;}else{if(++k>Line_Count)break;p = Msg[k];Disp_Buffer[i] = *p++;}}//显示所有的行数for(j=i;j<16;j++)Disp_Buffer[j]=' ';while(F0)Delayxms(5);ShowString(0,0," ");显示的位置Delayxms(150);while(F0)Delayxms(5);ShowString(0,1,Disp_Buffer);改变的位置Delayxms(150);while(F0)Delayxms(5);ShowString(0,0,Disp_Buffer);ShowString(0,1," ");Delayxms(150);}ShowString(0,0," ");ShowString(0,1," ");}每行进行不断的移动void H_Scroll_Display()//水平显示子函数{uchar m,n,t = 0,L=0;uchar *p = Msg[0];uchar *q = Msg[Line_Count] + strlen(Msg[Line_Count]);for(m=0;m<16;m++)//显示16个字符Disp_Buffer[m]=' ';while(p<q)//根据指针的大小判断字符串是否全部输入{if((m=16||m==31)&& *p == ' ')p++;for(m=16;m<32&&p<q;m++){if(*p != '\0'){Disp_Buffer[m] = *p++;}else{if(++t>Line_Count)break;p = Msg[t];Disp_Buffer[m] = *p++;}}//一行的字符串全部输入for(n=m;n<32;n++)Disp_Buffer[n]=' ';for(m=0;m<=16;m++){while(F0)Delayxms(5);ShowString(0,L,Disp_Buffer+1);while(F0)Delayxms(5);Delayxms(20);}L = (L==0)? 1:0;Delayxms(200);}if(L==1)ShowString(0,1," "); 字符串显示的位置}void EX_INT0() interrupt 0{F0 = !F0;}void main(){uint Count = 0;IE = 0x81;设置中断允许寄存器IT0 = 1;设置外部中断0为跳变沿触发方式F0 = 0;Initialize_LCD();ShowString(0,0,Prompt);ShowString(0,1,Prompt+16);while(1){if(K1 == 0)//自动垂直滚动{V_Scroll_Display();Delayxms(200);}else if(K2 == 0)//自动水平滚动{H_Scroll_Display();Delayxms(200);}}}设计结论:液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在各类仪表和低功耗系统中得到广泛的应用。