本文通过介绍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/
发表评论 取消回复