单片机课程设计利用矩阵键盘来控制1602液晶显示器的显示设计.docx
- 文档编号:8801481
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:17
- 大小:110.45KB
单片机课程设计利用矩阵键盘来控制1602液晶显示器的显示设计.docx
《单片机课程设计利用矩阵键盘来控制1602液晶显示器的显示设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计利用矩阵键盘来控制1602液晶显示器的显示设计.docx(17页珍藏版)》请在冰豆网上搜索。
单片机课程设计利用矩阵键盘来控制1602液晶显示器的显示设计
《单片机原理及应用课程设计》报告——利用矩阵键盘来控制1602液晶显示器的显示设计
专业:
班级:
姓名:
学号:
指导教师:
2011年5月15日
1.课程设计目的
1.1巩固和加深对单片机原理和接口技术知识的理解;
1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;
1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;
1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;
1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。
2.课程设计要求
2.1在3*4矩阵键盘上输入信息
2.2在1602芯片上显示时间信息。
2.3显示数据的设计与变换
3.硬件设计
3.1设计思想
在3*4矩阵键盘上输入信息,通过中央处理器处理信息,再通过1602液晶显示器显示信息。
3.2主要元器件介绍
(1)电源电路
(2)STC89C82RC单片机一块。
(3)1602液晶显示器一块
(4)杜邦线若干。
(5)3*4矩阵键盘
3.3.功能电路介绍
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的接口电路
3.323*4矩阵键盘
(1)矩阵式键盘的结构与工作原理
在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
具体的识别及编程方法如下所述。
(2)矩阵式键盘的按键识别方法
确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
行扫描法行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。
1、判断键盘中有无键按下将全部行线Y0-Y3置低电平,然后检测列线的状态。
只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。
若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。
其方法是:
依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。
在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。
若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
4.软件设计
4.1设计思想:
把一个多功能的复杂程序划分为若干简单的,功能单一的程序模块,各程序模块完成明确的任务,实现某个具体功能。
在具体需要时调用相应的模块即可。
4.2软件流程图:
4.3源程序:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardis_buf;//显示缓存
uchartemp;
ucharkey;//键顺序吗
voiddelay0(ucharx);//x*0.14MS
sbitLCD_RW=P2^5;
sbitLCD_RS=P2^6;
sbitLCD_EN=P2^7;
ucharcdis1[16]={"KEYNUMBER"};
ucharcdis2[16]={"KEY-CODE:
H"};
#definedelayNOP();{_nop_();_nop_();_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_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P0=cmd;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*******************************************************************/
/*写显示数据到LCD*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。
*/
/*******************************************************************/
voidlcd_wdat(uchardat)
{
while(lcd_busy());
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayNOP();
LCD_EN=1;
delayNOP();
LCD_EN=0;
}
/*************************************************************/
/*LCD初始化设定*/
/*************************************************************/
voidlcd_init()
{
delay(15);
lcd_wcmd(0x38);//16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c);//显示开,关光标
delay(5);
lcd_wcmd(0x06);//移动光标
delay(5);
lcd_wcmd(0x01);//清除LCD的显示内容
delay(5);
}
/*************************************************************/
/*设定显示位置*/
/*************************************************************/
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;//高四位输入行为高电平列为低电平
delay
(1);
temp=P3;//读P1口
temp=temp&0xF0;//屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1)//p1.4被拉低
key=0;
elseif(temp==2)//p1.5被拉低
key=1;
elseif(temp==4)//p1.6被拉低
key=2;
elseif(temp==8)//p1.7被拉低
key=3;
else
key=16;
P3=0x0F;//低四位输入列为高电平行为低电平
delay
(1);
temp=P3;//读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==2)//p1.1被拉低
key=key+0;
elseif(temp==4)//p1.2被拉低
key=key+4;
elseif(temp==8)//p1.3被拉低
key=key+8;
else
key=16;
dis_buf=key;//键值入显示缓存
dis_buf=dis_buf&0x0f;
if(dis_buf>9)//转换为ASCII码
dis_buf=dis_buf+0x37;
else
dis_buf=dis_buf+0x30;
P3=0xff;
while(P3!
=0xff)
{P3=0xff;}
delay(30);
}
/*************************************************************/
/*判断键是否按下*/
/*************************************************************/
voidkeydown(void)
{
P3=0xF0;
if(P3!
=0xF0)//判断按键是否按下如果按钮按下会拉低P1其中的一个端口
{
keyscan();
}
}
/*************************************************************/
/*主程序*/
/*************************************************************/
main()
{
ucharm;
P0=0xFF;//置P0口
P1=0xFF;//置P1口
delay(10);//延时
lcd_init();//初始化LCD
lcd_pos(0);//设置显示位置为第一行的第1个字符
m=0;
while(cdis1[m]!
='\0')
{//显示字符
lcd_wdat(cdis1[m]);
m++;
}
lcd_pos(0x40);//设置显示位置为第二行第1个字符
m=0;
while(cdis2[m]!
='\0')
{
lcd_wdat(cdis2[m]);//显示字符
m++;
}
dis_buf=0x2d;//显示字符"-"
while
(1)
{
keydown();
lcd_pos(0x4c);
lcd_wdat(dis_buf);//第一位数显示
}
}
5.调试运行
5.1程序调试正确后,在1602LCD上查看是否显示光标
5.2在矩阵键盘上按下键盘,看在1620显示器上是不是有显示。
一开始没有,说明还是程序的问题,经过我多次修改,终于可以显示信息了。
5.3在矩阵键盘上按下不同的键盘,发现显示的数据是我想要的,而且是规律的,但是手一离开按键,数字都归为O,不能保持不变,说明程序还得再修改
5.4再次修改程序,修改延迟时间,使得显示稳定。
修改后终于达到我要的效果了,从键盘上依次按下,能显示0-9,A-B的数据。
而且显示稳定,只要不再按键,数据就不再变化。
6.设计心得体会:
通过此次课程设计,我对1602这块芯片和矩阵键盘的原理有所了解,由于是初次接触1602这块芯片,所以实验起来遇到了很多问题,比如时序问题,在程序烧录完后实验好几次没有我要的效果,有时候显示屏上没有光标,有时候显示数据的地方成为一块灰色而不能显示数据,有时候按下键盘能显示数据,但是一按下键盘数据就不见了。
这些都是程序还有接口的问题。
经过多次修改后,终于成功了,我领悟到时序就是芯片的灵魂,做什么都要按照时序的要求才能达到想要的效果。
通过这次课程设计,让我认识到很多问题,比如光光学习课本上的知识还远远不够,还需要加强自己的动手能力。
另外我发现自己的外语能力也需要加强,因为自己在查文献时发现好多资料多是英文版的,这就很大程度上阻碍了我的理解能力。
所以平时我要加强学习专业外语知识,以便来充实自己的能力。
通过这次实验,我学会了一步一步地写程序,保证每个写出来的子函数都正确,这样可以避免最后回头找错误的繁琐,比如在本实验中,我写完复位函数就进行检测,看复位是否成功,假如不成功,就重新审查函数,直到复位成功。
另外,这次除了对芯片的使用,还让我学会了如何正确而简洁的画流程图,以及流程图对整个实验思想的理解等等。
1602液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件了。
如此一个小小的芯片,就有这么多的内容,单片机的世界神奇,今后一定要研究更多的芯片,更好地学习单片机。
参考书目:
[1]肖金球.单片机原理与接口技术.[M].北京:
清华大学出版社,2004.12
[2]郭天祥.新概念51单片机C语言教程——入门、提高、开发、拓展.电子工业出版社2009.1
[3]赖麒文8051单片机C语言彻底应用北京:
科学出版社2002
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 利用 矩阵 键盘 控制 1602 液晶显示器 显示 设计