首页 > 其他分享 >51单片机基础04 LCD1602时序;Proteus仿真单片机、总线、网络标号等;

51单片机基础04 LCD1602时序;Proteus仿真单片机、总线、网络标号等;

时间:2024-11-15 11:16:00浏览次数:3  
标签:busy 04 RS 写入 51 Write 单片机 LCD1602 com

目录

一、LCD显示字符

1、写指令

(1)、LCD状态配置

(2)、显示开关与光标

2、写数据

(1)、设置地址

(2)、设置数据

3、初始化代码

(1)、初始化流程

(2)、初始化代码

4、数据显示

(1)、地址写入

(2)、数据写入

二、按键控制LED流水灯-总线与网络标号

1、原理图

2、代码


一、LCD显示字符

        打开LCD1602的控制时序图,其采用了HD44780及兼容芯片,可以看到:

        当然一般对LCD,我们都是写指令和写输入,可以先不看读的部分,注意到写指令和写数据最重要的就是RS控制进行区分。

1、写指令

(1)、LCD状态配置

        看手册关于指令码,常用的有4.1.1,00111000=0x38;

(2)、显示开关与光标

        显示开、关与光标设置,一般如果不进行输入操作的时候不显示光标,而在每次上电的时候,最好先设置关显示,进行清屏后再打开,因此一般为00001100/00001000即0X0C/0X08;

2、写数据

(1)、设置地址

        可以看到通过输入80H+地址码设置好要写的地方,即对应上面的图。

(2)、设置数据

3、初始化代码

(1)、初始化流程

        手册也提供了一个比较好的初始化流程:

(2)、初始化代码

