51单片机1602液晶-(教程)
51单片机实现电子时钟功能-1602液晶显示
![51单片机实现电子时钟功能-1602液晶显示](https://img.taocdn.com/s3/m/4dab5e3f9b89680202d8250f.png)
第一章设计要求及系统组成一、基本操作时序:读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲输出:无读数据:输入:RS=H,RW=H,E= 高脉冲输出:D0~D7数据写数据:输入:RS=H,RW=L。
D0~D7=数据,E=高脉冲输出:无二、、、状态字说明:STA7 D7\ STA6 D6\ STA5 D5 \ STA4 D4 \STA3 D3 \ STA2 D2\\ STA1 D1STA0-6:当前数据地址指针的数值STA7:读写操作使能 1表示禁止,0表示允许对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0;但是我们可以进行延时进行实现。
RAM地址映射: LCD 16字*2行00 01 02 03 04 05 06 07 08 08 09 0A 0B 0C 0D 0E 0F (27)40 41 42 4F 50 (67)指令说明:1.初始化设置 1.显示模式设置指令码:00111000(0x38)功能:设置16*2显示,5*7点阵,8位数据接口必须开显示 2.显示开、关及光标设置指令码:00001DCB,功能:D=1 开显示;D=0 关显示;C=1显示光标;B=1 光标闪烁;B=0 光标不显示 000001NS:功能:N=1当读或写一个字符后地址指针加1,且光标加1;N=0相应的减1;S=1当写一个字符,整屏显示左移(N=1)或右移(N=0),以得到光标不移动而屏幕移动的效果。
S=0 当写一个字符,正屏显示不移动。
数据控制:控制器内部设有一个数据地址指针,用户可通过它们来访问内部的全部80字节RAM4.2.1 数据指针设置:指令码:80H+地址码(0-27H,第二行开始:40H-67H) 4..2.2 读数据,写数据其它设置:01H:显示清屏:1.数据指令清零 2 所有显示清零 02H:显示回车:1.数据清零如何进行连接:实际操作中,液晶接到,第一管脚是D,第二管脚是VCC,15和16是背光,D0-D7是数据口,接到单片机的P0口,P0口接了两个锁存器,液晶,D/A,具有高阻状态的都可以随便接,没有影响,,第六管脚是LCDEN相当于 E,使能信号,它接P3^4,R/W接地,表示低电平,因为我们只进行写操作,RS接2实验板上的P3^5;只需这两端口便足以控制液晶,2和3是偏压信号,一端接地,接口信号说明:编号:1 VSS(符号表示)电源地(引脚说明)2VDD 电源正极3VL液晶显示偏压信号4RS数据/命令选择端(H/L)5R/W 读写选择端(H/L)6E使能信号7D0 Data 1/0 8D1 Data 1/0 9 D2 Data 1/0 10 D3 Data 1/0 11D4 Data 1/0 12D5 Data 1/0 13D6 Data 1/0 14D7 Data 1/0 15BLK背光源正极16 BLK背光源负极实际操作:::先写光标程序;写两个子程序,一个写数据,一个写指令:先进性两个宏定义,再位申明LCDEN与RS;为了电量充足。
基于51单片机的1602LCD显示
![基于51单片机的1602LCD显示](https://img.taocdn.com/s3/m/deb4fd56a8114431b80dd800.png)
标签:单片机LCD基于51单片机的1602LCD显示基于51单片机的1602LCD显示LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。
LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。
1 硬件设计采用51单片机控制1602LCD显示器的电路如下所示。
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。
单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。
在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。
51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只电阻RES 10K 一只排阻RESPAC-8 10K 一只1602液晶显示器LM016L 一只若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。
放置好元件后,布好线。
左键双击各元件,设置相应元件参数,完成电路图的设计。
2 软件设计用1602LCD显示两行字符的流程图如下所示。
用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。
//用LCD循环显示"Welcome to China"和"Hi!Good morning!"#include<reg51.h> //包含单片机的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS="P2"^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW="P2"^1; //读写选择位,将RW位定义为P2.1引脚sbit E="P2"^2; //使能信号位,将E位定义为P2.2引脚sbit BF="P0"^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code string[ ]={"Welcome to China"};unsigned char code string1[ ]={"Hi!Good morning!"};/*************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒*************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************函数功能:延时若干毫秒入口参数:n******************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*******************************************函数功能:判断液晶模块的忙碌状态返回值:result。
51单片机驱动1602液晶(4线串行)
![51单片机驱动1602液晶(4线串行)](https://img.taocdn.com/s3/m/26d08c39bd64783e09122b87.png)
51单片机驱动1602液晶(4线串行) 2015-06-26 12:04:01 来源:51hei关键字:51单片机1602液晶4线串行/*单片机I/O 口使单片机资源的重要组成部分,也是用来扩展外围设备的必选资源,尽可能以更少的I/O口实现更多的功能是单片机工程师追求的目标,现在的一些串行器件也为这一目标的实现添加了更多的可能性,比如I2C总线,MAXIM力推的1-WIRE等等,都可以以很少的I/O口实现更多的功能,当然这是以降低一定的速度为代价的。
废话少说,进入正题。
显示器件多见的是LED数码管,LCD液晶屏等。
一般的数码管成本低廉,在显示内容要求不多的时候适用;LCD液晶屏以更多的显示空间得到了许多人的爱好,不过成本上要高的多(市场价在20元左右),本文以LCD1602为例说明如何驱动液晶屏。
LCD1602外接的控制接口有RS,R/W,E;数据接口为DB7--DB0。
总共有11跟线与单片机的I/O口连接,若使用标准的51单片机,至少占用了一个端口再加上另一个端口的部分I/O口。
这再很多应用场合是不大可取的。
所以很有必要减少连接数。
从其数据手册上介绍的4线连接方式可以达到只使用7个I/O口即可满足要求,其中为3个控制口RS,R/W,E和数据口的DB7--DB4;写入数据或指令的顺序是先写高半个字节,再写低半个字节。
其中P0口的高四位接到LCD1602的DB7-DB4,P3.0-P3.1分别接RS,R/W,E;下面给出驱动源程序*/#include <reg52.h>#include "intrins.h"#define uint unsigned int#define uchar unsigned char#define TRUE 1#define FALSE 0#define nop _nop_()#define PtData P0 //定义连接口线,#define PtContr P3sbit RS="PtContr"^0;sbit RW="PtContr"^1;sbit E="PtContr"^2;void InitialLcd();void WriteLcdInstr(uchar);void WriteLcdData(uchar);void CheckLcdBusy();uchar HexToDdram(uchar);void Delay(unsigned int);main(){Delay(1000);InitialLcd();WriteLcdInstr(0x80); WriteLcdData('e');WriteLcdData('l');WriteLcdData('k');WriteLcdData('e');WriteLcdData('l');WriteLcdData('i');WriteLcdData('k');WriteLcdData('e');WriteLcdInstr(0xc0); WriteLcdData('L');WriteLcdData('C');WriteLcdData('D');WriteLcdData('1');WriteLcdData('6');WriteLcdData('0');WriteLcdData('2');while(1){WriteLcdInstr(0x0f);Delay(30000);WriteLcdInstr(0x08);Delay(40000);}}//----------------LCD1602函数---------------------////---初始化void InitialLcd(){Delay(600);//延时应大于15ms,不同的晶振使需要修改,本程序再6M下调试通过RS=0;RW=0;nop;E=0;nop;E=1;nop;PtData=0x20;//nop;E=0;Delay(200);//延时应大于4.1msE=1;nop;PtData=0x20;//nop;E=0;Delay(5);//延时应大于100usE=1;nop;PtData=0x20;//nop;E=0;//设置4位操作;WriteLcdInstr(0x01);//清屏WriteLcdInstr(0x28);//设置4位操作,1行显示,5x8WriteLcdInstr(0x02);//光标归位WriteLcdInstr(0x06);//AC自动加1,画面不动WriteLcdInstr(0x0f);//0x0f:光标闪烁开;}//---写指令void WriteLcdInstr(uchar Temp){CheckLcdBusy();RS=0;RW=0;E=0;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---写数据void WriteLcdData(uchar Temp) {CheckLcdBusy();RS=1;RW=0;E=0;nop;E=1;nop;PtData=Temp;nop;E=0;nop;E=1;nop;PtData=(Temp<<4);nop;E=0;nop;}//---查忙void CheckLcdBusy(){uchar Temp,t;PtData=0xff;RW=1;RS=0;nop;E=0;nop;do{nop;E=1;nop;Temp=PtData;nop;nop;nop;E=0;nop;nop;t=PtData;nop;nop;nop;E=0;nop;nop;Temp&=0x80;}while(Temp==0x80);}//---delayvoid Delay(unsigned int N) {unsigned int i;for(i=0;i<N;i++){i=i;}}。
菜鸟学习51单片机之1602液晶
![菜鸟学习51单片机之1602液晶](https://img.taocdn.com/s3/m/a6726738b90d6c85ec3ac669.png)
菜鸟学习51单片机----1602液晶其中的硬件连接我就不讲了,现在主要看我么要操作的几个引脚:RS(命令数据选择引脚,高电平是数据,低电平是命令),RW(读写控制引脚,高电平是读,低电平是写),E(使能端,高电平使能,低电平关使能)。
DB0---DB7是8位数据脚。
在提供的仿真图中,RS,RW,E 分别接到单片机的P3.0P3.1P3.2引脚,数据脚DB0--DB7接在P1的8个脚上。
硬件介绍完了,那开始讲解如何去操作它,怎么去控制1602液晶。
先看两个时序图,根据时序图来写出两个函数。
写数据和写命令函数:{uint16i,j;for(i=0;i<xms;i++)for(j=0;j<110;j++);}基本的函数完成后就开始对液晶进行初始化。
但是怎么去初始化呢,现在就要对照着1602的指令来分析。
现在对上面的一个个分析:上面的各项中RS和RW列的都是0表示是写命令所以在初始化中,就是通过写命令对液晶进行基本的设定。
1.清显示:根据表格中的信息,清显示的指令就是0x012.光标返回在初始化中不用3.输入模式I/D位如果是0则表示写入数据后光标左移,如果是1则是写入数据后光标右移。
S如果是0则表示写入数据后屏幕显示不移动,如果是1则表示写入数据后屏幕整体右移一个字。
一般设为0x064.控制显示器开/关、光标显示/关闭以及光标是否闪烁。
参数设定的情况如下:位名设置D0=显示功能关1=显示功能开C0=无光标1=有光标B0=光标不闪烁1=光标闪烁,一般设为,0x0c5.使光标移位或使整个显示屏幕移位。
参数设定的情况如下:S/C R/L设定情况00光标左移1格,且AC值减101光标右移1格,且AC值加110显示器上字符全部左移一格,但光标不动11显示器上字符全部右移一格,但光标不动(这个初始化不涉及光标和移位,所以不设定这个)6.位名设置DL0=数据总线为4位1=数据总线为8位N0=0=显示1行11=1=显示2行2F0=5×7点阵/每字符1=5×10点阵/每字符一般设为0x38根据上面的分析可以定义如下几个宏定义:#define Clear0x01#define Show0x0c#define InputMode0x06#define Function0x38初始化函数如下:/*************初始化*********************/void Lcd1602Init(){Lcd1602Disable();Lcd1602WriteCommand(Function);Lcd1602WriteCommand(Show);Lcd1602WriteCommand(InputMode);Lcd1602WriteCommand(Clear);}液晶的地址:两行分别是写入显示地址一定要第七位是高电平,所以不能直接写上面的地址,而是用上面的地址加上0x80才是对应位置的显示地址。
51单片机LCD1602液晶显示的接法
![51单片机LCD1602液晶显示的接法](https://img.taocdn.com/s3/m/7832b1d00b4c2e3f56276316.png)
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液晶做的数字钟](https://img.taocdn.com/s3/m/e1ea3129cbaedd3383c4bb4cf7ec4afe04a1b1e9.png)
用51单片机和1602液晶做的数字钟数字钟是人们日常生活中常见的时间显示设备,它能够精确显示当前的时间,并且兼具简约和实用性。
本文将介绍使用51单片机和1602液晶屏幕制作自己的数字钟的方法。
所需材料在开始制作之前,我们需要准备以下材料: - 51单片机开发板 - 1602液晶屏幕 - 数字时钟芯片RTC(Real-Time Clock) - 面包板和导线 - 电阻和电容 - 编程器和烧录器硬件连接首先,我们需要将51单片机、1602液晶屏幕和RTC芯片连接起来。
根据硬件接口的定义和引脚功能的规定,我们可以进行以下连接: - 将51单片机的VCC 引脚连接到1602液晶屏幕的VCC引脚,用于提供电源。
- 将51单片机的GND引脚连接到1602液晶屏幕的GND引脚,用于地线连接。
- 将51单片机的P0口连接到1602液晶屏幕的数据线D0-D7,用于数据传输。
- 将51单片机的P2口连接到1602液晶屏幕的RS引脚,用于选择数据和命令传输。
- 将51单片机的P3口连接到1602液晶屏幕的EN引脚,用于启用LCD。
此外,还需要将RTC芯片连接到51单片机上,以实现时间的准确显示。
具体的连接方式可以参考RTC芯片的规格说明书。
软件编程完成硬件连接后,我们需要进行软件编程,以便控制51单片机、1602液晶屏幕和RTC芯片的功能。
初始化首先,我们需要对51单片机和1602液晶屏幕进行初始化设置。
这包括设置引脚的功能模式、初始化1602液晶屏幕的显示模式和清空显示区域。
读取时间接下来,我们需要通过RTC芯片来读取当前的时间。
这通常包括读取RTC芯片存储的年、月、日、时、分和秒的数据。
显示时间读取时间后,我们可以将其显示在1602液晶屏幕上。
这可以通过更新特定的LCD显示区域来实现。
我们可以在指定的位置、特定的行和列上显示时间。
更新时间为了实现实时的时间显示,我们需要定期更新显示的时间。
可以使用定时器中断来定期更新时间,并根据需要刷新液晶屏幕上的显示。
基于51和PROTEUS的液晶显示屏LCD1602的使用
![基于51和PROTEUS的液晶显示屏LCD1602的使用](https://img.taocdn.com/s3/m/8cd8f630eefdc8d377ee3207.png)
液晶显示屏1602的使用一、L CD1602显示字符‘A’斧头帮2010-05-10Proteus仿真图C程序:/******************************************实例81:用LCD显示字符'A'*******************************************/#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
基于51单片机控制的1602液晶电子时钟显示程序
![基于51单片机控制的1602液晶电子时钟显示程序](https://img.taocdn.com/s3/m/b338dd6879563c1ec5da71e0.png)
基于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); //等待中断}。
51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】
![51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】](https://img.taocdn.com/s3/m/06cb91e1bcd126fff6050b02.png)
{
switch(be)
{//uint i;
/*用于整点响铃*/case 0:{
buzz=~buzz;
//delay1();
}break;
/*用于闹铃报时*/case 1:{
buzz=~buzz;
//delay(10);
}break;
}
}
void write_com(uchar com)//命令写入函数
{
rs=0;
delay(3);
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void write_date(uchar date)//数据写入函数
{
rs=1;
delay(3);
P0=date;
delay(3);
write_date(0x30+ge);
}
void write_ymd(uchar add,uchar date)//年月日写入子程序
{
uchar sh,ge;
sh=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+sh);
write_date(0x30+ge);
sbit buzz=P1^5; //蜂鸣器控制端
uchar code week0[]="Sun";
uchar code week1[]="Mon";
uchar code week2[]="Tue";
基于51单片机的1602LCD显示
![基于51单片机的1602LCD显示](https://img.taocdn.com/s3/m/deb4fd56a8114431b80dd800.png)
标签:单片机LCD基于51单片机的1602LCD显示基于51单片机的1602LCD显示LCD(liquid crystal display)为液晶显示器,它一般不会单独使用,而是将LCD面板、驱动与控制电路组合成LCD模块(1iquid crystal display moulde,简称为LCM)来使用。
LCM是一种很省电的显示设备,常被应用在数字或微处理器控制的系统,做为简易的人机接口,但人们一般还是习惯称之为LCD显示器。
1 硬件设计采用51单片机控制1602LCD显示器的电路如下所示。
在桌面上双击图标,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。
单击菜单命令“文件”→“新建设计”,选择DEFAULT 模板,保存文件名为“LCD.DSN”。
在器件选择按钮中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。
51单片机AT89C51 一片晶体CRYSTAL 12MHz 一只瓷片电容CAP 22pF 二只电解电容CAP-ELEC 10uF 一只电阻RES 10K 一只排阻RESPAC-8 10K 一只1602液晶显示器LM016L 一只若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U1的31脚,都可以不画,它们都是默认的。
在ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标,在对象选择器中单击POWER和GROUND放置电源和地。
放置好元件后,布好线。
左键双击各元件,设置相应元件参数,完成电路图的设计。
2 软件设计用1602LCD显示两行字符的流程图如下所示。
用1602LCD显示“Welcom to China”和“Hi!Good morning!”的详细C51程序如下。
//用LCD循环显示"Welcome to China"和"Hi!Good morning!"#include<reg51.h> //包含单片机的头文件#include<intrins.h> //包含_nop_()函数定义的头文件sbit RS="P2"^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW="P2"^1; //读写选择位,将RW位定义为P2.1引脚sbit E="P2"^2; //使能信号位,将E位定义为P2.2引脚sbit BF="P0"^7; //忙碌标志位,,将BF位定义为P0.7引脚unsigned char code string[ ]={"Welcome to China"};unsigned char code string1[ ]={"Hi!Good morning!"};/*************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒*************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************函数功能:延时若干毫秒入口参数:n******************************/void delay(unsigned char n){unsigned char i;for(i=0;i<n;i++)delay1ms();}/*******************************************函数功能:判断液晶模块的忙碌状态返回值:result。
基于51单片机控制LCD1602液晶屏显示
![基于51单片机控制LCD1602液晶屏显示](https://img.taocdn.com/s3/m/8cec7afb80c758f5f61fb7360b4c2e3f5727251b.png)
基于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);}。
单片机液晶显示(以1602为例)
![单片机液晶显示(以1602为例)](https://img.taocdn.com/s3/m/b4142af9770bf78a65295437.png)
液晶显示(所有程序都经过测试合格)一、基础部分。
(以1602与12864介绍)本部分以液晶1602为主,来引出关于单片机操作液晶的基本知识。
为以后液晶的高级应用打好基础。
Ⅰ、本程序最终目的为:显示一个双行数字,并实现整屏移动。
总的原理图及源程序如下:原理图:液晶电路图\液晶显示.ddb源程序:液晶例程\液晶显示.c#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="I LIKE MCU!";uchar code table1[]="";sbit lcdwr=P2^5;//R/S命令选择端,H/L;sbit lcden=P2^7;//使能端sbit lcdrs=P2^6;//RS数据/命令选择端。
H/L;//sbit dula=P2^6;//sbit wela=P2^7;uchar num;void delay(uint z)//延时程序,z的数是几就是几ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//写命令函数,{lcdrs=0;//写入命令初始化,设置为低电平表示命令选择端。
P0=com; //由时序图可知,在使能en触发时,早就有数据写入。
delay(5); //并且有一段延时,此处设置为5毫秒lcden=1; //使能端开始拉高delay(5); //由时序图,使能端拉低一段时间thD2后,数据传输?lcden=0; //然后将使能端拉低}void write_data(uchar date){lcdrs=1;P0=date;delay(5);//此处延时,是为了对应数据中:在E拉高之前,有数据的一段准备时间。
51单片机好学1602全过程C语言编程显示很全的哦(同名3209)
![51单片机好学1602全过程C语言编程显示很全的哦(同名3209)](https://img.taocdn.com/s3/m/a40d85e83b3567ec102d8afe.png)
教你轻松学51所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。
目前市面上字符液晶绝大多数是基于HD44780 液晶芯片的,控制原理是完全相同的,因此基于HD44780 写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602 通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义HD44780 内置了DDRAM、CGROM 和CGRAM。
DDRAM 就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602 屏幕的第一行第一列显示一个"A"字,就要向DDRAM 的00H地址写入“ A字的代码就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:DDRAM地址与显示位置的对应关系f 1*I*S3H0UH眄H06H07H OSH佃H OAH ABH6CH flDU OEH■Hl!:朝H 41H42H43H44H45H46H i*7H48H却9H4AH却BH毗H却DH ikEH4FH1Ij (事实上我们往DDRAM 里的00H地址处送一个数据,譬如0x31(数字1的代码)并不能显示1出来。
这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM 的01H处显示数据,则必须将01H加上80H即81H。
依次类推。
大家看一下控制指令的的8条:DDRAM地址的设定,即可以明白是怎么样的一回事了)1602 液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A'的代码是01000001B(41H ),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”□RQH 中事科砂押曲宇料其贏对昭舂-wraa上表中的字符代码与我们 PC 中的字符代码是基本一致的。
跟我学51单片机LCD1602液晶显示模块
![跟我学51单片机LCD1602液晶显示模块](https://img.taocdn.com/s3/m/167e104a03020740be1e650e52ea551810a6c9f6.png)
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 还具有背光功能,可以在暗环境下清晰地显示字符。
C51单片机控制1602液晶屏
![C51单片机控制1602液晶屏](https://img.taocdn.com/s3/m/5bee22a4bb4cf7ec4bfed03b.png)
C51单片机用一组I/O口驱动1602液晶屏中国兵器集团北方华锦化学工业股份有限公司热电公司任宝烈此程序利用C51单片机可位寻址寄存器即可以位寻址又可以按字节寻址的特点,实现对1602液晶屏的控制。
11.0592主频时unsigned char bdata C; //在位寻址区定义字符变量Csbit C7=C^7;sbit C6=C^6;sbit C5=C^5;sbit C4=C^4;sbit C3=C^3;sbit C2=C^2;sbit C1=C^1;sbit C0=C^0;sbit RS=P1^1;sbit RW=P1^2;sbit EN=P1^3;sbit I4=P1^4;sbit I5=P1^5;sbit I6=P1^6;sbit I7=P1^7;/****************延时***************/void delay_ms(unsigned int i){unsigned int t;while(i--){for(t=0;t<123;t++);}}/***用LCD1602高四位数据线写入命令**/void write_com(unsigned char command){C=command;RS=0;RW=0;EN=0; //写命令delay_ms(1);I7=C7;I6=C6;I5=C5;I4=C4;EN=1;delay_ms(6); //延时EN=0; //下降沿将数据写入LCD1602 delay_ms(1);I7=C3;I6=C2;I5=C1;I4=C0;EN=1;delay_ms(1); //延时EN=0; //下降沿将数据写入LCD1602 }/**用LCD1602高四位数据线写入数据**/void write_dat(unsigned char dat){C=dat;RS=1;RW=0;EN=0;delay_ms(1);I7=C7;I6=C6;I5=C5;I4=C4;EN=1;delay_ms(6); //延时EN=0;delay_ms(1);I7=C3;I6=C2;I5=C1;I4=C0;EN=1;delay_ms(1); //延时EN=0;}/********LCD1602初始化*************/void LCD_init(void){write_com(0x02);write_com(0x28);write_com(0x0c);write_com(0x80);write_com(0x01); //清屏}/*******设置LCD1602列、行**********/void LCD_sor(unsigned char x,unsigned y){unsigned char address;if(y==0)address=0x80+x;elseaddress=0xC0+x;write_com(address);}/*******************/void LCD_str(unsigned x,unsigned char y,unsigned char *str) {LCD_sor(x,y);while((*str)!='\0'){write_dat(*str);str++;}}。
(完整word版)1602液晶时钟程序(51单片机)
![(完整word版)1602液晶时钟程序(51单片机)](https://img.taocdn.com/s3/m/dd413dee84254b35eefd348b.png)
1602液晶时钟程序程序按郭天袢《新概念51单片机C语言教程》第十四章扩展显示年、月、日、星期调节功能。
1)时间显示在1602液晶上,并按秒实时更新2)能调节按键调整时、分、秒、年、月、日和星期3)每次按键按下时有短滴声响声4)断电后下次上电会接着上次断电前的时间数继续运行原理图如图//原代码如下:#include<reg52.h>//#include"24c02.h"#define uchar unsigned char#define uint unsigned int#include"24c02.h"sbit dula=P2^6;sbit wela=P2^7;sbit LCDEN=P3^4;sbit LCDRS=P3^5;sbit s1=P3^0;//定义按键--功能键sbit s2=P3^1;//定义按键--增大键sbit s3=P3^2;//定义按键--减小键sbit rd=P3^7;//按键公共脚sbit beep=P2^3;//定义蜂鸣器脚uchar count,s1_num;//定义中断次数计数变量功能键按键次数变量uchar week,day,month,year;//定义变量:星期日月年char miao,shi,fen;//定义秒分时变量uchar code table[]=" 2012-11-28 Wed";//void write_week(char we);//显示星期几函数void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void di()//蜂鸣器响一声函数{beep=0;delay(100);beep=1;}void write_com(uchar com) //液晶写命令函数{LCDRS=0;P0=com;delay(5);LCDEN=1;delay(5);LCDEN=0;}void write_date(uchar date) //液晶写数据函数{LCDRS=1;P0=date;delay(5);LCDEN=1;delay(5);LCDEN=0;}void write_week(char we) //写星期几显示函数{write_com(0x80+12);switch(we){case 1: write_date('M');delay(5); //星期一Mondaywrite_date('o');delay(5);write_date('n');delay(5);break;case 2: write_date('T');delay(5); //星期二Tuesdaywrite_date('u');delay(5);write_date('e');delay(5);break;case 3: write_date('W');delay(5); //Wednesdaywrite_date('e');delay(5);write_date('d');delay(5);break;case 4: write_date('T');delay(5); //Thursdaywrite_date('h');delay(5);write_date('u');delay(5);break;case 5: write_date('F');delay(5); //星期五Fridaywrite_date('r');delay(5);write_date('i');delay(5);break;case 6: write_date('S');delay(5); //星期六Saturdaywrite_date('a');delay(5);write_date('t');delay(5);break;case 7: write_date('S');delay(5); //星期日Sundaywrite_date('u');delay(5);write_date('n');delay(5);break;default: break;}}void write_sfm(uchar add,uchar date) //写时分秒函数{uchar shiwei,gewei;shiwei=date/10;gewei=date%10;write_com(0x80+0x40+add);//设置显示位置write_date(0x30+shiwei);//加上0x30是因为数字变成字符串需要加上0x30,看ASCII码值与字符的关系write_date(0x30+gewei);}void write_year_month_day(uchar add,uchar day) //写年月日数函数{uchar shi,ge;shi=day/10;ge=day%10;write_com(0x80+add);//设置显示位置write_date(0x30+shi);//加上0x30是因为数字变成字符串需要加上0x30,看ASCII码值与字符的关系write_date(0x30+ge);}void init() //初始化函数{uchar num;rd=0;beep=1;dula=0;wela=0;LCDEN=0;//将使能端置0以完成高脉冲fen=0;miao=0;shi=0;count=0;//计数初始为0init_24c02();write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口write_com(0x0c);//设置开显示,不显示光标write_com(0x06);//写一个字符后地址指针自动加1write_com(0x01);//显示清0,数据指针清0write_com(0x80); //设置显示初始坐标for(num=0;num<15;num++) //显示年月日{write_date(table[num]);delay(5);}write_com(0x80+0x40+6); //写出时间显示部分的两个冒号write_date(0x3a);delay(5);write_com(0x80+0x40+9);write_date(0x3a);delay(5);miao=read_add(1);//开机上电时读取24c02 IIC的数据赋值fen=read_add(2);shi=read_add(3);week=read_add(4);//读取星期几day=read_add(5);//读取多少日month=read_add(6);year=read_add(7);write_sfm(10,miao);//分别送去液晶显示write_sfm(7,fen);write_sfm(4,shi);write_week(week);//开机从24c02读取的星期几数从新写入液晶显示出来write_year_month_day(9,day);write_year_month_day(6,month);write_year_month_day(3,year);//定时器初始化TMOD=0x01; //设置定时器0工作模式1TH0=(65536-45876)/256; //定时器装初值TL0=(65536-45876)%256;EA=1; //开总中断ET0=1; //打定时器0中断TR0=1; //启动定时器0}void keyscan() //按键扫描函数{if(s1==0){delay(5);if(s1==0){s1_num++; //功能键按下次数记录while(!s1); //按键释放确认di();if(s1_num==1) //只按一次按键时TR0=0; //关闭定时器write_com(0x80+0x40+11);write_com(0x0f); //打开光标闪烁}if(s1_num==2) //第二次按下光标闪烁定位到分钟位置{write_com(0x80+0x40+8);}if(s1_num==3) //第三次按下光标闪烁定位到小时位置{write_com(0x80+0x40+5);}/**************************************if(s1_num==4) //第三四次按下退出{s1_num=0;write_com(0x0c); //取消光标闪栎TR0=1; //启动定时器使时钟开始走}***************************************/if(s1_num==4) //光标处星期{write_com(0x80+14);}if(s1_num==5) //光标处日{write_com(0x80+10);}if(s1_num==6) //光标处月{write_com(0x80+7);}if(s1_num==7) //光标处年{write_com(0x80+4);}if(s1_num==8) //当第八次按功能键时退出光标闪烁及开始计时{s1_num=0;write_com(0x0c); //取消光标闪栎TR0=1; //启动定时器使时钟开始走}}if(s1_num!=0){if(s2==0)//增加键确认按下{delay(5);if(s2==0){while(!s2);di();if(s1_num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+11);write_add(1,miao);}if(s1_num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+8);write_add(2,fen);}if(s1_num==3){shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+5);write_add(3,shi);}if(s1_num==4)//按四次功能键后光标至星期几处,可调节星期几{week++;if(week==8)week=1;write_week(week);write_com(0x80+14); //写一个字符后光标会移一位,所以要重新定义光标位置write_add(4,week);}if(s1_num==5) //光标至显示日处,可调节多少日{day++;if(day==32)day=1;write_year_month_day(9,day);write_com(0x80+10);write_add(5,day);}if(s1_num==6) //光标至显示月处调节月份{month++;if(month==13)month=1;write_year_month_day(6,month);write_com(0x80+7);write_add(6,month);}if(s1_num==7){year++;if(year==100)year=00;write_year_month_day(3,year);write_com(0x80+4);write_add(7,year);}}}if(s3==0) //确认减小键被按下{delay(5);//按键防抖延时if(s3==0) //确认减小键被按下{while(!s3);di();if(s1_num==1){miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+11);write_add(1,miao);}if(s1_num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+8);write_add(2,fen);}if(s1_num==3){shi--;if(shi==-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+5);write_add(3,shi);}if(s1_num==4){week--;if(week==0)week=7;write_week(week);write_com(0x80+14); //写一个字符后光标会移一位,所以要重新定义光标位置write_add(4,week);}if(s1_num==5)//光标至显示日处,可调节多少日{day--;if(day==0)day=31;write_year_month_day(9,day);write_com(0x80+10);//光标位置移回在显示多少日的个位write_add(5,day);}if(s1_num==6) //光标至显示月处调节月份{month--;if(month==0)month=12;write_year_month_day(6,month);write_com(0x80+7);write_add(6,month);}if(s1_num==7){year--;if(year==-1)year=99;write_year_month_day(3,year);write_com(0x80+4);write_add(7,year);}}}}}void main(){init();//首先初始化各数据while(1){keyscan(); //按键扫描函数}}void timer0() interrupt 1 //定时器0中断服务程序{TH0=(65536-45876)/256;TL0=(65536-45876)%256;count++; //中断次数累加,计数if(count==20) //50微秒乘以20等于1秒{count=0;miao++;if(miao==60) //秒加到60则进位分钟{miao=0; //同时秒数清0fen++;if(fen==60) //分钟加到60则进位小时{fen=0; //同时分钟清0shi++;if(shi==24) //小时加到24则小时清0{shi=0;}write_sfm(4,shi);//小时若变化则重新写入write_add(3,shi);//写入24c02存储起来,小时数的写入地址为3 }write_sfm(7,fen);//分钟若变化则重新写入write_add(2,fen);}write_sfm(10,miao);//秒若变化则重新写入write_add(1,miao);}}/***********************************24C02.h头文件,将以下源代码需存为与保存的C代码根目录下。
51单片机1602液晶-(教程)
![51单片机1602液晶-(教程)](https://img.taocdn.com/s3/m/f7a0cf6631b765ce050814d5.png)
51单片机1602液晶接口设计
51单片机的1602液晶
VL- 液晶屏对比度的调节
L命令是对液晶屏显示的设置 H数据是要显示的东西
51单片机的1602液晶
1602液晶的存储器结构
1. DDRAM:
显示数据RAM,用来寄存待显示的字符代码。共80个字 节,其地址和屏幕的对应关系如下图: 要在屏幕上显示字符,只需向相关DDRAM中写入该字符 的ASCII码即可。
1602液晶的存储器结构
2. CGROM:
字符发生存储器,已经存储了160个不同的点阵字符图形, 按ASCII码排列,如下图所示:
51单片机的1602液晶
51单片机的1602液晶
液晶显示
0x38
5
7
51单片机的1602液晶
பைடு நூலகம்
51单片机的1602液晶
51单片机的1602液晶
写命令子函数 命令选择 DB0-DB7 E使能高电平
使能E开
使能E关 写数据子函数 数据选择 DB0-DB7
E使能高电平
使能E开 使能E关
51单片机的1602液晶
字符代码:
0x00~0x0F为用户自定 义的字符图形RAM。
0x20~0x7F为标准的 ASCII码。 0xA0~0xFF为日文字符 和希腊文字符。
1602液晶的存储器结构
3. CGRAM:
用户自定义字符发生存储器,共64字节,地址为 0x00~0x3f,可存储8个5*8点阵图形,其中地址0x00~0x07 存储字符代码为0x00的字符图形,0x08~0x0f存储字符代码 为0x01的字符图形,以此类推。
C51第19课课件1602液晶滚屏显示
![C51第19课课件1602液晶滚屏显示](https://img.taocdn.com/s3/m/07f840d1ad02de80d5d84036.png)
Write_LCD_Command(0x38);
}
DelayMS(1);
void Write_LCD_Command(uchar cmd)
{ RS=0; P0=cmd; EN=1; DelayMS(1); EN=0;
Write_LCD_Command(0x01); DelayMS(1); Write_LCD_Command(0x06); DelayMS(1); Write_LCD_Command(0x0C); DelayMS(1); }
指令7:字符发生器RAM地址设置。
指令8:DDRAM地址设置。
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:写数据。 指令11:读数据。
(7) 1602LCD的一般初始化(复位)
过程
延时15mS 写指令38H(不检测忙信号) 延时5mS 写指令38H(不检测忙信号) 延时5mS 写指令38H(不检测忙信号) 以后每次写指令、读/写数据操作均需要检测忙信号 写指令38H:显示模式设置 写指令08H:显示关闭 写指令01H:显示清屏 写指令06H:显示光标移动设置 写指令0CH:显示开及光标设置
#include<intrins.h>
{
#define uchar unsigned char
RS=1;
#define uint unsigned int
P0=dat;
sbit RS=P2^0;
EN=1;
sbit RW=P2^1;
DelayMS(1);Fra biblioteksbit EN=P2^2;
EN=0;
uchar i;
}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
初始化子函数
0x0e=0 0 0 0.1 1 1 0
0x06=0 0 0 0.0 1 1 0
51单片机的1602液晶
初始化子函数 I LIKE MCU!一共11位
一共13位
1602的光标左右移
51单片机的1602液晶
0X18 左移一下
51单片机的1602液晶
51单片机的1602液晶
51单片机的1602液晶
液晶显示
0x38
5
7
51单片机的1602液晶
51单片机的1602液晶
51单片机的1602液晶
写命令子函数 命令选择 DB0-DB7 E使能高电平
使能E开
使能E关 写数据子函数 数据选择 DB0-DB7
E使能高电平
使能E开 使能E关
51单片机的1602液晶
1602液晶的存储器结构
2. CGROM:
字符发生存储器,已经存储了160个不同的点阵字符图形, 按ASCII码排列,如下图所示:
字符代码:
0x00~0x0F为用户自定 义的字符图形RAM。
0x20~0x7F为标准的 ASCII码。 0xA0~0xFF为日文字符 和希腊文字符。
1602液晶的存储器结构
51单片机的1602液晶
51单片机的1602液晶
1602液晶总结:
(1)写命(4)Main第一行显示,第二行显示, 移动。
3. CGRAM:
用户自定义字符发生存储器,共64字节,地址为 0x00~0x3f,可存储8个5*8点阵图形,其中地址0x00~0x07 存储字符代码为0x00的字符图形,0x08~0x0f存储字符代码 为0x01的字符图形,以此类推。
51单片机的1602液晶
51单片机的1602液晶
void LCD_write_cmd(unsigned char cmd) { LCD_check_busy(); delay(1); LCD_RS = 0; LCD_RW = 0; LCD_DATA = cmd; delay(50); LCD_EN = 1; delay(50); LCD_EN = 0; delay(50); }
51单片机1602液晶接口设计
51单片机的1602液晶
VL- 液晶屏对比度的调节
L命令是对液晶屏显示的设置 H数据是要显示的东西
51单片机的1602液晶
1602液晶的存储器结构
1. DDRAM:
显示数据RAM,用来寄存待显示的字符代码。共80个字 节,其地址和屏幕的对应关系如下图: 要在屏幕上显示字符,只需向相关DDRAM中写入该字符 的ASCII码即可。