lcd1602显示程序

合集下载

lcd1602显示程序

lcd1602显示程序

#include<reg52.h>//52单片机头文件,规定了52单片机的寄存器和IO口等#include<intrins.h>//_nop_空指令及左右循环移位子函数库#include "lcd1602.h"#include "ds1302.h"/****************************************************************************** *以下是对液晶模块的操作程序******************************************************************************* /sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚(sbit lcdrs=P2^6)sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚(sbit lcdwr=P2^5 ) sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚( sbit lcden=P2^7 )//sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚///*****************以下是对液晶的初始化操作***************////********************************************************//函数功能:判断液晶模块的忙碌状态//返回值:result。

result=1,忙碌;result=0,不忙//*********************************************************///unsigned char BusyTest(void)//{// bit result;// RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态// RW=1;// E=1; //E=1,才允许读写// _nop_(); //空操作// _nop_();// _nop_();// _nop_(); //空操作四个机器周期,给硬件反应时间// result=BF; //将忙碌标志电平赋给result// E=0; //将E恢复低电平// return result;//}/**************向1602液晶中写一个指令,决定写入1602的地址*********************/ void write_com(uchar com){RW=0; //lcdwr为读写控制端,lcdwr=0,这里可不写RS=0; //液晶rs接口为0时,写指令,rs为1时写数据P0=com; //将要写的指令赋给P0口,delay(5); //由1602读写操作时序图,先将指令赋给P0口,延时后将使能E=1; // 端lcden置高,再延时一段时间,然后将lcden置低,这样指令delay(5); // 就写入到LCD了E=0;}/****************************向液晶写数据***************************************/void write_data(uchar date)//与写指令类似,这里lcdrs设为1{RS=1;P0=date;delay(5);E=1;delay(5);E=0;}/*****************************初使化1602液晶************************************/void init_1602(){RW=0;E=0;write_com(0x38);//设置LCD为16*2显示、5*7点阵、8位数据接口模式delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间write_com(0x0c);//开显示、不显示光标delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间write_com(0x06);//写一个字符后,地址指针加1delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间write_com(0x01);//显示清0delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间}。

在LCD1602上显示0--99999 源程序

在LCD1602上显示0--99999 源程序

======================================== 作者:Ni的年少W^o轻狂创建时间:2008.06.25========================================//==========程序功能===========// 在LCD1602上显示0--99999//=============================#include<reg51.h>#include"LCD1602.h"voidIntTOStr(uintn,uchar *str);ucharstr[10 ];//存储数据main(){uint count;LCD_init();LCD_write_command(0x01);//清屏显示delay(200);gotoxy(2,1);LCD_display("2008/06/27");gotoxy(3,2);LCD_display("01:56:56");delay1(2000);LCD_write_command(0x01);//清屏显示delay(200);gotoxy(2,1);LCD_display("LCD1602 TEST");gotoxy(4,2);LCD_display("SUCCESS");delay1(2000);LCD_write_command(0x01);//清屏显示delay(200);while(1){IntTOStr(count++,str);gotoxy(4,2);LCD_display(str);delay1(100);}}voidIntTOStr(uintn,uchar *str){uchar a[5];uchari,j;a[0]=(n/10000)%10;a[1]=(n/1000)%10;a[2]=(n/100)%10;a[3]=(n/10)%10;a[4]=(n/1)%10;for(i=0;i<5;i++)a[i]='0'+a[i];for(i=0; a[i]=='0' && i<=3; i++ );for(j=0;j<i;j++){*str=' '; str++;}for(; i<5; i++){*str=a[i];str++;}*str='\0';}========LCD驱动程序========#define LCD_DB P0//定义LCD的数据端口sbit LCD_RS=P2^0;sbit LCD_RW=P2^1;sbit LCD_E=P2^2;#define uchar unsigned char#define uint unsigned int//===========延时子函数======================== void delay(uint x){uinti,j;for(i=x;i>0;i--)for(j=0;j<2;j++);}//==================写指令函数================= voidLCD_write_command(uchar command){LCD_DB=command;LCD_RS=0;//指令LCD_RW=0;//写入LCD_E=1;LCD_E=0;delay(1);//等待执行完毕。

LCD1602显示~~C程序

LCD1602显示~~C程序

1、关于1602液晶的电气参数一般市场上的1602液晶使用的驱动器为HD44780U或HD44780S,市场上大部分液晶用的是后者。

HD44780S的供电电压为5V±10%,而HD44780U 的供电电压为2.7V~5.5V。

也就是说,绝大部分1602液晶只能工作在5V 电压下,其供电电压必须为5V。

经过试验发现,1602液晶的供电虽然必须为5V,但其控制总线和数据总线可以用3.3V电平(因为对于TTL电平,一般大于2.5V以上都算高电平,不过最可靠的是大于3.6V),只不过在3.3V 电平下,数据的通信速度会大大降低,这一点需要在写驱动时注意。

需要时,可以将MCU的IO配置为漏极开路方式,用上拉电阻拉到5V电平;实在不能配置为漏极开路方式时,请查阅MCU的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。

2、硬件连接1602液晶可以使用4位或8位通信模式,通信可以是双向的或单向的,双向通信主要是为了读取LCD忙标志和AC地址寄存器和DDRAM和CGRAM中的值,一般用处不大,因为1602不支持点阵绘图功能。

