8255LCD 动态显示4X4键盘.docx
- 文档编号:6217180
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:24
- 大小:49.23KB
8255LCD 动态显示4X4键盘.docx
《8255LCD 动态显示4X4键盘.docx》由会员分享,可在线阅读,更多相关《8255LCD 动态显示4X4键盘.docx(24页珍藏版)》请在冰豆网上搜索。
8255LCD动态显示4X4键盘
南京邮电大学通达学院
课程设计实验报告
实验名称基于8255的LCD显示的动态显示器设计
班级080061
学号08006129
姓名_卓晓寒________
指导老师___林建中___________
开课时间2011/2012学年,第一学期_
基于8255的LCD动态显示器设计
一、设计要求
能够学会利用Proteus软件的MCS51单片机仿真学习,根据提供的参考工程,在Proteus平台自己重新设计实验电路所需要的电气原理图,并在此基础上编写相对应的程序,实现其功能,学习Proteus软件的使用,其中包括原理图器件的选取、原理图的电气连接、程序的编写编译以及运行,并能查出其错误等。
二、实验内容
设计一基于8255的LCD动态显示器
三、实验要求
1.用数码管或LCD正常显示数字“12345678”。
2.通过按键可改变显示方式。
3.设计显示屏的动态效果,用10个按键,每键对应一种滚动技术。
另注,实验发挥部分:
1.设计所有动作的联合效果。
2.设计二个变速按键,可多级改变滚动速度。
3.设计一台魔术电子种,采用自动变换,随机组合,数据每10秒变换一次。
动态显示格式:
1.静止
2.整体闪烁
3.单字闪烁
4.整体向前、向后滚动
5.单字移动
6.两边向中间压缩
7.中间向两边扩张
8.上下压缩
9.文字上下滚动
10.组合动作(每一字符执行上述一个动作,并同时运动)
四、实验仪器及实验环境
(1)586微型计算机系统
(2)proteus仿真软件
(3)MEDWIN软件
(4)单片机开发系统
五、设计思路
根据实验给出的要求,我们选择了LM016LLCD进行动态显示。
并通过按键切换不同的功能,来达到分别显示各种要求的动态效果。
实验要求进行检控式LCD动态显示。
定时器T0作为每0.01秒加一的定时器;题目中的要求是用十种动态效果,由于本人对单片机研究肤浅加之有直接可以输入的p1端口。
故将监控调为八种功能,对应的分别为:
1.静止
2.整体闪烁
3.单字闪烁
4.整体向前、向后滚动
5.单字移动
6.两边向中间压缩
7.中间向两边扩张
8.上下压缩
9.文字上下滚动
10.组合动作(每一字符执行上述一个动作,并同时运动)
六、实验过程
本次课程设计是在理论课程的基础上,目的在于培养我们的动手能力,通过电路设计、理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作,并可能结合实际的实验板进行下载测试。
在此次课题设计的过程中,我们人员分配为两人一组,并由指导老师分发课题。
我们的课题为“基于8255的LCD动态显示器设计”。
在考虑本次设计过程中,依据设计基本要求,并且基于8255通用可编程器件等条件,我们把8255器件用来扩展I/O口,以备外接一4X4键盘,以满足通过10个按键来控制10种动态显示,以及通过该I/O口外接一LCD显示器(当然,实验中我们发现不用8255扩展I/O口,单片机AT89C51的四个I/O端口已能满足该实验需要)。
为了能让各器件间联系起来我们又添加了一些逻辑器件,如:
与非门等以及74HC573地址锁存器等。
最终设计的电路图如图
(1):
图
(1)
图中主要器件如表(a):
器件名称
器件型号
单片机
AT89C51
可编程I/O接口芯片
8255
地址锁存器
74HC573
LCD显示器
LM016L
表(a)
其中主要部分器件使用说明如下:
I.4X4矩阵式键盘识别技术
a)键盘键号图
用AT89C51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;对应的按键的序号排列如图
(2)。
图
(2)
b)4×4矩阵键盘识别处理
每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和“1”,开关的一端(行线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:
确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键。
c)键盘扫描程序框图
WAIT
P1=0FFH,P1.6=0
P1=0FFH,P1.4=0
有键按下吗?
有键按下吗?
没有没有
有有
延时10ms
延时10ms
真的有键按下吗?
真的有键按下吗?
没有没有
有有
根据当前状态识别按键
根据当前状态识别按键
P1=0FFH,P1.5=0
P1=0FFH,P1.7=0
有键按下吗?
有键按下吗?
没有没有
有有
延时10ms
延时10ms
真的有键按下吗?
真的有键按下吗?
没有没有
有有
根据当前状态识别按键
根据当前状态识别按键
WAIT
根据当前状态识别按键
注:
在上图中调用相应按键识别子程序转入显示子程序
II.8255通用可编程器件
8255是一种通用的可编程并行I/O接口电路,在单片机应用系统中被广泛用作可编程外部I/O并行接口。
8255的结构及其引脚:
8255有3个8位的并行口PA、PB、PC。
8255的引脚如左图所示。
图中有关引脚含义如下:
①D0-D7:
双向三态数据总线;
②CS:
选片信号输入线,低电平有效;
③RESET:
复位信号输入线,高电平时有效,复位后,PA口、PB口、PC口均为输入方式;
④PA、PB、PC:
3个8位I/O口;
⑤RD:
读选通信号输入线,低电平时有效;
⑥WR:
写选通信号输入线,低电平时有效;
⑦A1,A0:
端口地址输入线,用于选择内部端口寄存器;
⑧VCC:
电源+5V;
GND:
地线。
下表列出了CPU对8255端口的寻址和操作状态:
A1
A0
RD
WR
CS
输入操作(读)
0
0
0
1
0
A口数据总线
0
1
0
1
0
B口数据总线
1
0
0
1
0
C口数据总线
输出操作(写)
0
0
1
0
0
数据总线A口
0
1
1
0
0
数据总线B口
1
0
1
0
0
数据总线C口
1
1
1
0
0
数据总线控制口
禁止操作
X
X
X
X
1
数据总线为高阻
1
1
0
1
0
非法操作
X
X
1
1
0
数据总线为高阻
由总图可以看出,A、B、C口的端口地址取决于A15(P2.7),和低位A1、A0,本次设计采用数据总线到A口,因此则A的端口地址为(01************00)B,本次在设计中采取7FFCH。
七、部分实验效果图
1)静止
2)两边向中间压缩
3)整体向前、向后滚动
八、实验程序
C语言:
/*--------------------库文件--------------------------*/
#include
#include
/*---------------------宏定义-------------------------*/
#defineuintunsignedint
#defineucharunsignedchar
/*----------------芯片端口地址定义---------------------*/
#defineCOM8255XBYTE[0X7FFF]//8255的命令口
#definePA8255XBYTE[0X1FFF]//8255的PA
#definePB8255XBYTE[0X3FFF]//8255的PB
#definePC8255XBYTE[0X5FFF]//8255的PC
#defineDAC0832XBYTE[0XEFFF]//DAC0832口
#defineADC0804XBYTE[0XF7FF]//ADC0804口
/*----------------系统控制引脚定义--------------------*/
sbitRS=P3^0;//1602的数据/命令控制口口
sbitRW=P3^1;//1602的读写控制端
sbitEN=P3^2;//1602的使能控制端
sbitCON=P3^3;//74HC573的锁存端
/*--------------键盘引脚定义--------------------------*/
//键盘引脚定义
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitkey5=P1^4;
sbitkey6=P1^5;
sbitkey7=P1^6;
/*--------------定义系统变量--------------------------------*/
bitflag=0;//定义状态标志位
ucharvalue;
ucharstr[8];
ucharcodeInitialCode[]={0xfe,0xfd,0xfb,0xf7};
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
延时函数*/
/*------------------------------------------*/
voiddelayms(ucharx)//ms延时函数
{
uchary;
for(;x>0;x--)
for(y=150;y>0;y--);
}
/*---------------------------LCD1602驱动函数-------------------*/
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602写命令函数*/
/*------------------------------------------*/
voidWriteCom(ucharCOM)
{
RS=0;
EN=0;
PA8255=COM;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602写坐标函数*/
/*------------------------------------------*/
voidWritePos(ucharx,uchary)
{
if(x==1)
WriteCom(0x80+y-1);
if(x==2)
WriteCom(0x80+0x40+y-1);
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602写数据函数*/
/*------------------------------------------*/
voidWriteData(ucharDATA)
{
RS=1;
EN=0;
PA8255=DATA;
delayms(5);
EN=1;
delayms(5);
EN=0;
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
扫描键盘函数*/
/*------------------------------------------*/
voidkeyscan()
{
uchari=0,j=0;
PB8255=0xf0;
if(PB8255!
=0xf0)
{
delayms
(1);
if(PB8255!
=0xf0)
{
switch(PB8255)
{
case0xe0:
j=1;break;
case0xd0:
j=2;break;
case0xb0:
j=3;break;
case0x70:
j=4;break;
}
PB8255=0x0f;//反转
switch(PB8255)
{
case0x0e:
i=0;break;
case0x0d:
i=1;break;
case0x0b:
i=2;break;
case0x07:
i=3;break;
}
value=i*4+j-1,flag=1;
while(PB8255!
=0x0f);//按键弹起
}
}
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
系统初始化函数*/
/*------------------------------------------*/
voidInitial()
{
CON=1;//锁存器地址锁存
COM8255=0x80;//输入输出方式设置定义8255的A口为输出BC为标准IO
RW=0;//1602液晶读写端清零
WriteCom(0x38);
WriteCom(0x0c);
WriteCom(0x06);
WriteCom(0x01);//清屏
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
数据格式转换函数*/
/*------------------------------------------*/
voidTrans_Data()
{
str[0]=0x31;
str[1]=0x32;
str[2]=0x33;
str[3]=0x34;
str[4]=0x35;
str[5]=0x36;
str[6]=0x37;
str[7]=0x38;
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602状态1函数*/
/*------------------------------------------*/
voidState1()
{
uchari=0;
WriteCom(0x06);
while(value==0)
{
keyscan();
Trans_Data();
WritePos(1,5);
for(i=0;i<8;i++)
WriteData(str[i]);
}
WriteCom(0x01);
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602状态2函数*/
/*------------------------------------------*/
voidState2()
{
uchari=0;
WriteCom(0x01);
while(value==1)
{
keyscan();
Trans_Data();
WritePos(1,5);
WriteCom(0x0c);
for(i=0;i<8;i++)
WriteData(str[i]);
delayms(1000);
WriteCom(0x08);
delayms(1000);
}
WriteCom(0x0c);
WriteCom(0x01);
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602状态3函数*/
/*------------------------------------------*/
voidState3()
{
uchari=0;
bitflag=0;
WritePos(1,5);
for(i=0;i<8;i++)
WriteData(str[i]);
while(value==2)
{
keyscan();
Trans_Data();
flag=~flag;
if(flag==0)
str[0]='';
WritePos(1,5);
for(i=0;i<8;i++)
WriteData(str[i]);
delayms(1000);
}
WriteCom(0x01);
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602状态4函数*/
/*------------------------------------------*/
voidState4()
{
uchari=0;
WritePos(1,5);
for(i=0;i<8;i++)
WriteData(str[i]);
while(value==3)
{
WriteCom(0x07);
keyscan();
Trans_Data();
WritePos(1,25);
for(i=0;i<8;i++)
{
WriteData(str[i]);
delayms(100);
}
}
WriteCom(0x01);
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602状态5函数*/
/*------------------------------------------*/
voidState5()
{
uchari=0,j=1;
WritePos(1,5);
while(value==4)
{
keyscan();
Trans_Data();
WritePos(1,j++);
if(j==20)
j=1;
for(i=0;i<8;i++)
{
WriteData(str[i]);
delayms(5);
}
WriteCom(0x01);
}
WriteCom(0x01);
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602状态6函数*/
/*------------------------------------------*/
voidState6()
{
uchari=0,j=1;
WriteCom(0x06);
WritePos(1,5);
while(value==5)
{
keyscan();
Trans_Data();
WritePos(1,j++);
if(j==10)
j=1;
for(i=0;i<8;i++)
{
WriteData(str[i]);
delayms(1000);
}
WriteCom(0x01);
}
WriteCom(0x01);
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602状态7函数*/
/*------------------------------------------*/
voidState7()
{
uchari=0,j=14,k=0;
WritePos(1,5);
for(i=0;i<8;i++)
WriteData(str[i]);
while(value==6)
{
keyscan();
Trans_Data();
WritePos(1,k++);
if(k==6)
k=0;
for(i=0;i<4;i++)
{
WriteData(str[i]);
}
WritePos(1,j--);
if(j==9)
j=14;
for(i=4;i<8;i++)
{
WriteData(str[i]);
}
delayms(1000);
WriteCom(0x01);
}
WriteCom(0x01);
}
/*------------------------------------------*/
/*形式参数:
void*/
/*返回值:
void*/
/*函数描述:
LCD1602状态8函数*/
/*------------------------------------------*/
voidState8()
{
uchari=0,j=5,k=10;
WritePos(1,5);
for(i=0;i<8;i++)
WriteData(str[i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8255LCD 动态显示4X4键盘 8255 LCD 动态 显示 X4 键盘
![提示](https://static.bdocx.com/images/bang_tan.gif)