61A单片机IO.docx

上传人:b****2 文档编号:2461290 上传时间:2022-10-29 格式:DOCX 页数:12 大小:164.28KB
下载 相关 举报
61A单片机IO.docx_第1页
第1页 / 共12页
61A单片机IO.docx_第2页
第2页 / 共12页
61A单片机IO.docx_第3页
第3页 / 共12页
61A单片机IO.docx_第4页
第4页 / 共12页
61A单片机IO.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

61A单片机IO.docx

《61A单片机IO.docx》由会员分享,可在线阅读,更多相关《61A单片机IO.docx(12页珍藏版)》请在冰豆网上搜索。

61A单片机IO.docx

61A单片机IO

   输入/输出接口(也可简称为I/O端口)是单片机与外设交换信息的通道。

输入端口负责从外界接收检测信号、键盘信号等各种开关量信号。

输出端口负责向外界传送由内部电路产生的处理结果、显示信息、控制命令、驱动信号等。

µ’nSP™内有并行和串行两种方式的I/O口。

并行口线路成本较高,但是传输速率也较高;与并行口相比,串行端口的传输速率较低但可以节省大量的线路成本。

SPCE061A有两个16位的通用并行I/O口:

A口和B口。

这两个端口的每一位都可通过编程单独定义成输入或输出口。

   A口的IOA0~IOA7作为输入端口时,具有唤醒功能,即当输入电平发生变化时,会触发CPU中断。

在电池供电、追求低耗电的应用场合,可以让CPU进入睡眠模式(利用软件控制)以降低功耗,需要时才以按键来唤醒CPU,使其进入工作状态。

例如:

手持遥控器、电子字典、PDA、计算器、无线电话等。

IO端口结构

   SPCE061A提供了位控制结构的I/O端口,每一位都可以单独用于数据输入或输出。

每个独立的位可通过以下3种控制向量来作设定:

   1.数据向量Data

   2.属性向量Attribution

   3.方向控制向量Direction

   每3个对应的控制向量组合在一起,形成一个控制字,用来定义相对应I/O端口位的输入输出状态和方式。

例如,假设需要IOA0是下拉输入引脚,则相对应的Data、Attribution和Direction的值均被设为“0”。

如果需要IOA1是带唤醒功能的悬浮式输入引脚,则Data、Attribution和Direction的值被设为“010”。

与其它的单片机相比,SPCE061A除了每个I/O口可以单独定义其状态外,每个对应状态下的I/O端口性质电路都是内置的,在实际的电路中不需要再外接。

例:

设A口为带下拉电阻的输入端口,在连接硬件时不用再外接下拉电路。

   A口和B口的Data、Attribution和Direction的设定值均在不同的寄存器里,用户在进行I/O端口设置时要特别注意这一点。

I/O端口的组合控制设置如表2.1所示:

     注:

 

       *:

端口位预设为带下拉电阻的输入引脚;

     **:

只有当IOA[7~0]内位的控制字为000,001和010时,相对应位才具有唤醒的功能。

     ***:

悬浮输入作为ADCIOA[6~0]的输入

P_IOA_Data(读/写)(7000H)

A端口的数据单元,用于向A口写入或从A端口读出数据。

当A口处于输入状态时,读出是读A口引脚电平状态;写入是将数据写入A端口的数据寄存器。

当A口处于输出状态时,写入输出数据到A端口的数据寄存器。

P_IOA_Buffer(读/写)(7001H)

A端口的数据向量单元,用于向数据向量寄存器写入或从该寄存器读出数据。

当A口处于输入状态时,写入是将A端口的数据向量写入A端口的数据寄存器;读出则是从A端口数据寄存器内读其数值。

当A口处于输出状态时,写入输出数据到A端口的数据寄存器。

对输出而言,P_IOA_Data与P_IOA_Buffer是一样的.但对输入而言,P_IOA_Data读的是IO的值,P_IOA_Buffer读的是buffer内的值。

