精华内容
下载资源
问答
  • 不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。
  • LCD1602液晶显示屏

    2021-03-23 16:06:14
    LCD1602液晶显示屏 1 LCD1602介绍 1.1外部引脚 1.2内部结构 LCD1602内部拥有自己的字模库【CGRAM+CDROM(charactor generator)】,由AC(address count)向DDRAM(data display)中相应的地址中写入数据,找出...

    LCD1602液晶显示屏

    1 LCD1602介绍

    1.1外部引脚

    在这里插入图片描述
    在这里插入图片描述

    1.2内部结构

    在这里插入图片描述
    LCD1602内部拥有自己的字模库【CGRAM+CDROM(charactor generator)】,由AC(address count)向DDRAM(data display)中相应的地址中写入数据,找出字模库中相应数据的的字模,从而映射到屏幕上。
    在这里插入图片描述
    在这里插入图片描述

    1.3操作流程

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    2 LCD编程

    #include <REGX52.H>
    
    sbit LCD_WR=P2^5;
    sbit LCD_RS=P2^6;
    sbit LCD_E=P2^7;
    
    #define LCD_DataPort P0
    
    void LCD_Delay()
    {
    	unsigned char a,b,c;
    	for(c=1;c>0;c--)
    		for(b=142;b>0;b--)
    			for(a=2;a>0;a--);
    }
    
    void LCD_WriteCommand(unsigned char Command)
    {
    	LCD_RS=0;
    	LCD_WR=0;
    	LCD_DataPort=Command;
    	LCD_E=1;
    	LCD_Delay();
    	LCD_E=0;
    	LCD_Delay();
    }
    
    void LCD_WriteData(unsigned char Data)
    {
    	LCD_RS=1;
    	LCD_WR=0;
    	LCD_DataPort=Data;
    	LCD_E=1;
    	LCD_Delay();
    	LCD_E=0;
    	LCD_Delay();
    }
    
    void LCD_Init()
    {
    	LCD_WriteCommand(0x38);
    	LCD_WriteCommand(0x0C);
    	LCD_WriteCommand(0x06);
    	LCD_WriteCommand(0x01);
    }
    
    void LCD_SetCursor(unsigned char Line,unsigned char Column)
    {
    	if(Line==1)
    	{
    		LCD_WriteCommand(0x80|(Column-1));
    	}
    	else
    	{
    		LCD_WriteCommand(0x80|(Column-1)+0x40);
    	}
    }
    
    void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
    {
    	LCD_SetCursor(Line,Column);
    	LCD_WriteData(Char);
    }
    
    void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=0;String[i]!='\0';i++)
    	{
    		LCD_WriteData(String[i]);
    	}
    }
    
    int LCD_Pow(int x,int y)
    {
    	unsigned char i;
    	int result=1;
    	for(i=0;i<y;i++)
    	{
    		result*=x;
    	}
    	return result;
    }
    
    void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned char Number,unsigned char Length)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
    	}
    }
    
    void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
    {
    	unsigned char i;
    	int Number1;
    	LCD_SetCursor(Line,Column);
    	if(Number<0)
    	{
    		LCD_WriteData(0x2d);
    		Number1=-Number;
    	}
    	else
    	{
    		LCD_WriteData(0x2b);
    		Number1=Number;
    	}
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
    	}
    }
    
    void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned char Number,unsigned char Length)
    {
    	unsigned char i;
    	unsigned char SingleNumber;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		SingleNumber=Number/LCD_Pow(16,i-1)%16;
    		if(SingleNumber<10)
    		{
    			LCD_WriteData('0'+SingleNumber);
    		}
    		else
    		{
    			LCD_WriteData('A'+SingleNumber-10);
    		}
    	}
    }
    
    void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned char Number,unsigned char Length)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);
    	}
    }
    
    #include <REGX52.H>
    #include "LCD1602.H"
    
    void main()
    {
    	LCD_Init();
    	LCD_ShowChar(1,1,'A');
    	LCD_ShowString(1,3,"hello");
    	LCD_ShowNum(1,9,66,2);
    	LCD_ShowSignedNum(1,12,-88,2);
    	LCD_ShowHexNum(2,1,0x75,2);
    	LCD_ShowBinNum(2,4,0xA5,8);
    	while(1);
    }	
    

    3 流动屏

    #include <REGX52.H>
    #include "LCD1602.h"
    #include "Delay.h"
    
    void main()
    {
    	LCD_Init();						
    	LCD_ShowChar(1,1,'A');			
    	LCD_ShowString(1,3,"Hello");	
    	LCD_ShowNum(1,9,66,2);			
    	LCD_ShowSignedNum(1,12,-88,2);	
    	LCD_ShowHexNum(2,1,0x75,2);		
    	LCD_ShowBinNum(2,4,0xA5,8);		
    	LCD_ShowChar(2,13,0xDF);
    	LCD_ShowChar(2,14,'C');	
    	while(1)
    	{
    		Delay(100);
    		LCD_WriteCommand(0x18);
    	}
    }	
    

    总结

    从看别人的代码,到看懂,自己在写出来,大毛病没有,小毛病不断,看懂了代码自己不一定写出来,还是得多记忆多练习。

    展开全文
  • 液晶显示屏(LCD)通常用于在计算器、微波炉以及其他类似...本实验中使用的LCD1602液晶显示屏总共有16个引脚。如下表所示,其中有八个引脚是数据线(引脚7-14),两个引脚用于电源和接地(引脚1和16),三个引脚用于...

    液晶显示屏(LCD)通常用于在计算器、微波炉以及其他类似的电子设备中显示数据。您可以很容易地将液晶显示屏(LCD)与Arduino开发板连接,来提供一个用户界面。

    在本篇文章中,我将主要介绍如何在Arduino开发板上使用LCD1602。本实验中使用的LCD1602液晶显示屏总共有16个引脚。如下表所示,其中有八个引脚是数据线(引脚7-14),两个引脚用于电源和接地(引脚1和16),三个引脚用于控制LCD的操作(引脚4-6),一个引脚用于调整LCD屏幕亮度(引脚3)。其余两个引脚(15和16)为背光供电。LCD引脚的详细信息如下:

    实验1

    在这个实验中,我们将16x2 LCD与Arduino Mega 2560连接,并在LCD上显示一些文本。

    这里写图片描述

    更多内容请参考以下链接:https://www.yiboard.com/thread-899-1-1.html

    展开全文
  • LCD1602液晶显示屏的入门级应用(一)

    万次阅读 多人点赞 2018-07-04 16:31:46
    首先,1602液晶显示屏除了电源、地以外,有3个控制引脚 RS R/W E 和8个数据引脚DB0-7。建议8个数据引脚接在同一组上,程序写起来比较简单。硬件连接参考如图。连接上硬件电路,就要写程序了,从名字可以看出来,1602...

    嵌入式小白,今天用到1602,被CGRAM DDRAM CGROM搞得乱七八糟,特此记录一下,供大家参考。

    首先,1602液晶显示屏除了电源、地以外,有3个控制引脚 RS R/W E 和8个数据引脚DB0-7。建议8个数据引脚接在同一组上,程序写起来比较简单。硬件连接参考如图。


    连接上硬件电路,就要写程序了,从名字可以看出来,1602显示两行,每行16个字符,一个字符包含的点阵可以自己设置(后边介绍)。

    首先显示内容分为两种,一种是常用字符,存储在CGROM中,用户可以直接调用,另一种是自定义的字符,比如自己设计的一些奇怪的图形之,存储在CGRAM。当时被这两个名词和DDRAM搞得很乱,这里详细解释一下。

    DDRAM是显示用的,从RAM可以看出来,是读的意思,地址与显示位置如下,每行40个地址,1602只用到前16个,共两行,对应关系如下。



    当我们想在指定位置写入内容时,要先指定地址,如在第一行第一位写入,地址位是00H,再加上DB7的1,即80H(0010000000),第二行第一位是40H,再加上DB7的1,即C0H(0011000000),依次类推。

    LCD的已有的字模存储在CGROM中,自定义的存储在CGRAM,留给自定义的位置只有8个地址,字模地址为01000000-01000111八个地址,也就是最多自定义8个符号或者图形。


    根据这条指令,来写一个摄氏度℃的自定义符号,对应图如下


    字符对应的数组为table【】={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00},将℃写入指定的位置之前,要先把对应数组写入CGRAM存储,再写入DDRAM显示。如果直接用已有的字符,可以直接把数组写入DDRAM显示。

    区分清楚自定义字符和已有字符,程序就简单了。主要步骤是延时函数、写指令、写数据、初始化、主函数。

    下面举两个例子,写入常规字符串12345,写入字符串℃。

    程序一

    #include<reg52.h>    //包含头文件

    #define uint unsigned int  //预定义

    #define uchar unsigned char 

    sbit rs=P2^6;    //1602的数据/指令选择控制线 
    sbit rw=P2^5;        //1602的读写控制线 
    sbit en=P2^7;        //1602的使能控制线 
    /*P0口接1602的D0~D7*/ 
    uchar code table[]="1234";             //要显示的内容放入数组table
    void delay(uint n)       //延时函数                       

        uint x,y;  
        for(x=n;x>0;x--) 
            for(y=110;y>0;y--); 

    void lcd_wcom(uchar com)  //1602写命令函数                 

        rs=0;            //选择指令寄存器 
        rw=0;            //选择写 
        P0=com;            //把命令字送入P2 
        delay(5);            //延时一小会儿,让1602准备接收数据 
        en=1;           //使能线电平变化,命令送入1602的8位数据口 
        en=0; 

    void lcd_wdat(uchar dat)        //1602写数据函数       

        rs=1;        //选择数据寄存器 
        rw=0;        //选择写 
        P0=dat;        //把要显示的数据送入P2 
        delay(5);        //延时一小会儿,让1602准备接收数据 
        en=1;        //使能线电平变化,数据送入1602的8位数据口 
        en=0; 

    void lcd_init()              //1602初始化函数       

        lcd_wcom(0x38);       //8位数据,双列,5*7字形       
        lcd_wcom(0x0c);      //开启显示屏,关光标,光标不闪烁 
        lcd_wcom(0x06);    //显示地址递增,即写一个数据后,显示位置右移一位 
        lcd_wcom(0x01);    //清屏 

    void main()            //主函数 
    {     
        uchar m=0; 
        lcd_init();       //液晶初始化 
        lcd_wcom(0x80);   //显示地址设为80H(即00H,)上排第一位       
        for(m=0;m<4;m++)     //将table[]中的数据依次写入1602显示 
        { 
                lcd_wdat(table[m]);           
                delay(200); 
        } 
        while(1);        //动态停机 


    程序二

    #include<reg52.h>    //包含头文件

    #define uint unsigned int  //预定义

    #define uchar unsigned char 

    sbit rs=P2^6;    //1602的数据/指令选择控制线 
    sbit rw=P2^5;        //1602的读写控制线 
    sbit en=P2^7;        //1602的使能控制线 
    /*P0口接1602的D0~D7*/ 
    uchar code table[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00};             //要显示的内容放入数组table
    void delay(uint n)       //延时函数                       

        uint x,y;  
        for(x=n;x>0;x--) 
            for(y=110;y>0;y--); 

    void lcd_wcom(uchar com)  //1602写命令函数                 

        rs=0;            //选择指令寄存器 
        rw=0;            //选择写 
        P0=com;            //把命令字送入P2 
        delay(5);            //延时一小会儿,让1602准备接收数据 
        en=1;           //使能线电平变化,命令送入1602的8位数据口 
        en=0; 

    void lcd_wdat(uchar dat)        //1602写数据函数       

        rs=1;        //选择数据寄存器 
        rw=0;        //选择写 
        P0=dat;        //把要显示的数据送入P2 
        delay(5);        //延时一小会儿,让1602准备接收数据 
        en=1;        //使能线电平变化,数据送入1602的8位数据口 
        en=0; 

    void lcd_init()              //1602初始化函数       

        lcd_wcom(0x38);       //8位数据,双列,5*7字形       
        lcd_wcom(0x0c);      //开启显示屏,关光标,光标不闪烁 
        lcd_wcom(0x06);    //显示地址递增,即写一个数据后,显示位置右移一位 
        lcd_wcom(0x01);    //清屏 

    void main()            //主函数 
    {     
        uchar m; 

        lcd_init();       //液晶初始化 

        lcd_wcom(0x40);//设定CGRAM地址,把自定义字符存储进去     

        for(m=0;m<8;m++)     //将table[]中的数据依次写入1602显示 
        { 
                lcd_wdat(table[m]);           
                delay(200); 

        } 

        lcd_wcom(0x85);   //显示地址设为85H,上排中间位

        lcd_wdat(0);

        while(1);        //动态停机 


    总结:区分DDRAM和CGRAM,DDRAM是字符对应在屏幕上的位置,CGRAM是把自己定义的字符存在8个字节里,即lcd_wcom(0x40)。

    明天继续研究如何用液晶屏幕显示年月日,待续……

    展开全文
  • 为了进一步了解STC系列单片机,故通过杜洋工作室的1602液晶显示案例进行学习,该文介绍的是对其1602液晶时钟源程序的复现。


    一、简介

      为了进一步了解STC系列单片机,故通过杜洋工作室的1602液晶显示案例进行学习,该文介绍的是对其1602液晶屏时钟源程序的复现。
    实验结果图

    二、硬件准备

    1、元器件清单

    品名 型号 数量
    单片机 STC12C2052 1
    显示屏 LCD1602 1
    USB转TTL CH340G 1
    电位器 B10K 1
    面包板 MB-102 1
    晶振 12MHZ 1
    电容 30pf 2

    2、引脚接线

    在这里插入图片描述
      接线方式与上图略有不同,其实就是在V0口加了一个电位器来控制屏幕的灰度。

    STC12C2052 LCD1602 电位器
    P1.0—P1.7 D0—D7 *
    GND LED_K *
    VCC VCC *
    INT0/P3.2 RS *
    INT1/P3.3 RW *
    P3.4 E *
    * VSS 1
    * V0 2

    三、软件准备

      目前该程序实现的时钟是固定的,如果想进一步改成实时的话,还需要另加上DS1302时钟芯片进行辅助,或者是通过利用_DATE_和_TIME_宏在keil中添加编译日期和时间到C51程序中,不过该方法暂未验证,有兴趣的朋友可以自行验证交流。

    /********************************************************************************************
    程序名:    1602液晶屏时钟程序
    编写人:    杜洋 
    编写时间:  2009年7月6日
    硬件支持:  LCD1602液晶屏  STC12C2052 外部12MHZ晶振 
    说明备注:    使用2402液晶屏程序,与1602液晶屏程序完全兼容
    /********************************************************************************************/
    #include <AT89X52.h>						// 包含头文件 //
    #include <REGX52.H>
    
    /********************************************************************************************/
    typedef unsigned char      uint8;          // 无符号8位整型变量 //
    
    /********************************************************************************************
    // 引脚定义 // (使用者根据实际更改)
    /********************************************************************************************/
    #define		LCM2402_DB0_DB7		P1			// 定义LCM2402的数据总线
    sbit LCM2402_RS   = P3 ^ 2;					// 定义LCM2402的RS控制线
    sbit LCM2402_RW   = P3 ^ 3;					// 定义LCM2402的RW控制线
    sbit LCM2402_E    = P3 ^ 4;					// 定义LCM2402的E控制线
    sbit LCM2402_Busy = P1 ^ 7;					// 定义LCM2402的测忙线(与LCM2402_DB0_DB7关联)
    data unsigned char TIME_DD,TIME_MO,TIME_YY,TIME_WW,TIME_HH,TIME_MM,TIME_SS;//设置日、月、年、周、时、分、秒和温度存放区
    data bit DAY_BIT = 0;//天数增加标志位(用于日期进位的启动)
    data unsigned char DIS_BIT = 0; //多种信息的切换显示
    data unsigned char cou  = 0;     // 软计数器,对10ms时基信号累加到1s 
    /********************************************************************************************
    // 定义LCM2402指令集 // (详细请见技术手册)
    /********************************************************************************************/
    #define			CMD_clear		0x01             // 清除屏幕
    #define			CMD_back		0x02             // DDRAM回零位
    #define			CMD_dec1		0x04             // 读入后AC(指针)减1,向左写
    #define			CMD_add1		0x06             // 读入后AC(指针)加1,向右写
    #define			CMD_dis_gb1		0x0f             // 开显示_开光标_开光标闪烁
    #define			CMD_dis_gb2		0x0e             // 开显示_开光标_关光标闪烁
    #define			CMD_dis_gb3		0x0c             // 开显示_关光标_关光标闪烁
    #define			CMD_OFF_dis		0x08             // 关显示_关光标_关光标闪烁
    #define			CMD_set82		0x38             // 8位总线_2行显示
    #define			CMD_set81		0x30             // 8位总线_1行显示(上边行)
    #define			CMD_set42		0x28             // 4位总线_2行显示
    #define			CMD_set41		0x20             // 4位总线_1行显示(上边行)
    #define			lin_1			0x80             // 4位总线_1行显示(上边行)
    #define			lin_2			0xc0             // 4位总线_1行显示(上边行)
    
    /********************************************************************************************
    // 读LCM忙程序 [底层协议] // (所有底层协议都无需关注)
    // LCM2402测忙,若LCM2402处于忙状态,本函数将等待至非忙状态 //
    /********************************************************************************************/
    void LCM2402_TestBusy(void){
       	LCM2402_DB0_DB7 = 0xff;		//设备读状态
       	LCM2402_RS = 0;
       	LCM2402_RW = 1;
       	LCM2402_E = 1;
       	while(LCM2402_Busy);		//等待LCM不忙
       	LCM2402_E = 0;				//
    }
    /********************************************************************************************
    // 写指令程序 //
    // 向LCM2402写命令 本函数需要1个指令集的入口参数 //
    /********************************************************************************************/
    void LCM2402_WriteCMD(uint8 LCM2402_command) { 
      	LCM2402_TestBusy();
      	LCM2402_DB0_DB7 = LCM2402_command;
      	LCM2402_RS = 0;
      	LCM2402_RW = 0;
      	LCM2402_E = 1;
      	LCM2402_E = 0;
    }
    /********************************************************************************************
    // 写数据程序 //
    // 向LCM2402写数据 //
    /********************************************************************************************/
    void LCM2402_WriteData(uint8 LCM2402_data){ 
        LCM2402_TestBusy();
    	LCM2402_DB0_DB7 = LCM2402_data;
      	LCM2402_RS = 1;
      	LCM2402_RW = 0;
      	LCM2402_E = 1;
      	LCM2402_E = 0;
    }
    /********************************************************************************************
    // 打印字符串程序 // (本函数调用指针函数)
    // 向LCM发送一个字符串,长度48字符之内 
    // 第一行位置 0x00~0x17  第二行位置 0x40~0x57 
    // 应用举例:print(0x80,"doyoung.net"); //在第一行第一位处从左向右打印doyoung.net字符串
    /********************************************************************************************/
    void print(uint8 a,uint8 *str){
    	LCM2402_WriteCMD(a | 0x80);
    	while(*str != '\0'){
    		LCM2402_WriteData(*str++);
    	}
    	*str = 0;
    }
    /********************************************************************************************
    // 打印单字符程序 // 
    // 第一行位置 0x00~0x17  第二行位置 0x40~0x57 
    // 向LCM发送一个字符,以十六进制(0x00)表示 
    // 应用举例:print(0xc0,0x30); //在第二行第一位处打印字符“0”
    /********************************************************************************************/
    void print2(uint8 a,uint8 t){
    		LCM2402_WriteCMD(a | 0x80);
    		LCM2402_WriteData(t);
    }
    /********************************************************************************************
    // 定义小汉字 //
    // 可写入8个自字义字符,写入后可用其CGRAM代码直接提取显示。
    // 字符定义方法请参考技术手册 
    /********************************************************************************************/
    uint8 code Xword[]={
        0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,        //℃,代码 0x00
        0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,        //一,代码 0x01
        0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,        //二,代码 0x02
        0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,        //三,代码 0x03
        0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,        //四,代码 0x04
        0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,        //五,代码 0x05
        0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x06
        0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,        //日,代码 0x07
    };
    void CgramWrite(void) {	// 装入CGRAM //
        uint8 i;
    	LCM2402_WriteCMD(0x06);			// CGRAM地址自动加1
    	LCM2402_WriteCMD(0x40);			// CGRAM地址设为00处
        for(i=0;i<64;i++) {
        	LCM2402_WriteData(Xword[i]);// 按数组写入数据
        }
    }
    /********************************************************************************************
    // LCM2402初始化 //(使用者可自定义,加 * 号程序行必须保留但可修改)
    /********************************************************************************************/
    void LCM2402_Init(void){
      	LCM2402_WriteCMD(CMD_set82);	//* 显示模式设置:显示2行,每个字符为5*7个像素
      	LCM2402_WriteCMD(CMD_clear);	//  显示清屏
      	LCM2402_WriteCMD(CMD_back);		//* 数据指针指向第1行第1个字符位置
      	LCM2402_WriteCMD(CMD_add1);		//  显示光标移动设置:文字不动,光标右移
      	LCM2402_WriteCMD(CMD_dis_gb3); 	//  显示开及光标设置:显示开,光标开,闪烁开
    	CgramWrite();					//  向CGRAM写入自定义字符
    }
    /********************************************************************************************/
    //			以上是LCM2402驱动程序			//
    /*********************************************************************************************/
    
    /*********************************************************************************************/
    bit IsLeapYear(void){    //计算本年是否是润年 
    	unsigned int a;
    	a = 2000+TIME_YY;//加2000表示成完整的年
    	if((a%4==0 && a%100!=0)||(a%400==0)){ //润年的计算公式
    			return 1;//是润年返回1 
    		}else{ 
     			return 0;//不是润年返回0 
    		}
    } 
    /**********************************************************************************************/	
    void month_day(void){  
    	unsigned char mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31};
    	TIME_DD++;//天加1
    	TIME_WW++;//星期值加1
    	if(TIME_WW > 7){
    		TIME_WW = 1;//时期值限定
    	}
    	if(TIME_DD > mon_day[TIME_MO-1]){//检查天是否大于当月的最大值
    		if(IsLeapYear()&&TIME_MO==2){ //计算本月是否是润年的2月份 
    			TIME_DD = 29;//如果是润年又是2月,则天为29
    		}else{
    			TIME_DD = 1; //否则就等于1
    			TIME_MO++;//月加1
    			if(TIME_MO > 12){
    				TIME_MO = 1; //如果月大于12则月等于1
    				TIME_YY++;//年加1 (公历年无限积加)
    			}
    		}
    	}
    } 
    /**********************************************************************************************/	
    void init (void){ //上电初始化
    	TMOD = 0x11;         // 定时/计数器0,1工作于方式1   
        TH0 = 0x3c;          // 预置产生50ms时基信号   
        TL0 = 0xb0;   
        EA = 1;              // 开总中断   
        ET0 = 1;             // 定时/计数器0允许中断   
        TR0 = 1;             // 开闭定时/计数器0   
    
    	TIME_DD = 22; //时间在首次使用的值,之后会在EEPROM自动记录上一天的值
    	TIME_MO	= 3; //初始时间:2009年5月18日周一,20时13分40秒
    	TIME_YY = 21;
    	TIME_WW = 5;
    	TIME_HH	= 0;
    	TIME_MM = 0;
    	TIME_SS = 0;
    }
    /********************************************************************************************
    //显示项目 时间部分 在第一行全行显示时间
    *********************************************************************************************/    
    void RealTime_Display(void){
    	    print(0x80,"20");
    	    print2(0x82,TIME_YY/10+0x30);
    	    print2(0x83,TIME_YY%10+0x30);
    		print(0x84,"/");            // 显示年
    		//
    	    print2(0x85,TIME_MO/10+0x30);
    	    print2(0x86,TIME_MO%10+0x30);
    		print(0x87,"/");            // 显示月
    		//
    	    print2(0x88,TIME_DD/10+0x30);
    	    print2(0x89,TIME_DD%10+0x30);
    
    		print(0x8b,"[");            // 显示[
    		print2(0x8c,TIME_WW%10); //星期
    		print(0x8d,"]");            // 显示]
    
    	    print2(0x40,TIME_HH/10+0x30);//小时
    	    print2(0x41,TIME_HH%10+0x30);
    		print(0x42,":");            // 显示cgram第一个字模":"
    		//
    	    print2(0x43,TIME_MM/10+0x30);//分钟
    	    print2(0x44,TIME_MM%10+0x30);
    		print(0x45,".");            // 显示cgram第一个字模"."
    		//
    	    print2(0x46,TIME_SS/10+0x30);//秒
    	    print2(0x47,TIME_SS%10+0x30);
    		//
    }
    /********************************************************************************************/
    // 测试用函数 //
    void main (void){
    	init();//初始化                           
    	LCM2402_Init();//LCM2402初始化                           
    	while(1){ //主线程// 
    		RealTime_Display();    	
    		//print(0x80,"DoYoung Studio"); //在第一行第一位处从左向右打印doyoung.net字符串
    		//print(0x40,"www.DoYoung.net"); //在第一行第一位处从左向右打印doyoung.net字符串
    
    		if(DAY_BIT == 1){ //检查天数是否更新,是则计算公历
    			month_day();//计算公历日期	
    			DAY_BIT = 0;//计算完成后将日期变更标志位置0
    		}
    	}
    }
    /********************************************************************************************/    
    void tiem0(void) interrupt 1{   // T/C0中断服务程序(产生50ms时基信号)   
        cou++;                      // 软计数器加1   
        if(cou > 19){                 // 计数值到100(1s)   
            cou = 0;               // 软计数器清零   
            TIME_SS++;                 // 秒计数器加1(进位10ms*100=1s)   
            if(TIME_SS > 59){          // 秒计数值到60   
               
                TIME_SS = 0;           // 秒计数器清零   
                TIME_MM++;             // 分计数器加1(进位60s=1m)  
                if(TIME_MM > 59){      // 分计数到60   
                    TIME_MM = 0;       // 分计数器清零   
                    TIME_HH++;         // 时计数器加1(进位60m=1h)   
                    if(TIME_HH > 23){  // 时计数到23   
                        TIME_HH = 0;   // 时计数器清零
    					DAY_BIT = 1;	//天增加标志位 
    				}  
                }   
            }   
        }   
        TH0 = 0x3c;                // 重置定时常数   
        TL0 = 0xb0;   
    }
    /*********************************************************************************************/
    
    /*************************************************************
    * 杜洋工作室 DoYoung Studio
    * 与电子爱好者同行 www.DoYoung.net
    /*************************************************************/
    

    四、遇到的问题

    1、显示屏黑块遮盖住了显示内容

      这其实就是液晶显示的偏压过低导致,只需要在V0口处外接一个电位器进行调节即可,加接地电阻也可行,但是不能确定具体加多大的电阻合适,所以还是接电位器比较方便。
    在这里插入图片描述

    展开全文
  • 这里用到的时钟是DS1302,先给大家介绍一下DS1302。下图分别是典型电路图和寄存器,这个程序要分三个.C文件,分别是ds1302.c,lcd.c,main.c。 (一)ds1302.c,这部分函数一般都是固定的,可以直接拿去用,分...
  • 单片机外设LCD1602液晶屏介绍

    万次阅读 多人点赞 2017-06-04 22:09:59
    CrystalDisplay):液晶显示器的缩写,一种被动式的显示器,即液晶本身并不发光,而是经液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。   液晶显示器具有功耗低、抗干扰能力强...
  • LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
  • 本文介绍LCD1602显示屏,并在LCD1602上显示字符串,对LCD1602常见的问题的解决和开发方法也做了简单介绍。 详细 代码下载:http://www.demodashi.com/demo/14741.html 一、LCD1602 LCD1602是一...
  • 本文旨在介绍单片机入门的基础知识,为初接触或即将接触单片的新手提供一个入门指导。本文章会陆续推出,隔几天一个章节。所使用单片机为ATMEL公司的AT89C52,软件为PROTEUS和KEIL;...本部分主要介绍1602液晶显示
  • 由于52单片机能处理的频率信号强度有限,所以这次我们先用74HC390芯片对输入的信号进行了分频,使其降低了100倍,才送去给单片机处理,而且为了使1602液晶显示屏能更好的兼容,在程序上我们做了三次初始化。...
  • LCD12864液晶显示

    2020-07-16 23:15:56
    LCD1602是一种字符型液晶显示模块能显示字母、数字以及一般性符号,16值得是一行16个字节(128列),2指的是两行。LCD12864由128列64行组成,分为左右(单屏为64行*64列)。它有带字库和不带字库两种,这里只介绍...
  • LCD1602 是一款最常用也是最便宜的液晶显示屏,由于内部没有汉字库,在界面和数据显示时,只能显 示英文单词,对使用者要求较高,很不方便。本文介绍LCD1602 内部存储器,利用厂家留给用户自己定义点阵型显 示...
  • 基于Arduino+LCD1602的实时时钟设计

    千次阅读 2020-06-14 23:00:10
    设计者:STCode(公众号同名) 1、实时时钟功能介绍 ...LCD1602液晶显示屏 DS1302 时钟模块 红外传感器模块 杜邦线 3、电路设计 Arduino DS1302 +3.3V GND +3.3V GND D2 RST D3 DAT
  • PCF8574AT驱动LCD1602

    2020-10-15 14:13:31
    网上寻遍了资料发现驱动LCD1602液晶屏的程序几乎都是4线或8线数据线。基本思路都是直接操作I/O,但是缺点是接线太多,十分麻烦。PCF8574和PCF8574AT这两种芯片都是IIC芯片,可以将并行的八根数据线转换只用两根数据...
  • LCD1602学习笔记

    2020-03-03 14:48:44
    LCD1602是一款由HD44780驱动的液晶显示屏,可一次性显示2×162\times162×16个字符,每个字符为5*7的点阵。 详细介绍看这里,非常完整 和其他的元器件一样,在使用时,需要先对其进行初始化,即根据时序图对其进行...
  • arduino使用i2c接口的1602液晶屏的问题

    千次阅读 2019-05-04 13:48:05
    我用arduino使用i2c接口的液晶屏是出现了按键一按,程序就卡在显示那个地方了。下面我详细介绍下。 首先,你得安装相关库,如下图所示: 然后,可以在示例里面选择相关的例程,如下: 下面我说一下我遇到的...
  • LCD1602是我们常用的一种显示屏,一直想写一些关于元器件的介绍和使用。今天就来从LCD1602开始。 LCD1602介绍名字含义引脚说明特性字符集程序编写例子(显示两行内容)效果图 介绍 名字含义 LCD1602名字中16代表一行...
  • LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD...
  • 一、介绍    众所周知,虽然液晶显示器和其他...   字符型液晶显示模块是由字符型液晶显示屏LCD 、控制驱动主电路HD44780/KS0066及其扩展驱动电路HD44100或与其兼容的IC, 少量阻、容元件结构件等装配在PCB板上
  • 它的驱动和LCD1602很像,甚至,读忙、写指令和写数据函数都是一样的,就初始化不一样,因为指令系统不同嘛!下面是我手头字库液晶的实物图。  字库型液晶显示可以分为串行方式和并行方式两种,通过引脚PSB进行...
  • 本设计介绍1602液晶显示器(2行16字节)控制板设计资料,该1602液晶显示器Arduino 控制板可供用户作为LCD显示屏的菜单选择按键或者操控按键使用。对于Arduino初学者来说,不必为繁琐复杂液晶驱动电路连线而头疼了...
  • 它的驱动和LCD1602很像,甚至,读忙、写指令和写数据函数都是一样的,就初始化不一样,因为指令系统不同嘛!下面是我手头字库液晶的实物图。  字库型液晶显示可以分为串行方式和并行方式两种,通过引脚PSB进行...
  • 这篇文章主要关于如何控制液晶显示,并在此基础上加上定时器的功能,把原来已用数码管显示的定时器搬到液晶上来。 这里用到的液晶为LCD1602,能够同时显示16x02即32个字符(16列2行)。1602液晶模块内部的字符...
  • 实验器材: 1.装有arduino IDE笔记本一台。 2.dht11温湿度感应器。 3.1602液晶显示器。 ...首先先来看看1602液晶显示器和dht11的工作原理 ...引脚参考LCD1602的官网介绍。 dht11: 产品名:温湿...
  • 2018科协硬件方向培训--显示屏部分

    千次阅读 2018-04-02 15:18:35
    显示屏LCD介绍 液晶显示器(LCD)的主要原理是以电流刺激液晶分子产生点,线,面并配合背部灯管构成画面。 各种型号的液晶通常按照显示字符的行数或液晶点阵的行,列数来命名。比如:1602的意思是每行显示16个...
  • 我们大多数人都比较熟悉1602点阵液晶显示屏,它在许多项目中用于向用户显示一些信息。但是这些LCD显示器在他们能做的事情上有很多限制。在本篇文章中,我们将使用OLED显示Android智能手机的一些基本信息,如时间、...
  • LCD学习

    2018-10-27 19:18:00
    LCD简介(1)显示器,常见显示器(2)LCD(Liquid Crystal Display),液晶显示器,原理介绍(3)LCD应用领域(4)LED OLED1.17.1.2、电子显示器的原理(1)像素(分辨率)(2)显存,用来做显示的内存(3)字模(4)字库(5)控制器和驱动...
  • 本文中详细表现了此系统所设计的硬件的结构和工作原理,主要包括STM32单片机、LCD1602液晶显示屏和单片机的定时/计数器、红外模块、语音模块、GSM通信。其次,介绍了本系统中实际电路的模块化设计和软件逻辑调试的...
  • 2.LCD1602液晶显示屏电路 3.四路独立按键 4.DS1302时钟电路 5.DS18B20温度传感器 6.系统电源 二.lcd1602介绍 1.引脚定义 VL引脚:为液晶显示器对比度调整端 RS引脚:RS为寄存器选择,高电平时选择数据寄存器、低电...

空空如也

空空如也

1 2 3
收藏数 44
精华内容 17
关键字:

lcd1602液晶显示屏介绍