单片机课程设计利用矩阵键盘来控制1602液晶显示器的显示设计Word格式文档下载.docx
《单片机课程设计利用矩阵键盘来控制1602液晶显示器的显示设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计利用矩阵键盘来控制1602液晶显示器的显示设计Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
(2)STC89C82RC单片机一块。
(3)1602液晶显示器一块
(4)杜邦线若干。
(5)3*4矩阵键盘
3.311602液晶显示器
液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件了。
1602可以显示2行16个字符,有8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。
1602外观如下图所示
1602引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
双向数据口
2
VDD
电源正极
10
D3
3
VL
对比度调节
11
D4
4
RS
数据/命令选择
12
D5
5
R/W
读/写选择
13
D6
6
E
模块使能端
14
D7
7
D0
15
BLK
背光源地
8
D1
16
BLA
背光源正极
注意事项:
从该模块的正面看,引脚排列从右向左为:
15脚、16脚,然后才是1-14脚(线路板上已经标明)。
VDD:
电源正极,4.5-5.5V,通常使用5V电压;
VL:
LCD对比度调节端,电压调节范围为0-5V。
接正电源时对比度最弱,接地电源时对比度最高,但对比度过高时会产生“鬼影”,因此通常使用一个10K的电位器来调整对比度,或者直接串接一个电阻到地;
RS:
MCU写入数据或者指令选择端。
MCU要写入指令时,使RS为低电平;
MCU要写入数据时,使RS为高电平;
R/W:
读写控制端。
R/W为高电平时,读取数据;
R/W为低电平时,写入数据;
E:
LCD模块使能信号控制端。
写数据时,需要下降沿触发模块。
D0-D7:
8位数据总线,三态双向。
如果MCU的I/O口资源紧张的话,该模块也可以只使用4位数据线D4-D7接口传送数据。
本充电器就是采用4位数据传送方式;
BLA:
LED背光正极。
需要背光时,BLA串接一个限流电阻接VDD,BLK接地,实测该模块的背光电流为50mA左右;
BLK:
LED背光地端。
1602操作时序
(1)读操作时序
(2)写操作时序
(3)基本操作时序
图为DM-162液晶显示模块和单片机STC89C82RC的接口电路
(1)矩阵式键盘的结构与工作原理
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
具体的识别及编程方法如下所述。
(2)矩阵式键盘的按键识别方法
确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。
1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:
依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
4.1设计思想:
把一个多功能的复杂程序划分为若干简单的,功能单一的程序模块,各程序模块完成明确的任务,实现某个具体功能。
在具体需要时调用相应的模块即可。
4.2软件流程图:
#include<
reg52.h>
intrins.h>
#defineucharunsignedchar
#defineuintunsignedint
uchardis_buf;
//显示缓存
uchartemp;
ucharkey;
//键顺序吗
sbitLCD_RW=P2^5;
sbitLCD_RS=P2^6;
sbitLCD_EN=P2^7;
ucharcdis1[16]={"
KEYNUMBER"
};
ucharcdis2[16]={"
KEY-CODE:
H"
#definedelayNOP();
{_nop_();
_nop_();
/*************************************************************/
/**/
/*延时子程序*/
voiddelay(ucharx)
{ucharj;
while((x--)!
=0)
{for(j=0;
j<
125;
j++)
{;
}
}
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据*/
/*************************************************************/
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
delayNOP();
result=(bit)(P0&
0x80);
LCD_EN=0;
return(result);
/*******************************************************************/
/*写指令数据到LCD*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
*/
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
LCD_RW=0;
_nop_();
P0=cmd;
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
voidlcd_wdat(uchardat)
LCD_RS=1;
P0=dat;
/*LCD初始化设定*/
voidlcd_init()
delay(15);
lcd_wcmd(0x38);
//16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x0c);
//显示开,关光标
lcd_wcmd(0x06);
//移动光标
lcd_wcmd(0x01);
//清除LCD的显示内容
/*设定显示位置*/
voidlcd_pos(ucharpos)
lcd_wcmd(pos|0x80);
//数据指针=80+地址变量
/*键扫描子程序(4*3的矩阵)P1.4P1.5P1.6P1.7为行*/
/*P1.1P1.2P1.3为列*/
voidkeyscan(void)
{
delay(10);
temp=0;
P3=0xF0;
//高四位输入