假设IOA[0]作为输出,并去接LED阳极(LED阴极接地)。

若P_IOA_Data的IOA[0]为1。

在某些需要较大驱动能力的LED而言,LED会亮,但IOA[0]会被拉到一个很低的值。

此时从P_IOA_Data读回为0,但P_IOA_Buffer则为1。

读回的意义是是方便做其它的IO运算。

P_IOA_Dir(读/写)(7002H)

A端口的方向向量单元,用于用来设置A口是输入还是输出,该方向控制向量寄存器可以写入或从该寄存器内读出方向控制向量。

Dir位决定了端口位的输入/输出方向:

即‘0’为输入,‘1’为输出。

P_IOA_Attrib(读/写)(7003H)

A端口的属性向量单元,用于A端口属性向量的设置。

P_IOA_Latch(读)(7004H)

读该单元以锁存A端口上的输入数据,用于进入睡眠状态前的触键唤醒功能的启动(参见睡眠/唤醒部分)。

并行I/O端口的控制向量组合

   方向向量_Dir、属性向量_Attrib和数据向量_Data分别代表三个控制口。

这三个端口中每个对应的字节合在一起,形成一个控制字,来定义相对应I/O端口位的输入/输出状态和方式。

 2.1具体表示了如何通过对I/O口的_Dir、_Attrib以及_Data进行编程,来设定端口位的输入/输出状态和方式。

   由2.1可以得出以下一些结论:

   1._Dir位决定了端口位的输入/输出方向:

即‘0’为输入,‘1’为输出。

   2._Attrib位决定了在端口位的输入状态下是为悬浮式输入还是非悬浮式输入:

即‘0’为带上拉或下拉电阻式输入,而‘1’则为悬浮式输入。

在端口位的输出状态下则决定其输出是反相的还是同相的;‘0’为反相输出,‘1’则为同相输出。

   3._Data位在端口位的输入状态下被写入时,与_Attrib字节合在一起形成输入方式的控制字‘00’、‘01’、‘10’、‘11’,以决定输入端口是带唤醒功能的上拉电阻式、下拉电阻式或悬浮式以及不带唤醒功能的悬浮式输入。

_Data位在端口位的输出状态下被写入的是输出数据,不过,数据是经过反相器输出还是经过同相寄存器输出要由_Attrib位来决定。

   例如,假设要把A口的B0定义成下拉电阻式的输入口,则A口_Dir、_Attrib和_Data三个向量对应的B0组合应设为‘000’。

如果想把A口的B1定义成具有唤醒功能的悬浮式输入口,只需将_Dir、_Attrib和_Data向量对应的B1组合设置为‘010’即可。

   A口的IOA0~IOA7作为唤醒来源,常用于键盘输入。

要启用IOA0~IOA7的唤醒功能,必须先读取P_IOA_Latch单元,以此来锁存IOA0~IOA7引脚上的按键状态。

随后,系统才可通过指令进入低功耗的睡眠状态。

当有按键按下时,IOA0~IOA7的输入状态会与其在进入睡眠前被锁存时的状态不同,从而引起系统的唤醒。

[例2.5]:

设置IO口

   设置IOA[3~0]为带下拉电阻的输入口,IOA[7~4]为带上拉电阻的输入口,IOA[11~8]为带数据寄存器的高电平输出口,IOA[15~12]为带数据寄存器的低电平输出口。

R1=0x0FF0;//设置A端口的数据向量,IOA0~IOA3与IOA12~IOA15置高

[P_IOA_Data]=R1;//IOA4~IOA7与IOA8~IOA11置低

R1=0xFF00;//设置A端口的属性向量,IOA0~IOA8置低,IOA12~IOA15

[P_IOA_Attrib]=R1;//置高

R1=0xFF00;//设置A端口的属性向量,IOA0~IOA8置低,IOA12~IOA15

[P_IOA_Dir]=R1;//置高

