8255LCD 动态显示4X4键盘.docx

上传人:b****5 文档编号:6217180 上传时间:2023-01-04 格式:DOCX 页数:24 大小:49.23KB
下载 相关 举报
8255LCD 动态显示4X4键盘.docx_第1页
第1页 / 共24页
8255LCD 动态显示4X4键盘.docx_第2页
第2页 / 共24页
8255LCD 动态显示4X4键盘.docx_第3页
第3页 / 共24页
8255LCD 动态显示4X4键盘.docx_第4页
第4页 / 共24页
8255LCD 动态显示4X4键盘.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

8255LCD 动态显示4X4键盘.docx

《8255LCD 动态显示4X4键盘.docx》由会员分享,可在线阅读,更多相关《8255LCD 动态显示4X4键盘.docx(24页珍藏版)》请在冰豆网上搜索。

8255LCD 动态显示4X4键盘.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1