在连接时,注意4位通信方式下,LCD只使用DB7~DB4,一般情况下会使用MCU 某端口的高4位或低4位与之连接,注意写驱动时在必要的情况下对端口的其它几位要保护,防止破坏其数据;当然如果没有使用其它4位时则不必要保护(奇怪,不使用其它4位干嘛用4位通信方式嘛?)。

还要注意的是,如果需要双向通信,则必须选择既能做输入又能做输出的IO口,特别是对于RS、RW和E这三条控制线,若能选择支持位寻址的IO口则可以方便编程。

3、底层驱动问题通用1602液晶的时序如图:(1)、写时序(2)、读时序总的说来,按照这个时序图来编写驱动程序是不会出什么问题的,只是要深刻理解时序图中各参数的涵义。

编程中要特别关注E这根控制线。

写操作的时序应该是:①、RS=0(写指令寄存器)或RS=1(写数据寄存器);②、RW=0(写操作);③、将数据写到数据线上;④、E=1;⑤、E=0 。

LCD1602原理与显示程序

LCD1602原理与显示程序

LCD1602原理与显示程序LCD1602的原理是基于液晶显示技术。

液晶是一种特殊的物质,具有双折射性质,即能将入射的光线分成两束,通过改变液晶分子的排列方式,可以改变其双折射的性质,从而使得光线透过液晶时会发生偏转。

LCD1602利用这一原理,在液晶显示面板上设置了16列和2行的像素点阵,通过控制每个像素点的液晶分子的排列方式,来实现字符的显示。

初始化是指在使用LCD1602之前,需要对其进行一系列的初始化操作,以确保其正常工作。

具体的初始化步骤如下:1.设置通信协议:LCD1602可以通过并行接口和串行接口进行通信,根据具体的接口方式,选择相应的通信协议。

2.设置工作模式:LCD1602有两种工作模式,分别是4位模式和8位模式。

选择适合的工作模式,并设置相应的控制寄存器。

3.设置显示模式:LCD1602可以显示不同的字符集,如英文字符、数字、特殊符号等。

选择合适的字符集,并设置显示模式。

4.清除显示:设置清除显示寄存器,将显示区域清空。

5.光标设置:设置光标位置和显示方式,如光标是否闪烁、光标位置等。

完成初始化后,就可以将要显示的数据写入LCD1602数据写入是指将要显示的字符或数字写入到LCD1602的显示区域。

具体的数据写入步骤如下:1.设置光标位置:根据需要显示的字符位置,设置光标的位置。

2.数据写入:通过通信接口,将要显示的数据写入到LCD1602的数据寄存器。

3.延时:由于LCD1602的刷新速度较慢,需要等待一定的时间,使得数据能够稳定显示在液晶屏上。

4.更新光标位置:根据数据的长度和显示方式,更新光标的位置。

通过以上的步骤,就可以实现LCD1602的显示功能。

总结起来,LCD1602的原理是基于液晶显示技术,通过控制液晶分子排列方式来实现字符的显示。

其显示程序包括初始化和数据写入两个方面的内容,通过设置通信协议、工作模式、显示模式等参数,并将要显示的数据写入到LCD1602的显示区域,来实现字符的显示。

LCD1602 显示程序