各端口位对应的向量设置如下表2.2:

   从上面的分析我们可以看出,当作为输入口时所读到的数值来自不同的地方,由P_IOA_Data所读到是A口引脚上的当前状态,由P_IOA_Buffer所读到的值来自数据寄存器(见例2.6);当A端口作为输出端口时,数据都是写到A端口的数据寄存器。

对于某

些I/O口的应用,这种读写方式可以省下许多存放端口数据的RAM空间。

[例2.6]:

程序说明:

在单步跟踪程序期间将A端口的任意引脚接VDD,通过观察寄存器表中的R2,R3的值可观察到二者的不同。

.INCLUDEhadware.inc//包含头文件

.CODE

.PUBLIC_main//主程序

_main:

R1=0x0000//设置A口为带下拉电阻的输入口

[P_IOA_Data]=R1//设置A端口的数据向量

[P_IOA_Attrib]=R1//设置A端口的属性向量

[P_IOA_Dir]=R1//设置A口的方向向量

//*****************此时将A口的任意一口接高电平*********************//

R3=[P_IOA_Data]//把P_IOA_Data中的值送到寄存器R3

R2=[P_IOA_Buffer]//把P_IOA_Buffer中的值送到寄存器R2

WAIT:

JMPWAIT//主程序循环

[例2.7]:

.DEFINEP_IOB_Data0x7005

.DEFINEP_IOB_Dir0x7007

.DEFINEP_IOB_Attrib0x7008

.DEFINEP_IOB_Buffer0x7006

.CODE

.PUBLIC_main//主程序

_main:

R1=0xFFFF//设置B口为带反向器的低电平输出

[P_IOB_Dir]=R1//设置3个属性向量

[P_IOB_Data]=R1

R1=0x0000

[P_IOB_Attrib]=R1

R1=0x0000//向寄存器写入0x0000

[P_IOB_Data]=R1

//***********************此时检测B口的电平为高***********************//

R3=[P_IOB_Buffer]//回读Buffer的值为0x0000

LOOP:

JMPLOOP//主程序循环

P_IOA_Data与P_IOA_Buffer区别:

读取IO口

   从端口读取数据的两种方式:

从P_IOA_Data读取数据相当于读取端口引脚的信号。

然而,从P_IOA_Buffer读取数据相当于从数据寄存器中读取数据。

R1=[P_IOA_Buffer]//从A端口数据寄存器中读取数据

R1=[P_IOA_Data]//从A端口引脚读取数据

写入IO口

   这里有两种写入IOA的数据方法,向P_IOA_Data写入数据等同于向P_IOA_Buffer写入数据。

R1=0x0000;

[P_IOA_Data]=R1;//写数据到P_IOA_Data

[P_IOA_Buffer]=R1;//写数据到P_IOA_Buffer

详细如图2.6。

P_IOB_Data(读/写)(7005H)

B端口的数据单元,用于向B口写入或从B端口读出数据。

当B口处于输入状态时,读出是读B口引脚电平状态;写入是将数据写入B端口的数据寄存器。

当B口处于输出状态时,写入输出数据到B端口的数据寄存器。

P_IOB_Buffer(读/写)(7006H)

B端口的数据向量单元,用于向数据寄存器写入或从该寄存器内读出数据。

当B口处于输入状态时,写入是将数据写入B端口的数据寄存器;读出则是从B端口数据寄存器里读其数值。

当B口处于输出状态时,写入数据到B端口的数据寄存器。

P_IOB_Dir(读/写)(7007H)

B端口的方向向量单元,用于设置IOB口的状态。

‘0’为输入,‘1’为输出。

P_IOB_Attrib(读/写)(7008H)

B端口的属性向量单元,用于设置IOB端口的属性。

[例2.8]:

设置A端口低8位为带下拉电阻的输入端口,作为按键输入;B端口低8位为带数据寄存器的高电平输出口,外接发光二极管显示。

当Ke

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

当前位置:首页 > 医药卫生 > 基础医学

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

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