光电测速及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); //控制两屏转换时间}}。
BH1750数字光强度测试仪设计LCD1602显示+51单片机C语言程序完整版
//***************************************// BH1750FVI IIC测试程序// 使用单片机STC89C51// 晶振:11.0592M// 显示:LCD1602// 作者:dice szj QQ:15023134// 编译环境Keil uVision2//****************************************#include <REG51.H>#include <math.h> //Keil library#include <stdio.h> //Keil library#include <INTRINS.H>#define uchar unsigned char#define uint unsigned int#define DataPort P0 //LCD1602数据端口sbit SCL=P1^0; //IIC时钟引脚定义sbit SDA=P1^1; //IIC数据引脚定义sbit LCM_RS=P2^4; //LCD1602命令端口sbit LCM_RW=P2^5; //LCD1602命令端口sbit LCM_EN=P2^6; //LCD1602命令端口#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS 地址引脚不同修改//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF[8]; //接收数据缓存区uchar ge,shi,bai,qian,wan; //显示变量int dis_data; //变量void delay_nms(unsigned int k);void InitLcd();void Init_BH1750(void);void WriteDataLCM(uchar dataW);void WriteCommandLCM(uchar CMD,uchar Attribc);void DisplayOneChar(uchar X,uchar Y,uchar DData);void conversion(uint temp_data);void Single_Write_BH1750(uchar REG_Address); //单个写入数据uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据void Multiple_Read_BH1750(); //连续的读取内部寄存器数据//------------------------------------void Delay5us();void Delay5ms();void BH1750_Start(); //起始信号void BH1750_Stop(); //停止信号void BH1750_SendACK(bit ack); //应答ACKbit BH1750_RecvACK(); //读ackvoid BH1750_SendByte(BYTE dat); //IIC单个字节写BYTE BH1750_RecvByte(); //IIC单个字节读//-----------------------------------//*********************************************************void conversion(uint temp_data) // 数据转换出个,十,百,千,万{wan=temp_data/10000+0x30 ;temp_data=temp_data%10000; //取余运算qian=temp_data/1000+0x30 ;temp_data=temp_data%1000; //取余运算bai=temp_data/100+0x30 ;temp_data=temp_data%100; //取余运算shi=temp_data/10+0x30 ;temp_data=temp_data%10; //取余运算ge=temp_data+0x30;}//毫秒延时**************************void delay_nms(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}/*******************************/void WaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;}/*******************************/void WriteCommandLCM(uchar CMD,uchar Attribc). {if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_(); DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/*******************************/void WriteDataLCM(uchar dataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/***********************************/void InitLcd(){WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1);}/***********************************/void DisplayOneChar(uchar X,uchar Y,uchar DData) {Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);}/**************************************延时5微秒(STC90C52RC@12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数**************************************/void Delay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}/**************************************延时5毫秒(STC90C52RC@12M)不同的工作环境,需要调整此函数当改用1T的MCU时,请调整此延时函数**************************************/void Delay5ms(){WORD n = 560;while (n--);}/**************************************起始信号**************************************/void BH1750_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/void BH1750_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/void BH1750_SendACK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}/**************************************接收应答信号**************************************/bit BH1750_RecvACK(){SCL = 1; //拉高时钟线Delay5us(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5us(); //延时return CY;}/**************************************向IIC总线发送一个字节数据**************************************/void BH1750_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}BH1750_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/BYTE BH1750_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;}//*********************************void Single_Write_BH1750(uchar REG_Address){BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(REG_Address); //内部寄存器地址,// BH1750_SendByte(REG_data); //内部寄存器数据,BH1750_Stop(); //发送停止信号}//********单字节读取*****************************************/*uchar Single_Read_BH1750(uchar REG_Address){ uchar REG_data;BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress); //发送设备地址+写信号BH1750_SendByte(REG_Address); //发送存储单元地址,从0开始BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号REG_data=BH1750_RecvByte(); //读出寄存器数据BH1750_SendACK(1);BH1750_Stop(); //停止信号return REG_data;}*///*********************************************************////连续读出BH1750内部数据////*********************************************************void Multiple_read_BH1750(void){ uchar i;BH1750_Start(); //起始信号BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF {BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据if (i == 3){BH1750_SendACK(1); //最后一个数据需要回NOACK }else{BH1750_SendACK(0); //回应ACK}}BH1750_Stop(); //停止信号Delay5ms();}//初始化BH1750,根据需要请参考pdf进行修改****void Init_BH1750(){Single_Write_BH1750(0x01);}//*********************************************************//主程序********//*********************************************************void main(){float temp;delay_nms(100); //延时100msInitLcd(); //初始化LCDInit_BH1750(); //初始化BH1750while(1) //循环{Single_Write_BH1750(0x01); // power onSingle_Write_BH1750(0x10); // H- resolution modedelay_nms(180); //延时180msMultiple_Read_BH1750(); //连续读出数据,存储在BUF中dis_data=BUF[0];dis_data=(dis_data<<8)+BUF[1]; //合成数据,即光照数据temp=(float)dis_data/1.2;conversion(temp); //计算数据和显示DisplayOneChar(0,0,'L');DisplayOneChar(1,0,'i');DisplayOneChar(2,0,'g');DisplayOneChar(3,0,'h');DisplayOneChar(4,0,'t');DisplayOneChar(5,0,':');DisplayOneChar(7,0,wan); //显示数据DisplayOneChar(8,0,qian);DisplayOneChar(9,0,bai);DisplayOneChar(10,0,shi);DisplayOneChar(11,0,ge);DisplayOneChar(13,0,'l'); //显示数单位DisplayOneChar(14,0,'x');}}。
LCD1602显示的程序
WriteOneChar(0xbe);//发温度转换命令
readtemp[0]=ReadOneChar();//读取相应的温度值低位
readtemp[1]=ReadOneChar();//读取相应的温度值高位
sflag[h]=0;
delayy(20);
}
//18B20读一个字节
ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
}
}
readtemp[1]=readtemp[1]<<4;//将高低温度和为一个字节,本方法避免了*0。0625,很简单,很准确
readtemp[1]=readtemp[1] & 0x70;
xx="readtemp"[0];
{
displaybuf[k+1]= fentemp%10;
fentemp= fentemp/10;
}
displaybuf[k]= fentemp;
k+=2;
xx="xx">>4;
xx="xx"& 0x0f;
readtemp[1]=readtemp[1] | xx;
temp[h]=readtemp[1];
fentempபைடு நூலகம்"temp"[h];//拆分两路温度值送入显示单元
LCD1602中文资料程序和使用说明
LCD1602中文资料程序和使用说明一、硬件连接和初始化步骤:1.将LCD1602的16个引脚连接到MCU(单片机)的相应引脚上。
其中,VCC和GND分别接到电源正负极,VO接到可调电位器的中间引脚(用于调节背光亮度),RS、RW和E分别接到MCU的IO口上,D0-D7分别接到MCU的8个IO口上。
2.初始化LCD1602的操作包括设置显示模式、显示光标、输入模式等,具体步骤如下:a.将8位数据接口设置为并行输入模式,即设置D0-D3为输入模式。
b.设置显示模式为2行显示,5x8点阵字符,显示器不移动。
c.将显示光标设置为闪烁显示。
d.设置数据输入方式为向右移动,同时字符显示不移动。
e.清除显示内容,将光标位置设置为第一行第一列。
f.打开显示器和光标显示功能。
二、常用函数和操作方法:1. void lcd1602_init( 初始化LCD1602,包括上述硬件连接和初始化步骤。
2. void lcd1602_clear( 清除显示内容。
3. void lcd1602_setCursor(int row, int column) 设置光标位置,row表示行数(从0开始),column表示列数(从0开始)。
4. void lcd1602_print(String str) 在当前光标位置打印字符串str。
5. void lcd1602_shiftDisplayLeft( 将显示内容向左移动一位。
6. void lcd1602_shiftDisplayRight( 将显示内容向右移动一位。
7. void lcd1602_scrollDisplayLeft( 将整个显示内容向左滚动一格。
8. void lcd1602_scrollDisplayRight( 将整个显示内容向右滚动一格。
9. void lcd1602_noCursor( 关闭光标显示。
10. void lcd1602_cursor( 打开光标显示。
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液晶显示函数流程设计下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!在嵌入式系统中,液晶显示模块是一种常见的输出设备,而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程序流程图lcd1602程序流程图1、引脚3(对⽐调整电压)接正电源时对⽐度最低,接地时对⽐度最⾼,通常通过⼀个10k的电位器相连后接地,上电后需要对电位器进⾏调整以显⽰出相应的字符(就像调节电视的对⽐度使图像清晰,这⾥是使字符清晰)2、D0~D7为8为数据总线,⽤于与单⽚机之间的数据传送了解了引脚功能后,我们再来看其内置芯⽚关于HD44780HD44780内部含有DDRAM,CGROM,CGRAM下⾯我来简单介绍⼀下这三个存储器DDRAM是⽤于寄存待显⽰字符代码的,其内部带有80字节的RAM 缓冲区,与LCD屏幕的位置⼀⼀对应。
通常我们只使⽤前16个地址(两⾏32个),这样⼀来,我们便可以将这32个地址当作是我们的坐标,⽐如要在DDRAM的02H 地址(对应的是屏幕第⼀⾏第三个)显⽰字符“A”,我们就可以分两步⾛,⾸先⽤程序先找到“坐标点”,也就是将地址转到02H(具体如何不做详细说明),然后在这个位置写⼊“A”,写⼊地址和数据都是通过D0~D7实现的,详细的程序在⽂章的后⾯举例说明。
CGROM与CGRAM是LCD内部固化的字模存储器,这相当于芯⽚内部划出的⼀块区域,CGROM⾥⾯存放着我们⽇常所使⽤的⼀些字符(192个),⽽CGRAM则允许⽤户⾃定义⼀些字符(8个)。
具体对应关系如下,0x00~0x0F就是⽤户⾃定义的CGRAM区。
再回到之前的问题,在DDRAM的02H地址显⽰字符“A”,⾸先通过程序找到地址02H,然后在该地址写⼊41H,从图中也可看出该位置对应的字符就是“A”。
我们再来理⼀理这个过程,有关字符显⽰,⾸先便是找到DDRAM 中我们所要显⽰位置对应的地址,接着便是在这个地址写⼊⼀个地址(单⽚机中的间接寻址),LCD根据这个地址在CGROM中找到对应的字符,然后在02H这个位置显⽰出来,这个过程也到此结束。
由于CGROM中的字符代码与PC中的字符代码基本⼀致,通常我们也直接在02H地址直接写⼊“A”,简化了程序设计。
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流程图LCD1602流程图是指在液晶显示屏模块上显示特定信息的流程图。
下面我们将介绍一个简单的LCD1602流程图,包括初始化液晶模块、设置显示模式、输入要显示的内容等步骤。
首先,我们需要准备一个Arduino开发板和一个LCD1602模块。
将LCD模块的VCC和GND引脚分别连接到Arduino的3.3V和GND引脚上,将SDA和SCL引脚连接到Arduino的A4和A5引脚上。
然后,编写以下步骤来实现流程图。
第一步,初始化液晶模块。
在Arduino开发环境中,我们需要包含LiquidCrystal_I2C.h库文件,然后创建一个LiquidCrystal_I2C对象。
使用begin()函数初始化LCD模块,并设置显示模式和光标的闪烁。
第二步,设置显示模式。
使用setCursor()函数将光标移动到特定位置,并使用print()函数输入要显示的内容。
根据需要可以设置一到两行进行显示。
第三步,设置滚动显示。
使用scrollDisplayLeft()或scrollDisplayRight()函数在屏幕上滚动显示内容。
第四步,设置光标显示状态。
使用noCursor()函数关闭光标显示,使用cursor()函数开启光标显示。
第五步,设置光标闪烁状态。
使用noBlink()函数关闭光标闪烁,使用blink()函数开启光标闪烁。
第六步,设置显示打开/关闭状态。
使用noDisplay()函数关闭显示,使用display()函数开启显示。
第七步,设置自定义字符。
使用createChar()函数在CGRAM (字符生成RAM)中自定义字符,并使用write()函数在屏幕上显示。
第八步,清除屏幕。
使用clear()函数清除屏幕上的内容。
第九步,设置屏幕显示次数。
使用blinkDisplay()函数设置屏幕的显示次数,并使用count()函数检测屏幕的显示次数。
第十步,控制光标位置。
使用setCursor()函数将光标移动到特定位置。
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是一种常用的液晶显示器模块,具有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.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原理与显示程序首先,液晶显示屏是由液晶分子填充在两块平行的玻璃基板之间组成的。
每个液晶分子都是一个由长链有机分子构成的棒状结构,其中的双键允许分子在电场的作用下进行旋转。
液晶分子通过平行阵列技术排列,使得液晶屏幕变为一个有序的结构,可以透过光束。
在液晶显示屏的基板上有多个透明电极排列,它们分别与控制芯片连接。
控制芯片通过对这些电极施加电压,调整液晶的扭曲程度。
当没有电压施加在液晶上时,液晶分子处于平行排列的状态,光线经过液晶屏会发生旋转,从而可以通过另一边的透光板透过。
当电压施加到液晶上时,液晶分子会以一定的角度旋转,光线经过时则发生偏波而无法穿过。
这样就实现了液晶显示屏的亮暗变化。
为了实现文字和图形的显示,我们需要通过控制芯片向液晶屏发送指令和数据。
控制芯片和液晶显示屏之间的连接是通过并行通信实现的,常用的通信方式是使用4位或8位并行数据线。
在发送指令和数据之前,我们需要将控制芯片配置为指令或数据模式。
指令模式下,控制芯片接收的数据被视为设定控制参数,比如清屏、光标移动等;数据模式下,控制芯片接收的数据被视为要显示的字符或图形。
液晶显示屏的显示程序可以使用任意的微控制器或单片机来编写。
程序的基本思路是通过对控制芯片发送指令和数据来控制液晶屏的显示。
首先,我们需要初始化液晶显示屏,这包括设置通信参数、清屏、光标重置等操作。
然后,我们可以通过写入数据寄存器来显示字符或图形。
通过控制芯片提供的指令,可以实现光标的位置移动、屏幕的滚动、光标的显示和隐藏等功能。
在程序中,我们可以定义字符和图形的数据,然后通过写入数据寄存器将其显示在液晶屏上。
有些控制芯片还提供了自定义字符的能力,可以通过修改字符发生器生成字符的模式来实现。
总结起来,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 滚动显示*;* 显示方式:*;* 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。