LCD1602 显示程序
{
TMOD=0x00; //设定定时器
TR0=1;//定时器0开
set_lcd1602(); //初始化LCD1602
view_lcd1602(0x8f,table);
cgram_set_lcd1602(0x40,tt1);
cgram_set_lcd1602(0x48,tt2);
w_comd(0xca); w_data(0x00); w_data(0x01); //自定义字符显示
{ int j;
w_comd(addr); //写入地址
while(*i>0)
{ w_data(*i); //写入数据
i++;
for(j=0;jdelay(0x15,0xa0);
w_comd(0x18); //左移指令
}
}
/////////////////////////////////////// cgram写入程序段
ucharcode tt2[]={0x0E,0x0E,0x00,0x1F,0x1F,0x0C,0x19,0x1F}; //云
///////////////////////////////////////
void delay(uchar H,uchar L) //定时器延时程序段
{ TF0=0;TH0=H;TL0=L;
w_comd(0x02); //地址指针归位
delay(0xf9,0x98);
w_comd(0x06); //
w_comd(0x0c); //开显示屏
w_comd(0x38); //8位传送数据2行显示
}
///////////////////////////////////显示程序段
void view_lcd1602(ucharaddr,uchar *i) //*i为所传字符串指针

LCD1602液晶显示实验实验报告及程序

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 液晶显示屏上是否正确显示预设的字符。

LCD1602驱动及显示计数值程序

LCD1602驱动及显示计数值程序
1.6.2 显示开/关及光标设置
1.6.3 数据指针设置 1.6.4 其它设置
5
1.7 外形
嵌入式应用软件园,版权所有,请勿转载/销售。
6
嵌入式应用软件园,版权所有,请勿转载/销售。
第 2 章 程序功能
程序中包含 LCM 用到的所有函数:初始化、写指令、写数据、判忙碌、清屏 幕。
单片机外接 2x2 (P3.7,P3.6 与 P3.0,P3.1)矩阵键盘,利用定时器 T0 的定时中断, 查询矩阵键盘。矩阵键盘被命名为 A、B、C、D。对键盘被按下的次数进行计数, 计数值会在 LCM 上显示。
LCM 与单片机的连接
7
嵌入式应用软件园,版权所有,请勿转载/销售。
第 3 章 程序代码
我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
;******************************************************************************
9
嵌入式应用软件园,版权所有,请勿转载/销售。
LCALL WRITE_DATA MOV A,#10001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 C: MOV A,#11000000B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#43H LCALL WRITE_DATA MOV A,#11000001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 D: MOV A,#11001001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#44H LCALL WRITE_DATA MOV A,#11001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;计数的循环,一直执行,永不跳出 START: MOV LCM_P,#10000010B ;数据指针(显示地址设置) MOV R0,#A4 LCALL DISP MOV LCM_P,#10001011B ;数据指针(显示地址设置) MOV R0,#B4 LCALL DISP MOV LCM_P,#11000010B ;数据指针(显示地址设置) MOV R0,#C4 LCALL DISP MOV LCM_P,#11001011B ;数据指针(显示地址设置) MOV R0,#D4 LCALL DISP LJMP START

LCD1602的简单显示程序

LCD1602的简单显示程序

/*========================================================= 1602液晶显示的实验例子-------------------------------------------------| DB4-----P0.4 | RW-------P2.1| DB5-----P0.5 | RS-------P2.2| DB6-----P0.6 | E--------P2.0| DB7-----P0.7 |---------------------------------------------------LCD1602的简简单显示=========================================================*/ #include#include#define LCM_RW P2_1 //定义引脚#define LCM_RS P2_2#define LCM_E P2_0#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识/*------------------------------------------子函数声明------------------------------------------*/void Write_Data_LCM(unsigned char WDLCM);void Write_Command_LCM(unsigned char WCLCM,BuysC);void Read_Status_LCM(void);void LCM_Init(void);void Set_xy_LCM(unsigned char x, unsigned char y);void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s);void main(void){LCM_Init(); //LCM初始化delay_nms(5);//延时片刻(可不要)while(1){Display_List_Char(0, 0, "");Display_List_Char(1, 0, "Robot-AT89S52");}}/*=====================================函数名:Read_Status_LCM()功能:忙检测函数======================================*/void Read_Status_LCM(void){unsigned char read=0;LCM_RW = 1;LCM_RS = 0;LCM_E = 1;LCM_Data = 0xff;do{read = LCM_Data;}while(read & Busy);LCM_E = 0;}/*------------------------------------------- 函数名:Write_Data_LCM ( )功能:对LCD 1602写数据--------------------------------------------*/ void Write_Data_LCM(unsigned char WDLCM){Read_Status_LCM(); //检测忙LCM_RS = 1;LCM_RW = 0;LCM_Data &= 0x0f;LCM_Data |= WDLCM&0xf0;LCM_E = 1; //若晶振速度太高可以在这后加小的延时LCM_E = 1; //延时LCM_E = 0;WDLCM = WDLCM<<4;LCM_Data &= 0x0f;LCM_Data |= WDLCM&0xf0;LCM_E = 1;LCM_E = 1; //延时LCM_E = 0;}/*-------------------------------------------函数名:Write_Command_ LCM ( )功能:对LCD 1602写指令--------------------------------------------*/void Write_Command_LCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC)Read_Status_LCM(); //根据需要检测忙LCM_RS = 0;LCM_RW = 0;LCM_Data &= 0x0f;LCM_Data |= WCLCM&0xf0;//传输高四位LCM_E = 1;LCM_E = 1;LCM_E = 0;WCLCM = WCLCM<<4; //传输低四位LCM_Data &= 0x0f;LCM_Data |= WCLCM&0xf0;LCM_E = 1;LCM_E = 1;LCM_E = 0;}/*-------------------------------------------函数名:LCM_Init()功能:对LCD 1602初始化--------------------------------------------*/void LCM_Init(void) //LCM初始化{LCM_Data = 0;Write_Command_LCM(0x28,0); //三次显示模式设置,不检测忙信号delay_nms(15);Write_Command_LCM(0x28,0);delay_nms(15);Write_Command_LCM(0x28,0);delay_nms(15);Write_Command_LCM(0x28,1); //显示模式设置,开始要求每次检测忙信号Write_Command_LCM(0x08,1); //关闭显示Write_Command_LCM(0x01,1); //显示清屏Write_Command_LCM(0x06,1); //显示光标移动设置Write_Command_LCM(0x0C,1); //显示开及光标设置}/*-------------------------------------------函数名:Set_xy_LCM ()功能:设定显示坐标位置--------------------------------------------*/void Set_xy_LCM(unsigned char x, unsigned char y){unsigned char address;if( x == 0 )address = 0x80+y;elseaddress = 0xc0+y;Write_Command_LCM(address,1);}/*-------------------------------------------函数名:Display_List_Char()功能:按指定位置显示一串字符--------------------------------------------*/void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s){Set_xy_LCM(x,y);while(*s){LCM_Data = *s;Write_Data_LCM(*s);s++;}}datasheet搜索: 。

LCD1602原理及显示程序

LCD1602原理及显示程序

LCD1602原理及显示程序LCD1602是一种常用的液晶显示器模块,具有16列2行的显示区域,可以用于显示各种文字和简单的图形。

它广泛应用于各种电子产品中,如计算器、电子钟表、仪器仪表等。

本文将介绍LCD1602的工作原理和显示程序设计。

LCD1602模块由液晶显示面板、驱动芯片和背光源组成。

其中驱动芯片负责向液晶面板发送控制信号和数据信号,控制液晶分子的取向和光的穿透程度,从而实现图像的显示。

背光源则提供背光,使得图像可以在暗环境下清晰可见。

液晶显示面板是LCD1602模块最关键的部分。

它由两片平行的玻璃基板构成,中间夹层有液晶层和极板。

液晶层是一种特殊的有机化合物,具有液态和固态之间的特性。

液晶分子有两种主要的排列方式,即平行排列和垂直排列,通过调节驱动芯片发送的电压信号,可以改变液晶分子的排列方式,进而控制光的透射和反射。

极板则起到滤光器的作用,可以控制光的偏振方向。

为了控制LCD1602模块进行显示,我们需要通过IO口与其连接,并向其发送控制信号和数据信号。

以下是一个基本的LCD1602显示程序的设计过程:1.初始化LCD1602模块:a.设置LCD1602的工作模式,例如行数、字体大小等。

b.设置显示模式,例如显示打开、显示关闭、光标光灭等。

2.发送指令到LCD1602模块:a.选择指令寄存器,RS引脚置低电平。

b.向数据总线发送指令数据。

c.发送使能信号,EN引脚从高到低电平进行一个脉冲,使得LCD1602芯片接收到指令。

3.发送数据到LCD1602模块:a.选择数据寄存器,RS引脚置高电平。

b.向数据总线发送需要显示的数据。

c.发送使能信号,EN引脚从高到低电平进行一个脉冲,使得LCD1602芯片接收到数据。

4.清除LCD1602模块的显示内容:a.发送清除显示指令到LCD1602模块。

5.控制LCD1602模块的光标位置:a.发送光标位置指令到LCD1602模块。

6.控制LCD1602模块的背光亮度:a.通过PWM控制背光源的亮度。

LCD1602快速显示程序(附真实序列图)

LCD1602快速显示程序(附真实序列图)

LCD1602快速显示源程序(附真实序列图)/*********************************************************************** 文件名称: LCD1602.c* 当前版本: 1.0* 功能: LCD1602字符液晶的驱动实现* 作者:杜运福* 完成时间: 2013-01-04* 原始版本: 1.0* 修改人员、时间、版本及修改内容:* 其他说明:**********************************************************************/#ifndef LCD1602_H#define LCD1602_H/* 公共类型定义 */typedef unsigned char uint8;typedef signed char sint8;typedef unsigned short uint16;typedef signed short sint16;typedef unsigned long uint32;typedef signed long sint32;/** 函数名称:LCD_WriteCMD* 功能描述:写单个命令* 输入参数:CMD 命令字节,低7位有效* 输出参数:无* 返回值:0 执行成功,-1 执行失败* 其它说明:* 修改日期修改人修改内容* -----------------------------------------------* XXXX-XX-XX XXXX XXXX*/sint8 LCD_WriteCMD(uint8 CMD);/** 函数名称:LCD_SetPos* 功能描述:设置显示位置* 输入参数:XPos 行位置1,2;YPos 列位置,1~16* 输出参数:无* 返回值:0 执行成功,-1 执行失败* 其它说明:* 0x00----------------0x0f 0x10-------0x27 第一行(一次显示16个字符)* 0x40----------------0x4f 0x50-------0x67 第二行* 修改日期修改人修改内容* -----------------------------------------------* XXXX-XX-XX XXXX XXXX*/sint8 LCD_SetPos(uint8 XPos, uint8 YPos);/** 函数名称:LCD_WriteByte* 功能描述:写入单个字节显示数据* 输入参数:Byte 待写入字节数据* 输出参数:无* 返回值:0 执行成功,-1 执行失败* 其它说明:* 修改日期修改人修改内容* -----------------------------------------------* XXXX-XX-XX XXXX XXXX*/sint8 LCD_WriteByte(uint8 Byte);/** 函数名称:LCD_DispChar* 功能描述:指定位置显示单个字符* 输入参数:XPos 行位置1,2;YPos 列位置,1~16* ch 待显示字符* 输出参数:无* 返回值:0 执行成功,<0 执行失败* 其它说明:当行或列位置不合法时,不设置显示位置,直接在当前光标处显示 * 修改日期修改人修改内容* -----------------------------------------------* XXXX-XX-XX XXXX XXXX*/sint8 LCD_DispChar(uint8 XPos, uint8 YPos, char ch);/** 函数名称:LCD_DispString* 功能描述:指定位置显示字符串* 输入参数:XPos 行位置1,2;YPos 列位置,1~16* pStr 待显示字符串首地址* 输出参数:无* 返回值:0 执行成功,<0 执行失败* 其它说明:当行或列位置不合法时,不设置显示位置,直接在当前光标处显示 * 修改日期修改人修改内容* -----------------------------------------------* XXXX-XX-XX XXXX XXXX*/sint8 LCD_DispString(uint8 XPos, uint8 YPos, const char *pStr);/** 函数名称:LCD_Init* 功能描述:初始化LCD1602* 输入参数:无* 输出参数:无* 返回值:0 执行成功,-1 执行失败* 其它说明:8位数据总线模式、5*7点阵字符、AC自增、屏不移动、光标不显示、不闪烁 * 常用命令:0x38:16*2显示,5*7点阵显示字符,8位数据;指令执行时间40us* 0x0C:开显示,关光标 40us* 0x08:关显示,关光标 40us* 0x06:写完数据自动右移光标,普通情形,从左向右显示 40us* 0x04:写完数据自动左移光标,可以从右向左显示 40us* 0x01:清除显示内容,即清屏 1.64ms* 0x02:使光标还回起始位置 1.64ms* 0x18:屏幕上所有字符同时左移一格,适合滚动显示 40us* 0x1C:屏幕上所有字符同时右移一格,适合滚动显示 40us* 修改日期修改人修改内容* -----------------------------------------------* XXXX-XX-XX XXXX XXXX*/sint8 LCD_Init(void);#endif /* end LCD1602_H *//*********************************************************************** 文件名称: LCD1602.c* 当前版本: 1.0* 功能: LCD1602字符液晶的驱动实现* 作者:杜运福* 完成时间: 2013-01-04* 原始版本: 1.0* 修改人员、时间、版本及修改内容:* 其他说明:**********************************************************************/#include <reg52.h>#include <intrins.h>#include "LCD1602.h"/* LCD1602引脚定义 */#define LCD_CTRL P2 /* LCD控制口 */#define EN 0x80 /* P2.7 */#define RS 0x40 /* P2.6 */#define RW 0x20 /* P2.5 */#define LCD_DATA P0 /* LCD数据口 */#define LCD_DATAIN_SET LCD_DATA=0xFF /* 数据口输入设置宏 *//* 控制线置位与复位带参宏定义 */#define SET(X) LCD_CTRL |= (X)#define RESET(X) LCD_CTRL &= ~(X)/* 读取LCD忙状态 BF bit7 */#define LCD_STATE LCD_DATA & 0x80/* 延时1us宏定义 */#define NOP() _nop_()/** 延时N毫秒*/static void DelayNms(int N){int i = 0;while (N--){for (i = 0; i < 75; i++){}}}/* 等待LCD空闲,BF=0 */static void LCD_WaitIdle(void){uint8 State = 0;/* 读BF时序建立 */RESET(RS);SET(RW);SET(EN);/* 设置BF对应引脚为输入 */LCD_DATAIN_SET;/* 等待BF=0,LCD空闲 */while ((State = LCD_STATE)!=0);/* 拉低LCD使能 */RESET(EN);}/* 写一个字节命令 */sint8 LCD_WriteCMD(uint8 CMD){/* 若为无效命令,则直接返回 */if ((CMD & 0x3F)== 0){return -1;}LCD_DATA = CMD;RESET(RS);RESET(RW);SET(EN);RESET(EN); /* 产生下降沿,启动写入操作 */LCD_WaitIdle(); /* 等待LCD空闲 */return 0;}/* 设置显示位置 */sint8 LCD_SetPos(uint8 XPos, uint8 YPos){uint8 Pos = 0;if ((XPos != 1) && (XPos != 2)) /* 判断行坐标是否合法 */ {return -1;}if (YPos > 40) /* 每行有40个地址 */{return -1;}if (XPos == 1) /* 第一行 */{Pos = 0x00 + YPos -1;}else /* 第二行*/{Pos = 0x40 + YPos -1;}LCD_DATA = Pos | 0x80;RESET(RS);RESET(RW);SET(EN);RESET(EN); /* 产生下降沿 */LCD_WaitIdle(); /* 等待LCD空闲 */return 0;}/* 写入一个字节数据 */sint8 LCD_WriteByte(uint8 Byte){if (Byte == 0){return -1;}LCD_DATA = Byte;SET(RS);RESET(RW);SET(EN);RESET(EN); /* 产生下降沿 */LCD_WaitIdle(); /* 等待LCD空闲 */return 0;}/* 指定位置显示一个字符 */sint8 LCD_DispChar(uint8 XPos, uint8 YPos, char ch){sint8 ret = 0;ret += LCD_SetPos(XPos, YPos);ret += LCD_WriteByte((uint8)ch);return ret;}/* 指定位置显示一个字符串 */sint8 LCD_DispString(uint8 XPos, uint8 YPos, const char *pStr) {sint8 ret = 0;sint8 Cnt = 0;ret += LCD_SetPos(XPos, YPos);/* 逐个显示字符,最多可以显示41-YPos个字符(含超出一屏的内容)例:YPos=1,则Cnt范围为0~39 */while ((pStr[Cnt] != '\0') && (Cnt <= 40-YPos)){ret += LCD_WriteByte((uint8)pStr[Cnt]);Cnt++;}if (Cnt + YPos > 40) /* 字符串过长!! */{ret = -1;}return ret;}/* LCD1602初始化 */sint8 LCD_Init(void){/* 上电等待LCD硬件自动复位完成,不少于10ms */DelayNms(10);/* 关显示 */LCD_WriteCMD(0x08);/* 功能设置,两行显示、5*7点阵字体、8位数据总线 */LCD_WriteCMD(0x38);/* 设置输入模式,AC自动加1,显示不移位,光标自动移位 */ LCD_WriteCMD(0x06);/* 开显示,关光标,关闪烁 */LCD_WriteCMD(0x0C);/* 清显示,清除DDRAM,光标归位 */LCD_WriteCMD(0x01);return 0;}/** 文件名称: main.c* LCD1602模块测试程序*/#include <reg52.h>#include <intrins.h>#include "LCD1602.h"/* 延时N个10us */static void DelayN10us(uint16 N){while (N--);}int main(){LCD_Init();while(1){LCD_DispString(2,2,"Welcome!!"); DelayN10us(65535);DelayN10us(65535);LCD_WriteCMD(0x01);LCD_DispString(2,2,"Hello!!"); DelayN10us(65535);DelayN10us(65535);LCD_WriteCMD(0x01);//DelayN10us(65535);}return 0;}写清屏命令0x01序列图:写模式设置命令0x38序列图:写显示地址序列图:写一字节数据序列图:注:以上序列图为本人亲测!!。

LCD1602原理与显示程序

LCD1602原理与显示程序

LCD1602原理与显示程序首先,液晶显示屏是由液晶分子填充在两块平行的玻璃基板之间组成的。

每个液晶分子都是一个由长链有机分子构成的棒状结构,其中的双键允许分子在电场的作用下进行旋转。

液晶分子通过平行阵列技术排列,使得液晶屏幕变为一个有序的结构,可以透过光束。

在液晶显示屏的基板上有多个透明电极排列,它们分别与控制芯片连接。

控制芯片通过对这些电极施加电压,调整液晶的扭曲程度。

当没有电压施加在液晶上时,液晶分子处于平行排列的状态,光线经过液晶屏会发生旋转,从而可以通过另一边的透光板透过。

当电压施加到液晶上时,液晶分子会以一定的角度旋转,光线经过时则发生偏波而无法穿过。

这样就实现了液晶显示屏的亮暗变化。

为了实现文字和图形的显示,我们需要通过控制芯片向液晶屏发送指令和数据。

控制芯片和液晶显示屏之间的连接是通过并行通信实现的,常用的通信方式是使用4位或8位并行数据线。

在发送指令和数据之前,我们需要将控制芯片配置为指令或数据模式。

指令模式下,控制芯片接收的数据被视为设定控制参数,比如清屏、光标移动等;数据模式下,控制芯片接收的数据被视为要显示的字符或图形。

液晶显示屏的显示程序可以使用任意的微控制器或单片机来编写。

程序的基本思路是通过对控制芯片发送指令和数据来控制液晶屏的显示。

首先,我们需要初始化液晶显示屏,这包括设置通信参数、清屏、光标重置等操作。

然后,我们可以通过写入数据寄存器来显示字符或图形。

通过控制芯片提供的指令,可以实现光标的位置移动、屏幕的滚动、光标的显示和隐藏等功能。

在程序中,我们可以定义字符和图形的数据,然后通过写入数据寄存器将其显示在液晶屏上。

有些控制芯片还提供了自定义字符的能力,可以通过修改字符发生器生成字符的模式来实现。

总结起来,LCD1602的原理是通过调整液晶的光透过性来实现显示,显示程序通过控制芯片向液晶屏发送指令和数据来控制显示内容。

程序的基本思路是初始化液晶显示屏,然后通过写入数据寄存器来显示字符或图形,通过发送指令来实现其他功能。

LCD1602简单显示程序(单片机)

LCD1602简单显示程序(单片机)

#include <reg51.h>#define uchar unsigned char#define uint unsigned intsbit LCD_E=P3^5; //定义接口sbit LCD_RW=P3^6;sbit LCD_RS=P3^7;#define LCD_Data P1 //数据接口uchar up[]={"IvU,hupeixian"};uchar code down[]={"_by fu "}/*************************延时函数*****************************/void Delay_ms(uint time){uint i,j;for(i = 0;i < time;i ++)for(j = 0;j < 930;j ++);}/**********************检测状态************************************/ uchar LCD_ReadStatus(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 1;LCD_E = 1;LCD_E = 0;while (LCD_Data & 0x80); //检测忙信号return(LCD_Data);}/************************写数据***********************************/ void LCD_WriteData(uchar WDLCD){LCD_ReadStatus();//检测忙LCD_Data = WDLCDLCD_RS = 1;LCD_RW = 0;LCD_E = 1;//若晶振速度太高可以在这后加小的延时LCD_E = 1;//延时LCD_E = 0;}/************************写指令********************************/ void LCD_WriteCommand(uchar WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC)LCD_ReadStatus(); //根据需要检测忙LCD_Data = WCLCD;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 1;LCD_E = 0;}/*****************初始化***********************************/void LCD_Init(void){LCD_Data = 0;LCD_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号Delay_ms(5);LCD_WriteCommand(0x38,0);Delay5Ms();LCD_WriteCommand(0x38,0);Delay_ms(5);LCD_WriteCommand(0x38,1); //显示模式设置,开始要求每次检测忙信号LCD_WriteCommand(0x08,1); //关闭显示LCD_WriteCommand(0x01,1); //显示清屏LCD_WriteCommand(0x06,1); // 显示光标移动设置LCD_WriteCommand(0x0C,1); // 显示开及光标设置}/***********************显示一个字符********************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码LCD_WriteCommand(X, 0); //这里不检测忙信号,发送地址码LCD_WriteData(DData);}/************************显示一串字符*******************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData){uchar ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/******************************************************************/ void main(void){Delay_ms(400); //启动等待,等LCD讲入工作状态LCD_Init(); //LCD初始化Delay_ms(5); //延时片刻(可不要)DisplayListChar(0, 1, up);DisplayListChar(6, 0, down);LCD_Data=0xff;while(1);}。

LCD1602汇编显示程序

LCD1602汇编显示程序

RSBIT P 2.0;定义RS为P2.0RWBIT P2.1;定义RW为P2.1EBIT P2.2;定义E为P2.2ORG 00HSJMP STARTORG0030HSTART:LCALL LCDINITMAIN:MOV A,#80H;显示开及光标设置LCALL BUSYLCALL WRTCMOVR2,#04HMOVDPTR,#TAB1LCALL DELAYMOV A,#0C0H;显示开及光标设置LCALL BUSYLCALL WRTCMOVR2,#04HMOVDPTR,#TAB2LCALL DELAYLCALL WRTDLCALL DELAY1LCALL DELAY1MOV A,#01H;清屏LCALL BUSYLCALL WRTCMOV A,#80H;显示开及光标设置LCALL BUSYLCALL WRTCMOVR2,#0FHMOVDPTR,#TAB4LCALL DELAYLCALL WRTDLCALL DELAY1MOV A,#01H;清屏LCALL BUSYLCALL WRTCLJMP MAIN;***************初始化***************** LCDINIT:LCALLDELAY;xx15msLCALLDELAYLCALLDELAYMOVA,#38H;显示模式设置(8位数据线,16*2 5*7点阵) LCALL WRTCLCALL DELAY;xx5msMOVA,#38HLCALL WRTCLCALL DELAY;xx5msMOVA,#38HLCALL WRTCLCALL DELAY;xx5msMOVA,#38HLCALL BUSYMOVA,#08HLCALL BUSYLCALL WRTCMOV A,#01H;清屏LCALL BUSYLCALL WRTCMOVA,#06H;显示光标移动设置LCALL BUSYLCALL WRTCMOV A,#0CH;示开关控制,显示开,无光标,不闪烁。

LCD1602原理及显示程序

LCD1602原理及显示程序

在日常生活中,我们对液晶显示器并不陌生。

液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。

发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。

在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。

因此,液晶显示器画质高且不会闪烁。

数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。

体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。

功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。

10.8.1液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。

除了黑白显示外,液晶显示器还有多灰度有彩色显示等。

如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(SimpleMatrix)和主动矩阵驱动(ActiveMatrix)三种。

③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

(整理)LCD1602汇编程序.

(整理)LCD1602汇编程序.

(整理)LCD1602汇编程序.LCD1602汇编程序;* 描述: LCD1602 滚动显示*;* 显示方式:*;* 1、从左到右逐字显示,闪动二次,清屏。

*;* 2、再从右到左逐字显示,闪动二次,清屏。

*;* 3、周期性地重复上述显示方式。

*;************************************************************** ***** LCD_RS EQU P2.0LCD_RW EQU P2.1LCD_EN EQU P2.2;************************************************************** ***** ORG 0000HAJMP MAINORG 0030H;************************************************************** ***** MAIN:MOV SP,#60HMOV R4,#02H ;设置闪烁次数ACALL LCD_INITMAIN1:ACALL LCDSET1MOV DPTR,#CHAR1ACALL WRITE1 ;MOV A,#0C0H ;显示第二行左边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR2 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL LCDSET2MOV DPTR,#CHAR3 ;ACALL WRITE1MOV A,#0C0H ;显示第二行右边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR4 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL MAIN1;************************************************************** *;LCD初始化设定子程序;************************************************************** * LCD_INIT:ACALL DELAY5MS ;延时15MSACALL DELAY5MS ;等待LCD 电源稳定ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#08H ;显示关ACALL LCD_CMD ;进行LCD 忙检测MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测MOV A,#06H ;移动光标ACALL LCD_CMD ;进行LCD 忙检测MOV A,#0CH ;显示开,关光标ACALL LCD_CMD ;进行LCD 忙检测RET;************************************************************** * ;显示位置与移动光标设定;************************************************************** * LCDSET1:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标加1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行左边第一位位置ACALL LCD_CMDACALL DELAY5MSRETLCDSET2:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标减1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行右边第一位位置ACALL LCD_CMDACALL DELAY5MSRET;************************************************************** * ;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲;************************************************************** * LCD_CMD:ACALL CHECKBUSYLCD_CMD_NC:CLR LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;************************************************************** * ; 发送字符串子程序;************************************************************** * WRITE1:MOV R0,#16WRITE0:CLR AMOVC A,@A+DPTRINC DPTRACALL LCD_WDATACALL DELAY ;加延时形成滚动效果DJNZ R0,WRITE0RET;************************************************************** * ;写显示数据到LCD;RS=H,RW=L,D0-D7=数据,E=高脉冲;************************************************************** * LCD_WDATA:ACALL CHECKBUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;************************************************************** * ;检测LCD 控制器忙状态;读数据;RS=L,RW=H,E=H,输出:D0-D7=数据;************************************************************** * CHECKBUSY:PUSH ACCMOV P0,#0FFHCLR LCD_RSSETB LCD_RWSETB LCD_ENBUSYLOOP:NOPJB P0.7,BUSYLOOPCLR LCD_ENPOP ACCRET;************************************************************** * ;闪烁子程序;************************************************************** * SHAN:MOV A,#08H ;关闭显示ACALL LCD_CMDACALL DELAY4MOV A,#0CH ;开显示,关闭光标ACALL LCD_CMDACALL DELAY4DJNZ R4,SHANMOV R4,#02H ;设置闪烁次数RET;************************************************************** * ;延时120MS 子程序;发送字符串时使用;************************************************************** * DELAY:MOV R7,#240DL1: MOV R6,#250DL2: DJNZ R6,DL2DJNZ R7,DL1RET;************************************************************** * ;延时800MS 子程序;闪烁时使用;************************************************************** * DELAY4:MOV R0,#40DL3: MOV R1,#100DL4: MOV R2,#100DL5: DJNZ R2,DL5DJNZ R1,DL4DJNZ R0,DL3RET;************************************************************** * ;延时5MS子程序;LCD初始化使用;************************************************************** * DELAY5MS:MOV R1,#10DL6: MOV R2,#249DL7: DJNZ R2,DL7DJNZ R1,DL6RET;************************************************************** * ;延时1MS子程序;************************************************************** * DELAY1MS:MOV R6,#14H ;20DL8: MOV R7,#19H ;25DL9: DJNZ R7,DL9DJNZ R6,DL8RET;************************************************************** * CHAR1:DB "Welcome to Cras-"CHAR2:DB " yBoye WorkGroup"CHAR3:DB " QQ: 15910380 "CHAR4:DB "TEL: 139********";************************************************************** *END12864汇编程序X EQU 26H ;LCD 地址变量RS EQU P2.0RW EQU P2.1EN EQU P2.2PSB EQU P2.3RST EQU P2.5ORG 0000HJMP MAINORG 0003H ;外部中断INT0入口地址MAIN:MOV SP,#40HMOV A,#00HMOV R0,#20HLOOP0: MOV @R0,A ;20H-26H清零INC R0CJNE R0,#27H,LOOP0MOV IE,#81H ;允许总中断中断,使能INT0 外部中断MOV TCON,#01H ;触发方式为脉冲负边沿触发SETB RSTNOPSETB PSB ;8位数据,并口CALL SET_LCD ;初始化TS12864mCALL MENU1CALL MENU2CALL MENU3CALL MENU4LOOP1:MOV A,22HCJNE A,#40H,LOOP2LOOP2: CJNE A,#04H,LOOP3LOOP3: JMP LOOP1;====================================== =======; LCD 初始化设置;====================================== =======-SET_LCD:CLR ENMOV A,#34H ;34H--扩充指令操作CALL WCOMMOV A,#30H ;30H--基本指令操作CALL WCOMMOV A,#0CH ;开显示,关光标,CALL WCOMMOV A,#01H ;清除LCM 显示屏CALL WCOMRET;====================================== ============= ;在LCM 各行显示信息字符;====================================== ============= LCD_SHOW:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: CJNE A,#2,LINE3 ;判断是否为第三行MOV A,#090H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#090H ;设置LCD 的第三行地址CALL WCOMJMP FILLLINE3: CJNE A,#3,LINE4 ;判断是否为第三行MOV A,#088H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#088H ;设置LCD 的第三行地址CALL WCOMJMP FILLLINE4: CJNE A,#4,LINE5 ;判断是否为第三行MOV A,#098H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#098H ;设置LCD 的第三行地址CALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码LINE5: RETLC1: CALL WDA TA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;====================================== =========== ;清除该行LCM 的字符;====================================== =========== CLR_LINE:MOV R0,#16CL1: MOV A,#' 'CALL WDATADJNZ R0,CL1RET;====================================== ============ ;LCM 显示工作菜单信息;====================================== ============ MENU1:MOV DPTR,#MENU1AMOV A,#1 ;在第一行显示信息CALL LCD_SHOWRETMENU1A: DB "MUC 控制GPRS模块",0MENU2:MOV DPTR,#MENU2AMOV A,#2 ;在第二行显示信息CALL LCD_SHOWRETMENU2A: DB "TEL:139********",0MENU3:MOV DPTR,#MENU3AMOV A,#3 ;在第三行显示信息CALL LCD_SHOWRETMENU3A: DB "方案设计: 龚伟",0MENU4:MOV DPTR,#MENU4AMOV A,#4 ;在第四行显示信息CALL LCD_SHOWRETMENU4A: DB "程序编写: 靳鹏",0;====================================== ======== ; 写指令使能子程序;RS=L,RW=L,D0-D7=指令码,E=高脉冲;====================================== ======== WCOM:MOV P0,ACLR RSCLR RWSETB ENCALL DELAY0CLR ENRET;====================================== ======= ;写数据使能子程序;RS=H,RW=L,D0-D7=数据,E=高脉冲;=============================================WDATA:MOV P0,ASETB RSCLR RWSETB ENCALL DELAY0CLR ENRETDELAY0: MOV R7,#250 ;延时500微秒DJNZ R7,$RET END。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

lcd1602显示程序
液晶显示简介①液晶显示原理
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。

液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。

②液晶显示器的分类
液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。

除了黑白显示外,液晶显示器还有多灰度有彩色显示等。

如果根据驱动方式来分,可以分为静态驱动(StaTIc)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(AcTIve Matrix)三种。

③液晶显示器各种图形的显示原理:
线段的显示
点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。

这就是LCD显示的基本原理。

字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为1,其它的为0,为1的点亮,为0的不亮。

这样一来就组成某个字符。

但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显。

相关文档
最新文档