单片机学习(五)LCD1602和矩阵键盘的使用

本文通过介绍LCD1602模块和矩阵键盘的使用方法,并提供实际应用案例来展示如何将它们与单片机结合使用。

1. LCD1602模块

1.1 说明

LCD1602模块是一种基于液晶技术的显示模块,可以方便地通过单片机控制显示文字和图形。它具有以下特点:

- 16个字符 × 2行,共32个字符的显示区域

- 支持ASCII字符集

- 显示效果清晰

- ℃和℉两种温标,可通过外部引脚选择

1.2 接线

LCD1602模块通常需要与单片机进行连接,下面是一些常见的接线方法。

- VCC: 正电源(+5V)

- GND: 负电源(GND)

- RS: 数据/命令选择引脚,高电平时处于数据模式,低电平时处于命令模式

- RW: 读写选择引脚,高电平时处于读模式,低电平时处于写模式

- EN: 使能引脚,高电平时能够使LCD正常工作

- D0-D7: 数据引脚,共8条,用于传输8位数据

1.3 使用方法

要使用LCD1602模块,可以按照以下步骤进行:

- 初始化:打开模块电源之前,必须先完成LCD模块的初始化,然后输入相应的命令来确定显示的设置(例如:指定显示的光标位置、显示方式等)。

- 写入数据:在写入数据时,需要先置位RS引脚来表示处于数据模式。写入数据时需要使用EN引脚来输入时序脉冲,每次写入一次数据时,需要将EN引脚拉高和拉低一次来完成数据的写入。

- 写入命令:在写入命令时,需要将RS引脚设置为低电平,然后依次写入命令。当写入完成后,需要将RS引脚设置为高电平,让模块进入数据模式。

它们可以通过示例代码来更直观地理解,下面是一个基于Keil的程序示例。

```

#include

#define LCD_D P0 // 数据口定义

sbit LCD_RS = P2^0; // 模式选择引脚定义

sbit LCD_RW = P2^1; // 读写控制引脚定义

sbit LCD_EN = P2^2; // 使能控制引脚定义

// 初始化

void InitLcd1602()

{

delay(15); // 等待15毫秒

WriteCmdToLcd(0x38); // 液晶16×2、5×7点阵、8位数据接口

WriteCmdToLcd(0x0c); // 开启显示;光标关,光标不闪烁

WriteCmdToLcd(0x06); // 光标自动加1;不带位移

WriteCmdToLcd(0x01); // 清屏

}

// 向LCD写指令

void WriteCmdToLcd(unsigned char cmd)

{

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

LCD_D = cmd;

LCD_EN = 1;

_nop_();

LCD_EN = 0;

}

// 向LCD写数据

void WriteDataToLcd(unsigned char dat)

{

LCD_RS = 1; //写数据

LCD_RW = 0;

LCD_EN = 0;

LCD_D = dat;

LCD_EN = 1;

_nop_();

LCD_EN = 0;

}

// 主函数

void main()

{

InitLcd1602(); // 初始化LCD模块

WriteDataToLcd('H');

WriteDataToLcd('e');

WriteDataToLcd('l');

WriteDataToLcd('l');

WriteDataToLcd('o');

while(1);

}

```

2. 矩阵键盘

2.1 说明

矩阵键盘是一种常见的输入设备,通常可以方便地进行数字和字符输入。它具有以下特点:

- 通常包括数字键和功能键

- 设计紧凑,易于携带和使用

- 可以适配不同的单片机系统

- 操作简单,便于用户使用

2.2 接线

矩阵键盘通常使用的是扫描方式,需要通过连接引脚和单片机来实现按键扫描。下面是一些常见的接线方法。

- VCC: 正电源(+5V)

- GND: 负电源(GND)

- J1-J4:行线输出引脚,其中J1接口是最高位,J4接口是最低位

- K1-K4:列线输入引脚,其中K4接口是最高位,K1接口是最低位

矩阵键盘的输出和输入连接到单片机的GPIO上,可以通过修改GPIO电平状态控制键盘。

