基于51单片机的LCD1602显示程序模块
基于51单片机的LCD1602显示程序模块
这个是我自己编写的基于51单片机控制lcd602显示的库函数,请下载我的头文件,在网上本人还分享了很多热门模块的库函数,都是现成的,欢迎下载!!!!/************************************************************************1,先初始化1602:lcd_init();2,调整显示位置:lcd_pos(hang,lie);3,送显示:lcd_wdat(uchar dat);显示字符lcd_show(uchar dis[]);显示字符串4,清屏为:lcd_wcmd(0x01); //清除lcd内容delay12_ms(2);注:显示的时候必须传送对应的ASK码显示字符串的时候如果超过本行显示范围不会自动跳到第二行占用了P0和P25,P26,P27 同时包含delay.c文件必须************************************************************************/#include "myconfig.h"#include "delay.h"#define LCD_RS P26 //1602的命令和数据选择端#define LCD_RW P25 //1602的读写控制端#define LCD_EP P27 //1602是能信号#define LCD_DATE P0 //1602的数据传输或命令端口/****************(外部不操作)测忙程序************************/uchar lcd_bz(){uchar result;LCD_RS =0;LCD_RW =1;LCD_EP =1;_nop_();_nop_();_nop_();_nop_();result =(P0 &0x80);LCD_EP =0;return result;//返回结果,1为忙,0位空闲}/****************(外部不操作)写命令函数************************/void lcd_wcmd(int cmd){while(lcd_bz());LCD_RS =0;LCD_RW =0;LCD_EP =0;_nop_();_nop_();LCD_DATE = cmd;。
51单片机计算器1602显示程序
delay_jsq(5);
if(P2!=0xfb)
{
if(P2!=0xfb)
{
temp=P2&0xf0;
switch(temp)
{
case 0xe0:num=8;
break;
case 0xd0:num=9;
break;
case 0xb0:num=10;
break;
case 0x70:num=11;
case 0x70:num=7;
break;
}
}
while(P2!=0xfd);
if(j!=0)
{
write_lcd1602(0x01,0);
delay(1);
j=0;
}
if(num==4||num==5||num==6&&num!=7)//如果按下的是'4','5'或'6'
{
if(flag1==0)//没有按过符号键
break;
}
}
}
}
void main()
{
ini_lcd1602();
while(1)
{
keyscan_4_4();
}
}
write_lcd1602(0x06,0);
delay(1);
write_lcd1602(0x01,0);
delay(1);
num_1=0;
i=0;
j=0;
a=0; //第一个参与运算的数
b=0; //第二个参与运算的数
c=0;
flag1=0; //flag1表示是否有符号键按下,
fuhao=0; // fuhao表征按下的是哪个符号
51单片机lcd1602工作原理
51单片机lcd1602工作原理一、概述1、单片机简介51单片机是一种广泛应用于嵌入式系统的微型计算机,具有周期定时器、数据存储器和输入输出等功能。
其体积小,功耗低,适用于各种微型控制系统。
2、LCD1602简介LCD1602是一种常见的字符型液晶显示器模块,具有16x2的字符显示区域,可以显示16个字符x2行。
它具有低功耗、高对比度、显示清晰等特点,广泛应用于各种电子产品中。
二、LCD1602的原理1、LCD1602的工作原理概述LCD1602的工作原理是利用触电效应,通过控制电场来改变液晶分子的排列方向,从而实现显示功能。
其原理涉及液晶材料、电极、控制信号等方面。
2、液晶材料液晶材料是LCD1602的显示主体,主要由有机分子组成,能够对电场敏感。
当电场变化时,液晶分子会发生排列变化,从而改变光的透射情况。
3、电极LCD1602的电极主要由透明的ITO材料组成,用于施加电场。
通过不同的电压信号,可以改变液晶分子的排列方向,进而控制显示状态。
4、控制信号51单片机通过控制LCD1602的数据口和控制口,向其发送控制信号和数据信号,从而控制液晶显示的内容和状态。
具体的控制信号包括使能信号、读写信号、数据信号等。
三、LCD1602的工作原理分析1、初始化在使用LCD1602之前,首先需要对其进行初始化。
初始化过程主要包括设置显示模式、清屏、光标设置等操作。
通过向LCD1602发送特定的指令,可以实现初始化操作。
2、数据传输51单片机通过并行方式向LCD1602发送数据,数据主要包括要显示的字符、控制信息等。
在发送数据时,需要依次发送高四位和低四位数据,并通过控制信号进行确认。
3、显示控制LCD1602支持多种显示模式和显示控制功能,可以实现光标显示、字符闪烁、显示移动等功能。
通过向LCD1602发送相应的指令,可以实现这些显示控制功能。
四、LCD1602的应用1、嵌入式系统LCD1602广泛应用于各种嵌入式系统中,用于显示系统状态、调试信息、用户交互界面等。
51单片机LCD1602液晶显示的接法
51单片机综合学习之1602字符型液晶显示篇在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
基于51单片机控制的1602液晶电子时钟显示程序
基于51单片机控制的1602液晶电子时钟显示程序[ 2007-05-31 13:31:45 | By: kevin ]刚写好的基于51单片机控制的1602液晶电子时钟显示程序,整理了一下,并尽量加上的注释,放出来大家共享及交流。
有兴趣的可以参考一下,各管脚定义都比较明显,有一定基础的可稍作修改即可进行实验。
//基于51单片机控制的1602液晶电子时钟显示程序#i nclude <intrins.h>#i nclude <at89x51.h>#define uchar unsigned char#define LCM_RS P2_2 //定义引脚#define LCM_RW P2_1#define LCM_E P2_0#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识uchar i, j, k, second, tcount, minute, hour;void WriteDataLCM(unsigned char WDLCM);void WriteCommandLCM(unsigned char WCLCM,BuysC);unsigned char ReadDataLCM(void);unsigned char ReadStatusLCM(void);void LCMInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void DisplayqListChar(unsigned char X, unsigned char Y, unsigned char code *DData);void Delay5Ms(void);void Delay400Ms(void);unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9'};//数码管数字编码unsigned char code MyNo[] = {"NAME:Who_am_I?"};/*************************************************************************** ***************** 函数名称:delay()** 功能描述:延时子程序,大约延时n MS** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/delay(uchar n){uchar i,j,k;for(i=2;i>0;i--)for(j=n;j>0;j--)for(k=125;k>0;k--);}/*************************************************************************** ***************** 函数名称:lcd()** 功能描述:液晶初始化,然后在液晶屏第二行显示提示信息** 输入:** 输出:** 全局变量:** 调用模块:Delay400Ms(),LCMInit(),DisplayListChar()** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void lcd(void){Delay400Ms(); //启动等待,等LCM讲入工作状态LCMInit(); //LCM初始化Delay5Ms(); //延时片刻(可不要)DisplayListChar(0, 1, MyNo);}/*************************************************************************** ***************** 函数名称:WriteDataLCM()** 功能描述:写数据** 输入:WDLCM** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void WriteDataLCM(unsigned char WDLCM){ReadStatusLCM(); //检测忙LCM_Data = WDLCM;LCM_RS = 1;LCM_RW = 0;LCM_E = 0; //若晶振速度太高可以在这后加小的延时LCM_E = 0; //延时LCM_E = 1;}/*************************************************************************** ***************** 函数名称:WriteCommandLCM()** 功能描述:写指令** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCM(); //根据需要检测忙LCM_Data = WCLCM;LCM_RS = 0;LCM_RW = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;}/*************************************************************************** ***************** 函数名称:ReadDataLCM()** 功能描述:读数据** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/unsigned char ReadDataLCM(void){LCM_RS = 1;LCM_E = 0;LCM_E = 0;LCM_E = 1;return(LCM_Data);}/*************************************************************************** ***************** 函数名称:ReadStatusLCM()** 功能描述:读状态** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/unsigned char ReadStatusLCM(void){LCM_Data = 0xFF;LCM_RS = 0;LCM_E = 0;LCM_E = 0;LCM_E = 1;while (LCM_Data & Busy); //检测忙信号return(LCM_Data);}/*************************************************************************** ***************** 函数名称:LCMInit()** 功能描述:LCM初始化** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void LCMInit(void){LCM_Data = 0;WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,0);Delay5Ms();WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号WriteCommandLCM(0x08,1); //关闭显示WriteCommandLCM(0x01,1); //显示清屏WriteCommandLCM(0x06,1); // 显示光标移动设置WriteCommandLCM(0x0C,1); // 显示开及光标设置}/*************************************************************************** ***************** 函数名称:DisplayOneChar()** 功能描述:按指定位置显示一个字符** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; // 算出指令码WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码WriteDataLCM(DData);}/*************************************************************************** ***************** 函数名称:DisplayListChar()** 功能描述:按指定位置显示一串字符** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}/*************************************************************************** ***************** 函数名称:Delay5Ms()** 功能描述:5ms延时** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void Delay5Ms(void){unsigned int TempCyc = 5552;while(TempCyc--);}/*************************************************************************** ***************** 函数名称:Delay400Ms()** 功能描述:400ms延时** 输入:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void Delay400Ms(void){unsigned char TempCycA = 5;unsigned int TempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);};}/*************************************************************************** ***************** 函数名称:timer0()** 功能描述:中断子程序,1秒重写一次液晶,以此实现60秒计数** 输入:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void timer0() interrupt 1 using 0{int i;TH0=(65536-50000)/256*3; //中断设置初始化TL0=(65536-50000)%256*3;tcount++;if(tcount==60) //满1秒{ i=0;DisplayOneChar(i++, 0, 'T'); //在第1行第1个坐标显示DisplayOneChar(i++, 0, 'I'); //在第1行第2个坐标显示DisplayOneChar(i++, 0, 'M'); //在第1行第3个坐标显示DisplayOneChar(i++, 0, 'E'); //在第1行第4个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第5个坐标显示DisplayOneChar(i++, 0, table[hour/10]); //在第1行第6个坐标显示DisplayOneChar(i++, 0, table[hour%10]); //在第1行第7个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第1个坐标显示DisplayOneChar(i++, 0, table[minute/10]); //在第1行第8个坐标显示DisplayOneChar(i++, 0, table[minute%10]); //在第1行第9个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第10个坐标显示DisplayOneChar(i++, 0, table[second/10]); //在第1行第11个坐标显示DisplayOneChar(i++, 0, table[second%10]); //在第1行第12个坐标显示tcount=0;second++;if(second==60) //满1分{second=0;minute++; //分数加1,秒数归零if(minute==60) //满1小时{minute=0;hour++; //小时数加1,分数归零if(hour==24){hour=0;}}}}}/*************************************************************************** ***************** 函数名称:main()** 功能描述:主程序,设置初始时间,中断设置初始化,液晶显示,等待中断** 输入:** 输出:** 全局变量:** 调用模块:** 作者:kevin** 日期:2007年5月31日**************************************************************************** ****************/void main(){uchar i;second=0;minute=0;hour=0; //设置初始时间TH0=(65536-50000)/256; //中断设置初始化TL0=(65536-50000)%256;EA=1;ET0=1;TMOD=0x21;TR0=1;lcd();i=0;DisplayOneChar(i++, 0, 'T'); //在第1行第1个坐标显示DisplayOneChar(i++, 0, 'I'); //在第1行第2个坐标显示DisplayOneChar(i++, 0, 'M'); //在第1行第3个坐标显示DisplayOneChar(i++, 0, 'E'); //在第1行第4个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第5个坐标显示DisplayOneChar(i++, 0, table[hour/10]); //在第1行第6个坐标显示DisplayOneChar(i++, 0, table[hour%10]); //在第1行第7个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第1个坐标显示DisplayOneChar(i++, 0, table[minute/10]); //在第1行第8个坐标显示DisplayOneChar(i++, 0, table[minute%10]); //在第1行第9个坐标显示DisplayOneChar(i++, 0, ':'); //在第1行第10个坐标显示DisplayOneChar(i++, 0, table[second/10]); //在第1行第11个坐标显示DisplayOneChar(i++, 0, table[second%10]); //在第1行第12个坐标显示while(1); //等待中断}。
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控制背光源的亮度。
基于51单片机控制LCD1602液晶屏显示
基于51单⽚机控制LCD1602液晶屏显⽰LCD1602⼀共有16个接⼝,其中RS,RW,EN,D0,D1,D2,D3,D4,D5,D6,D7⽤于读写数据也就是说是并⾏通信。
判断液晶忙:判断STA7是否为1,所以将P0⼝总线的数据和0x80(1000 0000)进⾏与运算。
每次对1602写指令都需要判断是否忙。
void Read_busy(){uchar busy;P0 = 0xff;RS = 0;RW = 1;do{EN = 1;busy = P0;EN = 0;}while(busy & 0x80);}写字节和写数据都是按照1602的数据⼿册来写的。
写LCD1602命令⼀个字节:void Write_Cmd(uchar cmd){Read_busy();RS = 0;RW = 0;P0 = cmd;EN = 1;EN = 0;}写⼀个字节数据:void Write_Dat(uchar dat){Read_busy();RS = 1;RW = 0;P0 = dat;EN = 1;EN = 0;}由上⾯的函数,就可以初始化LCD1602。
1602初始化函数:void Init_LCD1602(){LCD1602_Write_Cmd(0x38); //设置16*2显⽰,5*7点阵,8位数据接⼝LCD1602_Write_Cmd(0x0c); //开显⽰,不显⽰光标(0xf开显⽰,显⽰光标,光标闪烁)LCD1602_Write_Cmd(0x01); //清除显⽰LCD1602_Write_Cmd(0x06); //读写⼀字节后地址指针加1 Write_Cmd(0x80 | 0x00); //设置显⽰地址(显⽰在第⼀⾏第⼀个)设置显⽰地址以及设置读写地址指针⽅向⼀定要在清除显⽰之后要不然仍会显⽰在第⼀个格)LCD1602RAM在显⽰数字的时候要⽤ Write_Dat(3 + '0');显⽰字母使⽤ASCLL码(例如:显⽰H:Write_Dat(0x48);)在指定位置显⽰⼀个字符:要显⽰的横坐标取值0-40要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)dat:需要显⽰的数据以ASCLL形式显⽰void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);LCD1602_Write_Dat(dat);}显⽰字符串的时候就需要⽤到指针:在指定位置显⽰字符串:要显⽰的横坐标取值0-40要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)*str:需要显⽰的字符串void LCD1602_Dis_Str(uchar x, uchar y, uchar *str){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);while(*str != '\0'){LCD1602_Write_Dat(*str++);}}调⽤⽅式:uchar TestStr[] = {"Welcome!"};LCD1602_Dis_Str(0, 0, &TestStr[0]);显⽰简单的数字:#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit RS = P3^5;sbit RW = P3^6;sbit EN = P3^4;void Read_busy() //判断液晶忙{uchar busy;P0 = 0xff;RS = 0;RW = 1;do{EN = 1;busy = P0;EN = 0;}while(busy & 0x80);}void Write_Cmd(uchar cmd) //写LCD1602命令⼀个字节{Read_busy();RS = 0;RW = 0;P0 = cmd;EN = 1;EN = 0;}void Write_Dat(uchar dat) //写⼀个字节数据{Read_busy();RS = 1;RW = 0;P0 = dat;EN = 1;EN = 0;}void main(){Write_Cmd(0x38);//设置16*2显⽰Write_Cmd(0x0f);//开显⽰显⽰光标,光标闪烁Write_Cmd(0x01);//清屏Write_Cmd(0x06);//地址指针移位命令Write_Cmd(0x80 | 0x00);//显⽰地址Write_Dat(1 + '0');Write_Dat(2 + '0');Write_Dat(3 + '0');Write_Dat(4 + '0');Write_Dat(5 + '0');while(1);}显⽰字符串:#include <reg52.h>typedef unsigned char uchar;typedef unsigned int uint;#define LCD1602_DB P0 //LCD1602数据总线sbit LCD1602_RS = P3^5; //RS端sbit LCD1602_RW = P3^6; //RW端sbit LCD1602_EN = P3^4; //EN端sbit DU = P2^6;//sbit WE = P2^7;//数码管位选段选⽤于关闭数码管显⽰/*=================================================*函数名称:Read_Busy*函数功能:判断1602液晶忙,并等待=================================================*/void Read_Busy(){uchar busy;LCD1602_DB = 0xff;//复位数据总线LCD1602_RS = 0; //拉低RSLCD1602_RW = 1; //拉⾼RW读do{LCD1602_EN = 1;//使能ENbusy = LCD1602_DB;//读回数据LCD1602_EN = 0; //拉低使能以便于下⼀次产⽣上升沿}while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表⽰忙,程序等待}/*=================================================*函数名称:LCD1602_Write_Cmd*函数功能:写LCD1602命令*调⽤:Read_Busy();*输⼊:cmd:要写的命令=================================================*/void LCD1602_Write_Cmd(uchar cmd){Read_Busy(); //判断忙,忙则等待LCD1602_RS = 0;LCD1602_RW = 0; //拉低RS、RW操作时序情况1602课件下中⽂使⽤说明基本操作时序章节 LCD1602_DB = cmd;//写⼊命令LCD1602_EN = 1; //拉⾼使能端数据被传输到LCD1602内LCD1602_EN = 0; //拉低使能以便于下⼀次产⽣上升沿}/*=================================================*函数名称:LCD1602_Write_Dat*函数功能:写LCD1602数据*调⽤:Read_Busy();*输⼊:dat:需要写⼊的数据=================================================*/void LCD1602_Write_Dat(uchar dat){Read_Busy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_EN = 1;LCD1602_EN = 0;}/*=================================================*函数名称:LCD1602_Dis_OneChar*函数功能:在指定位置显⽰⼀个字符*调⽤:LCD1602_Write_Cmd(); LCD1602_Write_Dat();*输⼊:x:要显⽰的横坐标取值0-40,y:要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)dat:需要显⽰的数据以ASCLL形式显⽰=================================================*/void LCD1602_Dis_OneChar(uchar x, uchar y,uchar dat){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);LCD1602_Write_Dat(dat);}/*=================================================*函数名称:LCD1602_Dis_Str*函数功能:在指定位置显⽰字符串*调⽤:LCD1602_Write_Cmd(); LCD1602_Write_Dat();*输⼊:x:要显⽰的横坐标取值0-40,y:要显⽰的⾏坐标取值0-1(0为第⼀⾏,1为第⼆⾏)*str:需要显⽰的字符串=================================================*/void LCD1602_Dis_Str(uchar x, uchar y, uchar *str){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);while(*str != '\0'){LCD1602_Write_Dat(*str++);}}/*=================================================*函数名称:Init_LCD1602*函数功能:1602初始化*调⽤: LCD1602_Write_Cmd();=================================================*/void Init_LCD1602(){LCD1602_Write_Cmd(0x38); // 设置16*2显⽰,5*7点阵,8位数据接⼝ LCD1602_Write_Cmd(0x0c); //开显⽰LCD1602_Write_Cmd(0x06); //读写⼀字节后地址指针加1LCD1602_Write_Cmd(0x01); //清除显⽰}void main(){uchar TestStr[] = {"Welcome!"};DU = 0;WE = 0;//关闭数码管显⽰Init_LCD1602();//1602初始化LCD1602_Dis_Str(0, 0, &TestStr[0]); //显⽰字符串LCD1602_Dis_OneChar(10, 1, 0xff); //显⽰⼀个⿊⽅格while(1);}。
51单片机LCD1602液晶显示程序
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/******************************************************************************
*
*函数名 * 函数功能
: 初始化 LCD 屏 :无 :无
*******************************************************************************
/
#ifndef
LCD1602_4PINS
void LcdInit()
//LCD 初始化子程序
{ LcdWriteCom(0x38); //开显示
//以下程序都是在 VC++6.0 上调试运行过的程序,没有错误,没有警告。 //单片机是 STC89C52RC,但是在所有的 51 52 单片机上都是通用的。51 只是一个学习的基础 平台,你懂得。 //程序在关键的位置添加了注释。 //用//11111111111111111 代表第一个程序。//2222222222222222222222222 代表第二个程序, 以此类推
for(a=1;a>0;a--); } }
//误差 0us
}
/******************************************************************************
*
*函数名 * 函数功能
: LcdWriteCom : 向 LCD 写入一个字节的命令
LCD1602_E = 0;
LCD1602.H51单片机LCD1602显示驱动程序
LCD1602.H(51单片机LCD1602显示驱动程序)/*无敌高氯酸修改函数功能delay_ms(time) 延时time毫秒LCD_init() 初始化清空LCD屏LCD_print(x,y,str)在(x,y)坐标上显示str字符0=;0;i--)for (j=0;j<1140;j++);}/************************************************ *********************函数名称:LCD_print()功能描述:显示字符或字符串入口参数:字符或字符串返回值:无************************************************* *********************/void LCD_print(uchar x,uchar y,uchar *str){LCD_gotoxy(x,y);while(*str!='\0'){LCD_wdata(*str);str++;}}/************************************************** *******************函数名称:LCD_wcommand()功能描述:LCD写指令入口参数:uchar lcd_cmd:命令字,uchar busy_f:忙检测标志位返回值:无************************************************* ********************/void LCD_wcommand(uchar lcd_cmd,busy_f){if (busy_f) Rstatus(); //不忙才执行下个程序Port = lcd_cmd;Rw = 0;En = 0;En = 0;En = 1;}/************************************************ *********************函数名称:LCD_wdata()功能描述:LCD写数据入口参数:uchar wdata:所写数据返回值:无************************************************* ********************/void LCD_wdata(uchar wdata){Rstatus();Port = wdata;Rs = 1;Rw = 0;En = 0; //若晶振速度太高可以在这后加小的延时En = 0; //延时}/************************************************ *********************函数名称:LCD_rdata()功能描述:LCD读数据入口参数:无返回值:所读数据************************************************* ********************/uchar LCD_rdata(void){Rs = 1;Rw = 1;En = 0;En = 0;En = 1;return Port;}/************************************************ *********************函数名称:Rstatus()功能描述:LCD读忙状态入口参数:无返回值:若忙,则等待,不忙则返回Port************************************************* ********************/uchar Rstatus(void){Port = 0xFF;Rs = 0;Rw = 1;En = 0;En = 0;En = 1;while (Port & 0x80); //检测忙信号,不忙则退出等待return(Port);}/************************************************ *********************函数名称:LCD_init()功能描述:LCD初始化入口参数:无返回值:无************************************************* ********************/void LCD_init(void){Port = 0;LCD_wcommand(0x38,0); //三次显示模式设置,不检测忙信号delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,1); //显示模式设置(0X38双行(5*7),0X34单行(5*10)),0X30单行(5*7);开始要求每次检测忙信号LCD_wcommand(0x08,1); //关闭显示LCD_wcommand(0x01,1); //显示清屏LCD_wcommand(0x06,1); // 显示光标移动设置LCD_wcommand(0x0C,1); // 显示开及光标设置}/************************************************ *********************函数名称:LCD_gotoxy()功能描述:定位到(x,y)位置入口参数:x为行(0~1),y为列(0~15)返回值:无************************************************* ********************/void LCD_gotoxy(uchar x, uchar y){x &= 0x1; //限制x不能大于1,y不能大于15y &= 0xF;if(!x) LCD_wcommand(0x80|y,1);else LCD_wcommand(0xC0|y,1);}。
跟我学51单片机LCD1602液晶显示模块
1、LCD1602的P1.0-P1.4分别连接到51单片机的P0.0-P0.4; 2、LCD1602的P2.0-P2.7分别连接到51单片机的P2.0-P2.7;
3、LCD1602的VSS和VDD分别连接到51单片机的地线和电源; 4、LCD1602的VEE连接到51单片机的+5V;
5、LCD1602的PSB和REST分别直接接地和+5V。
二、LCD1602的应用
1、智能家居系统
智能家居系统是LCD1602的重要应用领域之一。在智能家居系统中,LCD1602 可以作为人机界面,显示各种信息,如温度、湿度、空气质量、电量等。同时, LCD1602还可以显示各种设备的状态,如灯光、空调、电视等,使用户能够更加 方便地控制各种设备。
2、工业控制系统
1、写入指令:通过单片机的I/O 口发送相应的指令码
2、写入数据:通过单片机的I/O 口发送相应的字符编码
显示控制在基础操作的基础上,我们可以进一步实现LCD1602液晶显示模块 的显示控制。下面通过几个实例来介绍如何利用LCD1602液晶显示模块实现文字 显示的控制。
1、静态显示:将一段文本的字符编码逐个写入LCD1602的控制器中,即可实 现文字的静态显示。例如,我们可以使用循环结构,依次将每个字符编码写入 LCD1602的控制器中。
参考内容二
基本内容
液晶显示模块LCD1602是一种常见的显示设备,广泛应用于各种嵌入式系统 和电子产品中。它具有低功耗、体积小、重量轻、高分辨率和长寿命等优点,因 此在许多领域中得到了广泛的应用。
一、LCD1602的概述
LCD1602是一种字符型液晶显示器,它由160个字符显示区域和8个字符显示 位组成。它支持多种字符集,包括英文字符集和数字字符集等。此外,LCD1602 还具有背光功能,可以在暗环境下清晰地显示字符。
基于单片机的LCD1602电子时钟设计
基于单片机的LCD1602电子时钟设计近年来,随着物联网和智能设备的快速发展,电子时钟作为一种常见的智能设备,广泛应用于家庭、办公室等各种场合。
本文将基于单片机设计一款LCD1602电子时钟,实现时间显示、闹钟设置等功能。
一、硬件设计1.单片机选择在本设计中,选择常用的51系列单片机AT89C51,具有丰富的外设资源和强大的处理能力。
该单片机具有8位数据总线、16位地址总线,并且集成了定时/计数器、中断控制器和串行通信接口等外设。
2.显示模块选择3.时钟模块选择通过接入DS1302时钟模块,可以实现实时时钟的功能。
DS1302模块具有时钟计数器、电压检测电路、串行通信接口等,并且具有低功耗特点。
4.控制板设计根据LCD1602的引脚连接方式,设计一个控制板,用于将单片机、显示模块和时钟模块等连接在一起。
同时,需注意设计供电电路、外设输入输出电平等电路。
二、软件设计1.初始化设置通过单片机的GPIO口配置,将LCD1602和DS1302对应的引脚设置为输出模式,同时初始化LCD显示屏并进行清屏操作。
此外,需设置DS1302时钟模块的时钟、日期、闹钟等参数。
2.时间显示通过读取DS1302时钟模块的计数器,获得当前的小时、分钟和秒数,然后将其格式化为HH:MM:SS的形式,并通过LCD显示出来。
3.时间设置通过单片机的外部中断,当用户按下设置按钮后,进入时间设置模式。
在时间设置模式下,用户可以通过按下不同的按键来调整小时、分钟和秒数。
调整完成后,再次按下设置按钮即可保存设置。
4.闹钟设置通过单片机的定时器中断,设定一个闹钟定时器。
当闹钟定时器触发时,触发相应的中断,然后通过LCD显示闹钟提示。
此外,用户也可以通过按下按钮来设置闹钟时间,并通过单片机的外部中断进行处理。
5.闹钟响铃当闹钟时间到达时,触发相应的中断,通过LCD显示闹钟提示,并通过蜂鸣器发出响铃声。
总结通过本设计,可以实现一款功能齐全的LCD1602电子时钟。
基于LCD1602的单片机显示系统设计
基于LCD1602的单片机显示系统设计一、引言在现代电子设备中,显示系统是不可或缺的组成部分。
而单片机作为一种常见的嵌入式系统,其显示功能也显得尤为重要。
本文将以基于LCD1602的单片机显示系统为例,介绍该系统的设计原理、硬件构成和软件实现。
二、LCD1602简介LCD1602,全称为Liquid Crystal Display 1602,是一种常用的字符型液晶显示器。
其由16×2个字符的点阵组成,每个字符由5×8的点阵构成。
通过控制液晶材料的偏振状态,可以实现字符的显示。
除了字符显示外,LCD1602还具备光电传感器和温度传感器等功能。
三、单片机显示系统的硬件构成1. 单片机单片机是整个显示系统的核心部分,它负责控制LCD1602的显示内容。
常见的单片机有8051系列、STM32系列等。
在本设计中,我们选择使用STM32F103C8T6单片机。
2. LCD1602LCD1602作为显示器件,连接在单片机的IO口上。
它通过并行通信协议与单片机进行数据交互。
在本设计中,我们使用8位并行通信方式。
3. 电源电路单片机显示系统需要一个稳定的电源供电。
一般情况下,我们使用5V电源,通过稳压芯片将电压稳定为3.3V供给单片机和LCD1602。
4. 连接线路将单片机与LCD1602之间的通信连接起来需要使用跳线等连接线路。
这些线路包括数据线、控制线等,确保单片机能够正常地向LCD1602发送数据和指令。
四、单片机显示系统的工作原理单片机显示系统的工作原理可以分为以下几个步骤:1. 初始化在使用LCD1602之前,需要进行初始化设置。
这包括设置LCD1602的工作模式、显示模式、光标设置等。
通过向LCD1602发送一系列初始化指令,使其进入工作状态。
2. 数据传输在初始化完成后,单片机可以通过向LCD1602发送数据来实现字符的显示。
数据可以是ASCII码,也可以是中文字符等。
通过向LCD1602的数据端口发送数据,再通过控制端口发送使能信号,将数据写入显示内存。
第七讲LCD1602基于51单片机20页PPT
谢谢
11、越是没有本领的就越加自命不凡。——邓拓 12、越是无能的人,越喜欢挑剔别人的错儿。——爱尔兰 13、知人者智,自知者明。胜人者有力,自胜者强。——老子 14、意志坚强的人能把世界放在手中像泥块一样任意揉捏。——歌德 15、最具挑战性的挑战莫过于提升自我。——迈克尔·F·斯特利
显示容量:16×2个字符 芯片工作电压:4.5—5.5V 工作电流:2.0mA(5.0V) 模块最佳工作电压:5.0V
实验箱LCD1602电路
1602控制器共有11条控制指令
指令
序号
RS
1 清显示
0
2 光标返回
0
3 置输入模式
0
4 显示开/关控制
0
5 光标或字符移位
0
6 置功能
0
7 置字符发生存贮器地址
0
0 0 1 DL N F * *
0
0 1 字符发生存贮器地址
0
1 显示数据存贮器地址
1 BF 计数器地址
0 作是通过指令编程来实现的(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的点阵字符,高电平时显示5x8的点阵字 符。 指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。 指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令 或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。
51单片机驱动LCD1602程序设计(C语言)
4.显示开关控制指令
功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下: 位名 D C B 设置 0=显示功能关 0=无光标 0=光标闪烁 1=显示功能开 1=有光标 1=光标不闪烁
5.设定显示屏或光标移动方向指令
功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: S/C 0 0 1 1 0 1 0 1 R/L 设定情况 光标左移 1 格,且 AC 值减 1 光标右移 1 格,且 AC 值加 1 显示器上字符全部左移一格,但光标不动 显示器上字符全部右移一格,但光标不动
10.数据写入 DDRAM 或 CGRAM 指令一览
功能:<1> 将字符码写入 DDRAM,以使液晶显示屏显示出相对应的字符; <2> 将使用者自己设计的图形存入 CGRAM。
11.从 CGRAM 或 DDRAM 读出数据的指令一览
功能:读取 DDRAM 或 CGRAM 中的内容。
基本操作时序:
读状态
从上图可以看出,“A”字的对应上面高位代码为 0100,对应左边低位代码为 0001,合起来就 是 01000001,也就是 41H。可见它的代码与我们 PC 中的字符代码是基本一致的。因此我们在向 DDRAM 写 C51 字符代码程序时甚至可以直接用 P1='A'这样的方法。 PC 在编译时就把“A”先转为 41H 代码了。 字符代码 0x00~0x0F 为用户自定义的字符图形 RAM(对于 5X8 点阵的字符,可以存放 8 组, 5X10 点阵的字符,存放 4 组),就是 CGRAM 了。后面我会详细说的。 0x20~0x7F 为标准的 ASCII 码, 0xA0~0xFF 为日文字符和希腊文字符, 其余字符码(0x10~ 0x1F 及 0x80~0x9F)没有定义。
基于51单片机的用 LCD1602 显示时钟的程序
用LCD1602 显示的时钟2012-04-30 15:04有这样一个题目:求一个为51 单片机编写的LCD 电子时钟的设计,简单就好!希望说一下怎么设计这个时钟,都需要些什么东西,最重要的——把这个设计需要的程序写出来。
设计的任务:以单片机控制的时钟,在LCD 显示器上显示当前的时间。
设计的基本要求:1.使用文字型LCD 显示器显示当前时间。
2.显示格式为“时时:分分:秒秒”。
3.用4个功能键操作来设置当前时间。
各个功能键的功能如下:K1:进入设置现在的时间。
K2:设置小时。
K3:设置分钟。
K4:确认完成设置。
4. 程序执行后工作指示灯LED 闪烁,表示程序开始执行,LCD 显示“00:00:00”,然后开始计时。
题目链接:/question/416705477.html//==================================================提到设计时钟,很多人都想到了时钟芯片DS1302,都说它简单、准确。
其实,这是个误区。
仅仅使用一般的单片机,简单的编程,达到相同DS1302 的准确度,并不是难事。
如果不要求计算平闰年、不要求分清大小月、不要求计算星期几,只是要求一个简单的时钟(及日历),用DS1302,就是自寻烦恼。
大家可以打开题目链接,看看其中的一些答案,就可以看出使用DS1302 是多么的繁琐了,简直就是一场噩梦。
做而论道以前就使用普通的单片机和LCD1602 设计过《时钟与日历》,程序设计的非常合理,时间精度就完全取决于晶振的精度。
设计出来的时钟,几个月都差不上一秒。
针对这个题目,做而论道翻出了以前的设计,删节了一些不需要的功能,设计出了符合题目要求的时钟,用PROTEUS 仿真截图如下:程序用C 语言编写,全部代码如下://---------------------------------------------------#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define KEY_IO P3#define LCD_IO P0sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;sbit SPK = P1^2;sbit LED = P2^4;bit new_s, modify = 0;char t0, sec = 50, min = 59, hour = 23;char code LCD_line1[] = "Designed by ZELD"; char code LCD_line2[] = "Timer: 00:00:00 "; char Timer_buf[] = "23:59:50";//---------------------------------------------------void delay(uint z){uint x, y;for(x = z; x > 0; x--) for(y = 100; y > 0; y--);//---------------------------------------------------void W_LCD_Com(uchar com) //写指令{LCD_RS = 0; LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲}//---------------------------------------------------void W_LCD_Dat(uchar dat) //写数据{LCD_RS = 1; LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据LCD_EN = 1; delay(5); LCD_EN = 0; //用EN输入一个高脉冲}//---------------------------------------------------void W_LCD_STR(uchar *s) //写字符串{while(*s) W_LCD_Dat(*s++);}//---------------------------------------------------void W_BUFF(void) //填写显示缓冲区{Timer_buf[7] = sec % 10 + 48; Timer_buf[6] = sec / 10 + 48;Timer_buf[4] = min % 10 + 48; Timer_buf[3] = min / 10 + 48;Timer_buf[1] = hour % 10 + 48;Timer_buf[0] = hour / 10 + 48;W_LCD_Com(0xc0 + 7); W_LCD_STR(Timer_buf);}//---------------------------------------------------uchar read_key(void){uchar x1, x2;KEY_IO = 255;x1 = KEY_IO;if (x1 != 255) {delay(100);x2 = KEY_IO;if (x1 != x2) return 255;while(x2 != 255) x2 = KEY_IO;if (x1 == 0x7f) return 0;else if (x1 == 0xbf) return 1;else if (x1 == 0xdf) return 2;else if (x1 == 0xef) return 3;else if (x1 == 0xf7) return 4;}return 255;//---------------------------------------------------void Init(){LCD_RW = 0;W_LCD_Com(0x38); delay(50);W_LCD_Com(0x0c);W_LCD_Com(0x06);W_LCD_Com(0x01);W_LCD_Com(0x80); W_LCD_STR(LCD_line1);W_LCD_Com(0xC0); W_LCD_STR(LCD_line2);TMOD = 0x01; //T0定时方式1TH0 = 0x4c;TR0 = 1; //启动T0PT0 = 1; //高优先级, 以保证定时精度ET0 = 1;EA = 1;}//---------------------------------------------------void main(){uint i, j;uchar Key;Init();while(1) {//-------------------------------if (new_s) { //如果出现了新的一秒, 修改时间new_s = 0; sec++; sec %= 60;if(!sec) { min++; min %= 60;if(!min) { hour++; hour %= 24;}}W_BUFF(); //写显示//-------------------------------if (!sec && !min) { //整点报时for (i = 0; i < 200; i++) {SPK = 0; for (j = 0; j < 100; j++);SPK = 1; for (j = 0; j < 100; j++);} }}//-------------------------------Key = read_key(); //读出按键switch(Key) { //分别处理四个按键case 0: modify = 1; break;case 1: if(modify) {min++; min %= 60; W_BUFF(); break;}case 2: if(modify) {hour++; hour %= 24; W_BUFF(); break;}case 3: modify = 0; break;} }}//---------------------------------------------------void timer0(void) interrupt 1 //T0中断函数, 50ms执行一次{TH0 = 0x4c;t0++; t0 %= 20; //20, 一秒钟if(t0 == 0) {new_s = 1; LED = ~LED;}if(modify) LED = 0;}//===================================================呵呵,全部程序,也不过120 行左右。
基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))
液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:液晶LCD1602显示字符和倒计时。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X,0); //这里不检测忙信号,发送地址码WriteDataLCD(DData); //发送数据}void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData){unsigned char 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){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。
基于51单片机的lcd1602显示温度_源程序_18b20测温
{
tmp[0]=' ';
tmp[1]='-';
tmp[2]=tp[2];
tmp[3]='\0';
}
else
{
tmp[0]='-';
tmp[1]=tp[1];
tmp[2]=tp[2];
tmp[3]='\0';
}
}
else
{
tp[0]=(temp/100)%10+'0';
tp[1]=(temp/10)%10+'0';
得到的结果正确.....
2、LCD的清屏时间----1.64ms;
*/
#include<reg51.h>
#include"LCD1602.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchartmp[4]={0,0,0,0};
#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++);
void Ds18b20_Write(uchardat)
{
uchar i;
51单片机LCD1602液晶显示测温系统
目录第一部分设计任务1.1设计题目及求要求 (3)1.2.1 方案一 (3)1.2.4 方案分析 (3)第二部分设计方案2.1总体设计方案说明 (3)2.2 实物电路图 (4)第三部分电路设计与器件选择3.1 DS18B20工作原理和功能说明 (4)3.2 LCD1602工作原理和功能说明 (16)第四部分 4.1实验程序 (28)第五部分 5.1课程设计总结(心得体会) (34)第六部分 6.1参考文献 (34)1.1设计题目及求要求用电子元器件和单片机通过编写程序做成能实时显示温度的仪器。
1.2.1 方案用通用型1602液晶显示器和DS18B20温度传感器组成温度显示仪,并编写程序用51单片机来控制和连接1602液晶显示器和DS18B20温度传感器。
1.2.2 方案分析1602液晶显示器能显示ASCII码字符,数字、大小写字母、和各种符号。
而且其体积小、功耗低、显示操作简单,显示值清晰,正常温度范围为-20~+60。
DS18B20温度传感器采用单总线协议,与单片机接口仅需用一个I/O接口无需任何外部元件,直接将环境温度转化成数字信号,从而大大简化了传感器于微处理机的接口。
DS18B20温度传感器支持多点组网功能,多个DS18B20可以并联在唯一的三线上,其测试范围在-50~+125.C。
测试结果直接输出数字温度信号,以“一位总线”串行传送给CPU,同时可传送CRC效验码,具有极强的抗干扰纠错能力。
电源板极性接反时,芯片不会因发热而烧毁。
且它具有微型化、低功耗、高新能、抗干扰能力强、一赔微处理器等优点。
考虑到1602液晶显示器和DS18B20温度传感器有诸多优点,顾用二者来完成实验。
2.1总体设计方案说明2.2实物电路图3.1DS18B20的工作原理① DS18B20数字温度传感器概述DS18B20数字温度传感器是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。
因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计,十分方便。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这个是我自己编写的基于51单片机控制lcd602显示的库函数,请下载我的头文件,在网上本人还分享了很多热门模块的库函数,都是现成的,欢迎下载!!!!
/************************************************************************
1,先初始化1602:lcd_init();
2,调整显示位置:lcd_pos(hang,lie);
3,送显示:lcd_wdat(uchar dat);显示字符
lcd_show(uchar dis[]);显示字符串
4,清屏为:lcd_wcmd(0x01); //清除lcd内容
delay12_ms(2);
注:
显示的时候必须传送对应的ASK码
显示字符串的时候如果超过本行显示范围不会自动跳到第二行占用了P0和P25,P26,P27 同时包含delay.c文件必须
************************************************************************/
#include "myconfig.h"
#include "delay.h"
#define LCD_RS P26 //1602的命令和数据选择端
#define LCD_RW P25 //1602的读写控制端
#define LCD_EP P27 //1602是能信号
#define LCD_DATE P0 //1602的数据传输或命令端口
/****************(外部不操作)测忙程序************************/
uchar lcd_bz()
{
uchar result;
LCD_RS =0;
LCD_RW =1;
LCD_EP =1;
_nop_();
_nop_();
_nop_();
_nop_();
result =(P0 &0x80);
LCD_EP =0;
return result;//返回结果,1为忙,0位空闲
}
/****************(外部不操作)写命令函数************************/
void lcd_wcmd(int cmd)
{
while(lcd_bz());
LCD_RS =0;
LCD_RW =0;
LCD_EP =0;
_nop_();
_nop_();
LCD_DATE = cmd;。