void LCD1602_init(void)
{ 
     Delay1602(1500);               //调用延时函数
     LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
     Delay1602(500);                //调用延时函数
     LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
     Delay1602(500);                //调用延时函数
     LCD1602_Write_com(0x38);       //8位数据总线,两行显示模式,5*7点阵显示
     LCD1602_Write_com_busy(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
     LCD1602_Write_com_busy(0x08);  //显示功能关,无光标
     LCD1602_Write_com_busy(0x01);  //清屏
     LCD1602_Write_com_busy(0x06);  //写入新的数据后,光标右移,显示屏不移动
     LCD1602_Write_com_busy(0x0C);  //显示功能开,无光标
} 

        相关的寄存器设置都在上面进行了清晰的展示。

前面说到写数据需要检测忙或者不检测,因此需要进行两个代码进行展示

①不忙写入

//1602液晶相关I/O设置
sbit E=P2^3;               //1602液晶的E脚接在P2.3口上
sbit RW=P2^4;              //1602液晶的RW脚接在P2.4口上
sbit RS=P2^5;              //1602液晶的RS脚接在P2.5口上
//写指令 不检测忙信号
void LCD1602_Write_com(unsigned char combuf)
{ 
     RS=0;                //选择指令寄存器
     RW=0;                //选择写状态
     P0=combuf;           //将命令字通过P0口送至DB
     E=1;                 //E高电平将命令字写入1602液晶
     E=0;                 //写完以后,恢复E的电平
} 

②忙检测

void LCD1602_busy(void)
{ 
     P0_7=1;              //将P0.7置1,为读状态做准备 
     RS=0;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
     RW=1;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
     E=1;                 //RS=0、RW=1、E=1时,忙信号输出到DB7,由P0.7读入
     while(P0_7==1);      //由P0.7读入1,表示1602液晶忙,需要等待
	                       //单片机处理完当前任务,忙信号P0_7自动置0(无效),即不忙
     E=0;                 //读完以后,恢复E的电平
} 

        本质上忙检测就是检测那个IO是否被LCD置位0。

4、数据显示

(1)、地址写入

void LCD1602_Write_address(unsigned char x,unsigned char y)
{ 
     x&=0x0f;             //列地址限制在0-15间
     y&=0x01;             //行地址限制在0-1间
     if(y==0)             //如果是第一行
         LCD1602_Write_com_busy(x|0x80);        //将列地址写入
     else                 //如果是第二行
         LCD1602_Write_com_busy((x+0x40)|0x80); //将列地址写入
			                 //x列数加上0x40是要从第二行的40的存储单元算起。1602共2行(每行40个存储单元)
} 

        前文提到,需要地址码+0X80,在数据语言中,|可以用来表示加法,但是如果直接用0-27、40-67在用户态很麻烦,因此一般用户端就写具体的行列,加地址在bsp驱动层完成。

(2)、数据写入

        直接调用LCD1602_Write_data_busy即可,写入的就是char字符,如果要多次显示,则多次调用即可。

LCD1602_Disp(0,0,DISbuf/100+'0');      //在第1行的第1列显示百位
LCD1602_Disp(1,0,(DISbuf%100)/10+'0'); //在第1行的第2列显示十位
LCD1602_Disp(2,0,DISbuf%10+'0');       //在第1行的第3列显示个位

二、按键控制LED流水灯-总线与网络标号

1、原理图

        可以看到本次采用了一个总线方式的连接,同时放置了网络标号。

        通过此总线可以放置蓝色的线,点击放置连线标号,输入字符串例如t1、再点击另一端也输入t1,即可实现该两端连接。

2、代码

#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
//延时
void DelayMS(uint x)
{
	uchar i;
	while(x--)
	{
		for(i=0;i<120;i++);
	}
}
//主程序
void main()
{
	uchar i;
	P2=0x01;
	while(1)
	{
		for(i=0;i<7;i++)
		{
			P2=_crol_(P2,1); //P2的值向左循环移动
			DelayMS(150);
		}
		for(i=0;i<7;i++)
		{
			P2=_cror_(P2,1); //P2的值向右循环移动
			DelayMS(150);
		}
	}
}

标签:busy,04,RS,写入,51,Write,单片机,LCD1602,com
From: https://blog.csdn.net/qq_39376872/article/details/143789124

相关文章

  • ubuntu22.04离线部署k8s1.28.2(随笔)
    一、准备环境(所有服务器)1.各服务器设置hosts192.168.137.100k8s-master192.168.137.101k8s-node1192.168.137.102k8s-node2hostnameset-hostname k8s-masterhostnameset-hostname k8s-node1hostnameset-hostname k8s-node12。时间同步自己想办法3.lvs环境(暂定)mo......
  • Exchange 2016部署实施案例篇-04.Ex基础配置篇(下)
    上二篇我们对全新部署完成的ExchangeServer做了基础的一些配置,今天继续基础配置这个话题。DAG配置先决条件首先在配置DGA之前我们需要确保DAG成员服务器上磁盘的盘符都是一样的,大小建议最好也相同。 其次我们需要确保有一块网卡用于数据复制使用(PS:单块网卡也可以......
  • 读数据质量管理:数据可靠性与数据质量问题解决之道04收集与清洗
    1.      收集数据1.1.        数据收集和清洗是生产管道中的第一步1.1.1.          数据转换和测试则在生产管道中解决数据质量问题1.2.        在收集数据时,管道的任何地方可能都没有入口点重要,因为入口点是任何数据管道中最上游的位......
  • [oeasy]python0041_输出ASCII码表_英文字符编码_键盘字符_ISO_646
    输出ASCII码表_英文字符编码_键盘字符_ISO_646回忆上次内容上次输出了从0到122序号对应的所有字符 fornuminrange(123):print(num,chr(num),sep=":")字符类型包括数字大小写字母符号   添加图片注释,不超过14......
  • #渗透测试#SRC漏洞挖掘#蓝队基础之网络七层杀伤链04 终章
    网络杀伤链模型(KillChainModel)是一种用于描述和分析网络攻击各个阶段的框架。这个模型最初由洛克希德·马丁公司提出,用于帮助企业和组织识别和防御网络攻击。网络杀伤链模型将网络攻击过程分解为多个阶段,每个阶段都有特定的活动和目标。通过理解和监控这些阶段,防御者可以更有......
  • 【洛谷】P1047 [NOIP2005 普及组] 校门外的树
    题目描述某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1 米。我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 l 的位置;数轴上的每个整数点即 0,1,2,…,l都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数......
  • 51单片机入门教程——LED闪烁实验
    要想实现LED闪烁,其实操作很简单,只需要循环让D1指示灯先亮一会后熄灭。这里就涉及一个延时问题,我们知道单片机执行每一条代码指令都是需要时间的,因此只需要编写一循环函数,让CPU不干其他事,专门在那循环运行即可实现延时功能。延时函数如下:voiddelay_10us(u16ten_us){wh......
  • 51单片机入门教程——点亮第一个LED灯
    LED即发光二极管,具有单向导电性,通过5mA左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管。开发板上LED模块电路如下图所示:通过上图可以看出D1-D8连接单片机上的P20-P27口。图中LED采用共阳接法,即所有LED阳极管脚接电源VCC,阴极管脚通过一个471欧的限流电阻接到P2......
  • 代码随想录算法训练营day46| 647. 回文子串 516.最长回文子序列
    学习资料:https://programmercarl.com/0647.回文子串.html#算法公开课动态规划最后一部分:回文字符串子串是从原字符串中连续截取的;子序列可以是从原字符串中不连续提取出元素构成的学习记录:647.回文子串(难构造dp数组,dp数组是从原字符串截取[i,j]范围的片段是否是回文字符串,布尔......
  • 深入浅出学算法044-最大整数
    题目描述设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。      例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213      又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613输入输入分2行第一行是n第2行是n个整数输出连接成的多位数......