2.3 使用方法

要使用矩阵键盘,需要执行以下步骤:

- 接线:将矩阵键盘与单片机中断输入口或者定时器输入口相连接。

- 扫描:需要通过程序对按键进行轮询或者中断扫描,按键按下的时候会出现变化,可以通过相应的程序代码来处理按键事件。

- 按键处理:使用判断语句来判断按键状态并执行相应的处理程序,例如设定报警标志位、进行LCD显示等。

下面是一个基于Keil的程序示例。该程序示例使用了一些变量来表示矩阵键盘的状态,以实现简单的分类处理。

```

#include

sbit R1=P0^0; // 行端口

sbit R2=P0^1;

sbit R3=P0^2;

sbit R4=P0^3;

sbit C1=P2^4; // 列端口

sbit C2=P2^5;

sbit C3=P2^6;

sbit C4=P2^7;

// 矩阵键盘扫描函数

void scan()

{

P0=0xfe; //0011 1110 第一行输出低电平

if(C1==0){keyDown=1;keyValue=1;} //第一行第一列

if(C2==0){keyDown=1;keyValue=2;} //第一行第二列

if(C3==0){keyDown=1;keyValue=3;} //第一行第三列

if(C4==0){keyDown=1;keyValue=10;} //第一行第四列

P0=0xfd; //0011 1101 第二行输出低电平

if(C1==0){keyDown=1;keyValue=4;} //第二行第一列

if(C2==0){keyDown=1;keyValue=5;} //第二行第二列

if(C3==0){keyDown=1;keyValue=6;} //第二行第三列

if(C4==0){keyDown=1;keyValue=11;} //第二行第四列

P0=0xfb; //0011 1011 第三行输出低电平

if(C1==0){keyDown=1;keyValue=7;} //第三行第一列

if(C2==0){keyDown=1;keyValue=8;} //第三行第二列

if(C3==0){keyDown=1;keyValue=9;} //第三行第三列

if(C4==0){keyDown=1;keyValue=12;} //第三行第四列

P0=0xf7; //0011 0111 第四行输出低电平

if(C1==0){keyDown=1;keyValue=13;} //第四行第一列

if(C2==0){keyDown=1;keyValue=0;} //第四行第二列

if(C3==0){keyDown=1;keyValue=14;} //第四行第三列

if(C4==0){keyDown=1;keyValue=15;} //第四行第四列

}

// 主程序

void main()

{

while(1)

{

scan(); // 按键扫描

if(keyDown==1)

{

switch(keyValue) // 根据按键值进行分类

{

case 0: break; // 空格键

case 1: break; // 1键

case 2: break; // 2键

case 3: break; // 3键

case 4: break; // 4键

case 5: break; // 5键

case 6: break; // 6键

case 7: break; // 7键

case 8: break; // 8键

case 9: break; // 9键

case 10: break; // 清零键

case 11: break; // 加键

case 12: break; // 减键

case 13: break; // *

case 14: break; // #

case 15: break; // ok

}

keyDown=0; // 停止扫描

}

}

}

```

3. 案例说明

下面是一个基于LCD1602和矩阵键盘的实际应用案例。该案例通过按键控制LCD1602屏幕的内容,可以学习如何将LCD1602模块和矩阵键盘结合使用。

3.1 程序设计思路

该程序的设计思路是:通过矩阵键盘控制操作,将相应的按键值写入LCD1602屏幕的指定位置。同时,该程序还会显示当前日期和时间的秒信息,以提高实际的应用性。

实现过程如下:

首先,让LCD1602屏幕显示当前日期和时间的秒数信息,同时将光标放在第二行第1列的位置。

然后,接着通过矩阵键盘的输入来写入相应的内容,写入完毕后,屏幕将会显示输入的值。

最后,程序将清除屏幕并调用计时器显示当前时间。

3.2 程序示例

下面是一个基于Keil的程序示例。该程序示例使用了LCD1602和矩阵键盘的功能来实现案例的功能。

