提示:今天是学习51单片机的第十一天,以下就是今天的笔记(我买的是普中的开发板,学习笔记是根据普中的视频进行学习)今天学习的内容是液晶 IO扩展(并转串)和485通信。
目录
LCD1602 液晶显示实验
我们已经学习过几种显示装置,例如静态数码管、动态数码管、 8*8LED 点阵、串口通信。使用它们可以直观显示一些字符数据,但是它们也有各种局限性,比如显示字符数据太少,硬件设计复杂、代码编写难度大等。我们开发板上集成了一个 LCD1602 液晶显示器接口,将 LCD1602 液晶对应插入即可。内容如下:
- 1.LCD1602 介绍
- 2.硬件设计
- 3.软件设计
1.LCD1602 介绍
1602 液晶也叫 1602 字符型液晶,它能显示 2 行字符信息,每行又能显示 16 个字符。它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若 干个 5x7 或者 5x10 的点阵字符位组成,每个点阵字符位都可以用显示一个字符, 每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作 用,正因为如此,所以它不能很好的显示图片。
3 脚:VL,液晶显示偏压信号,用于调整 LCD1602 的显示对比度,一般会外 接电位器用以调整偏压信号,注意此脚电压为 0 时可以得到最强的对比度。
4 脚:RS,数据/命令选择端,当此脚为高电平时,可以对 1602 进行数据字 节的传输操作,而为电平时,则是进行命令字节的传输操作。命令字节,即是用来对 LCD1602 的一些工作方式作设置的字节;数据字节,即使用以在 1602 上显 示的字节。值得一提的是,LCD1602 的数据是 8 位的。
5 脚:R/W,读写选择端。当此脚为高电平可对 LCD1602 进行读数据操作, 反之进行写数据操作。
6 脚:E,使能信号,其实是 LCD1602 的数据控制时钟信号,利用该信号的 上升沿实现对 LCD1602 的数据传输。
7~14 脚:8 位并行数据口,而 51 单片机一组 IO 也是 8 位,使得对 LCD1602 的数据读写大为方便。
在 LCD1602 内部含有 80 个字节的 DDRAM,它是用来寄存显示字符的。不是所有的地址都可以直接用来显示字符数据,只有第一行中 的 00-0F,第二行中的 40-4F 才能显示,其地址和屏幕的对应关系如下表
1.2 LCD1602 常用指令
(1)清屏指令
功能: 清除液晶显示器,即将 DDRAM 的内容全部填入"空白"的 ASCII 码 20H; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(AC)的值设为 0。
(2)模式设置指令
功能: 设定每次写入 1 位数据后光标的移位方向,并且设定每次写入的一个字符是 否移动。 I/D:0=写入新数据后光标左移 1=写入新数据后光标右移 S:0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移 1 个 字符
(3)显示开关控制指令
功能: 控制显示器开/关、光标显示/关闭以及光标是否闪烁。 D:0=显示功能关 1=显示功能开 C:0=无光标 1=有光标 B:0=光标闪烁 1=光标不闪烁 358
(4)功能设定指令
功能: 设定数据总线位数、显示的行数及字型。 DL:0=数据总线为 4 位 1=数据总线为 8 位 N:0=显示 1 行 1=显示 2 行 F:0=5×7 点阵/每字符 1=5×10 点阵/每字符。
1.3 LCD1602 使用
要使用 LCD1602,首先需要对其初始化,即通过写入一些特定的指令实现。 然后选择要在 LCD1602 的哪个位置显示并将所要显示的数据发送到 LCD 的 DDRAM。使用 LCD1602 通常都是用于写数据进去,很少使用读功能。LCD1602 操 作步骤如下所示:
(1)初始化 (2)写命令(RS=L),设置显示坐标 (3)写数据(RS=H)
在此,不需要读出它的数据的状态或者数据本身。所以只需要看两个写时序:
①当要写指令字,设置 LCD1602 的工作方式时:需要把 RS 置为低电平,RW 置为低电平,然后将数据送到数据口 D0~D7,最后 E 引脚一个高脉冲将数据写入。 ②当要写入数据字,在 1602 上实现显示时:需要把 RS 置为高电平,RW 置为 低电平,然后将数据送到数据口 D0~D7,最后 E 引脚一个高脉冲将数据写入。 写指令和写数据,差别仅仅在于 RS 的电平不一样而已。以下是 LCD1602 的 时序图: 359 从上图可以看到,以上给的时间参数全部是 ns 级别的,而 51 单片机的机器 周期是 1us,指令周期是 2-4 个机器周期,所以即便在程序里不加延时程序,也 可以很好的配合 LCD1602 的时序图:
以上给的时间参数全部是 ns 级别的,而 51 单片机的机器 周期是 1us,指令周期是 2-4 个机器周期,所以即便在程序里不加延时程序,也 可以很好的配合 LCD1602 的时序要求了。 当要写命令字节的时候,时间由左往右,RS 变为低电平,R/W 变为低电平, 注意看是 RS 的状态先变化完成。然后这时,DB0~DB7 上数据进入有效阶段,接 着 E 引脚有一个整脉冲的跳变,接着要维持时间最小值为 tpw=400ns 的 E 脉冲宽 度。然后E引脚负跳变,RS电平变化,R/W 电平变化。这样便是一个完整的LCD1602 写命令的时序 。
2 硬件设计
3 软件设计
实现的功能是:在 LCD1602 液晶上显示字符信息。
程序框架如下: (1)编写 LCD1602 显示函数 (2)编写主函数
#include "lcd1602.h"
/********************************************************************
***********
* 函 数 名 : lcd1602_write_cmd
* 函数功能 : LCD1602 写命令
* 输 入 : cmd:指令
* 输 出 : 无
*********************************************************************
**********/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8 位 LCD
void lcd1602_write_cmd(u8 cmd)
{
LCD1602_RS=0;//选择命令
LCD1602_RW=0;//选择写
LCD1602_E=0;
LCD1602_DATAPORT=cmd;//准备命令
delay_ms(1);
LCD1602_E=1;//使能脚 E 先上升沿写入
delay_ms(1);
LCD1602_E=0;//使能脚 E 后负跳变完成写入
}
#else //4 位 LCD
void lcd1602_write_cmd(u8 cmd)
{
LCD1602_RS=0;//选择命令
LCD1602_RW=0;//选择写
LCD1602_E=0;
LCD1602_DATAPORT=cmd;//准备命令
delay_ms(1);
LCD1602_E=1;//使能脚 E 先上升沿写入
delay_ms(1);
LCD1602_E=0;//使能脚 E 后负跳变完成写入
LCD1602_DATAPORT=cmd<<4;//准备命令
delay_ms(1);
LCD1602_E=1;//使能脚 E 先上升沿写入
delay_ms(1);
LCD1602_E=0;//使能脚 E 后负跳变完成写入
}
#endif
/********************************************************************
***********
* 函 数 名 : lcd1602_write_data
* 函数功能 : LCD1602 写数据
* 输 入 : dat:数据
* 输 出 : 无
*********************************************************************
**********/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8 位 LCD
void lcd1602_write_data(u8 dat)
{
LCD1602_RS=1;//选择数据
LCD1602_RW=0;//选择写
LCD1602_E=0;
LCD1602_DATAPORT=dat;//准备数据
delay_ms(1);
LCD1602_E=1;//使能脚 E 先上升沿写入
delay_ms(1);
LCD1602_E=0;//使能脚 E 后负跳变完成写入
}
#else
void lcd1602_write_data(u8 dat)
{
LCD1602_RS=1;//选择数据
LCD1602_RW=0;//选择写
LCD1602_E=0;
LCD1602_DATAPORT=dat;//准备数据
delay_ms(1);
LCD1602_E=1;//使能脚 E 先上升沿写入
delay_ms(1);
LCD1602_E=0;//使能脚 E 后负跳变完成写入
LCD1602_DATAPORT=dat<<4;//准备数据
delay_ms(1);
LCD1602_E=1;//使能脚 E 先上升沿写入
delay_ms(1);
LCD1602_E=0;//使能脚 E 后负跳变完成写入
}
#endif
/********************************************************************
***********
* 函 数 名 : lcd1602_init
* 函数功能 : LCD1602 初始化
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
#if (LCD1602_4OR8_DATA_INTERFACE==0)//8 位 LCD
void lcd1602_init(void)
{
lcd1602_write_cmd(0x38);//数据总线 8 位,显示 2 行,5*7 点阵/字符
lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
lcd1602_write_cmd(0x01);//清屏
}
#else
void lcd1602_init(void)
{
lcd1602_write_cmd(0x28);//数据总线 4 位,显示 2 行,5*7 点阵/字符
lcd1602_write_cmd(0x0c);//显示功能开,无光标,光标闪烁
lcd1602_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动
lcd1602_write_cmd(0x01);//清屏
}
#endif
/********************************************************************
***********
* 函 数 名 : lcd1602_clear
* 函数功能 : LCD1602 清屏
* 输 入 : 无
* 输 出 : 无
*********************************************************************
**********/
void lcd1602_clear(void)
{
lcd1602_write_cmd(0x01);
}
/********************************************************************
***********
* 函 数 名 : lcd1602_show_string
* 函数功能 : LCD1602 显示字符
* 输 入 : x,y:显示坐标,x=0~15,y=0~1;
str:显示字符串
* 输 出 : 无
*********************************************************************
**********/
void lcd1602_show_string(u8 x,u8 y,u8 *str)
{
u8 i=0;
if(y>1||x>15)return;//行列参数不对则强制退出
if(y<1) //第 1 行显示
{
while(*str!='\0')//字符串是以'\0'结尾,只要前面有内容就显示
{
if(i<16-x)//如果字符长度超过第一行显示范围,则在第二行继续显示
{
lcd1602_write_cmd(0x80+i+x);//第一行显示地址设置
}
else
{
lcd1602_write_cmd(0x40+0x80+i+x-16);//第二行显示地址设置
}
lcd1602_write_data(*str);//显示内容
str++;//指针递增
i++;
}
}
else //第 2 行显示
{
while(*str!='\0')
{
if(i<16-x) //如果字符长度超过第二行显示范围,则在第一行继续显示
{
lcd1602_write_cmd(0x80+0x40+i+x);
}
else
{
lcd1602_write_cmd(0x80+i+x-16);
}
lcd1602_write_data(*str);
str++;
i++;
}
}
}
IO扩展(并转串口)-74HC165
本讲主要内容
1.74HC165芯片介绍
2.硬件设计
3.软件设计
1.74HC165芯片介绍
74HC165 是 8 位并行输入串行输出移位寄存器,它是一款高速 CMOS 器件,遵循 JEDEC 标准。
2.硬件设计
3.软件设计
本章所要实现的功能是:独立按键 K1-K8 按下对应控制 D1-D8 亮。
RS485通信实验
- 1.RS485通信介绍
-
2.硬件设计
3.软件设计
1.RS485通信介绍
RS485的特点:
(1)接口电平低,不易损坏芯片。
(2)传输速率高。
(3)抗干扰能力强。
(4)传输距离远,支持节点多
2.硬件设计
3.软件设计
实现的功能是:当串口助手发送数据给单片机,单片机原封不动转发给串口助手显示。