```

#include

#define LCD_D P0 // 数据口定义

#define uchar unsigned char // 宏定义uchar用作无符号字符

sbit LCD_RS = P2^0; // 模式选择引脚定义

sbit LCD_RW = P2^1; // 读写控制引脚定义

sbit LCD_EN = P2^2; // 使能控制引脚定义

sbit R1=P0^0; // 行端口

sbit R2=P0^1;

sbit R3=P0^2;

sbit R4=P0^3;

sbit C1=P2^4; // 列端口

sbit C2=P2^5;

sbit C3=P2^6;

sbit C4=P2^7;

void delayms(unsigned int n)

{

unsigned int x,y;

for(x=n;x>0;x--)

for(y=110;y>0;y--);

}

// 初始清屏

void init(void)

{

WriteCmdToLcd(0x38);

WriteCmdToLcd(0x08); // 当前关闭显示

WriteCmdToLcd(0x01); // 清屏

WriteCmdToLcd(0x06); // 游标自动增加

WriteCmdToLcd(0x0f); // 将游标设置为闪烁光标

WriteCmdToLcd(0x80); // 设置游标到第一行第一列

}

// 初始化LCD

void InitLcd1602()

{

delayms(15); // 等待15毫秒

WriteCmdToLcd(0x38); // 液晶16×2、5×7点阵、8位数据接口

WriteCmdToLcd(0x0c); // 开启显示;光标关,光标不闪烁

WriteCmdToLcd(0x06); // 光标自动加1;不带位移

WriteCmdToLcd(0x01); // 清屏

}

void scan(void)

{

P0=0xfe; //0011 1110 第一行输出低电平

if(C1==0){keyValue='1';keyDown=1;} //第一行第一列

if(C2==0){keyValue='2';keyDown=1;} //第一行第二列

if(C3==0){keyValue='3';keyDown=1;} //第一行第三列

if(C4==0){keyValue='A';keyDown=1;} //第一行第四列

P0=0xfd; //0011 1101 第二行输出低电平

if(C1==0){keyValue='4';keyDown=1;} //第二行第一列

if(C2==0){keyValue='5';keyDown=1;} //第二行第二列

if(C3==0){keyValue='6';keyDown=1;} //第二行第三列

if(C4==0){keyValue='B';keyDown=1;} //第二行第四列

P0=0xfb; //0011 1011 第三行输出低电平

if(C1==0){keyValue='7';keyDown=1;} //第三行第一列

if(C2==0){keyValue='8';keyDown=1;} //第三行第二列

if(C3==0){keyValue='9';keyDown=1;} //第三行第三列

if(C4==0){keyValue='C';keyDown=1;} //第三行第四列

P0=0xf7; //0011 0111 第四行输出低电平

if(C1==0){keyValue='*';keyDown=1;} //第四行第一列

if(C2==0){keyValue='0';keyDown=1;} //第四行第二列

if(C3==0){keyValue='#';keyDown=1;} //第四行第三列

if(C4==0){keyValue='D';keyDown=1;} //第四行第四列

}

// 向LCD写指令

void WriteCmdToLcd(unsigned char cmd)

{

LCD_RS = 0;

LCD_RW = 0;

LCD_EN = 0;

LCD_D = cmd;

LCD_EN = 1;

_nop_();

LCD_EN = 0;

}

// 向LCD写数据

void WriteDataToLcd(unsigned char dat)

{

LCD_RS = 1; //写数据

LCD_RW = 0;

LCD_EN = 0;

LCD_D = dat;

LCD_EN = 1;

_nop_();

LCD_EN = 0;

}

void write(z,y,x)

{

WriteCmdToLcd(0x80+z*0x40+y); //设置光标到指定位置

WriteDataToLcd(x); //向LCD写入数据

}

// 主程序

void main()

{

unsigned char h,m,s;

init(); // 初始化LCD1602

InitLcd1602(); // 初始化 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/

点赞(17) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部