logo
 
首页-> 产品信息-> 8位单片机
 
入门指南
开发&工具
应用方案
客户支持
 
学习e条龙
一、单片机简介 二、指令系统 三、IO端口 四、中断系统
五、定时/计数器 六、串行接口 七、模拟外设 八、其它硬件
九、开发工具 十、应用实例 十一、附录  


I/O 端口原理及应用

内容索引
3.1 I/O端口概述 3.4 特殊功能
3.2 I/O端口结构  3.5 I/O端口应用
3.3 I/O端口寄存器  

3.1  I/O 端口概述

  SPMC65 系列单片机最多有 6 组 8 位并行端口:端口 A 、端口 B 、端口 C 、端口 D 、端口 E 和端口 F 。

  SPMC65 系列单片机 I/O 端口具有 4mA 的推电流能力( driving )及 10mA 的灌电流( sinking )能力,其中有两个 I/O 端口的灌电流能力可达 20mA 。详细情况见 表 3.1 和 表 3.2 :

表 3 . 1 端口 A 的直流特性( VDD=5.0V )

PIN

输入等效上拉 / 下拉电阻

输入

输出 推电流 / 灌电流

PA7

100K 上拉 / 下拉

施密特触发器

4/10mA

PA6

100K 上拉 / 下拉

施密特触发器

4/10mA

PA5

100K 上拉 / 下拉

施密特触发器

4/10mA

PA4

100K 上拉 / 下拉

施密特触发器

4/10mA

PA3

100K 上拉 / 下拉

施密特触发器

4/10mA

PA2

100K 上拉 / 下拉

施密特触发器

4/10mA

PA1

100K 上拉 / 下拉

施密特触发器

4/10mA

PA0

100K 上拉 / 下拉

施密特触发器

4/10mA

表 3 . 2端口 B 的直流特性( VDD=5.0V )

PIN

输入等效上拉 / 下拉电阻

输入

输出 推电流 / 灌电流

PB7

100K 上拉 / 下拉

施密特触发器

4/20mA

PB6

100K 上拉 / 下拉

施密特触发器

4/20mA

PB5

100K 上拉 / 下拉

施密特触发器

4/10mA

PB4

100K 上拉 / 下拉

施密特触发器

4/10mA

PB3

100K 上拉 / 下拉

施密特触发器

4/10mA

PB2

100K 上拉 / 下拉

施密特触发器

4/10mA

PB1

100K 上拉 / 下拉

施密特触发器

4/10mA

PB0

100K 上拉 / 下拉

施密特触发器

4/10mA

  端口 C 、端口 D 、端口 E 、端口 F 的驱动能力及输入方式与端口 A 的一样。

3.2  I/O 端口结构

  SPMC65 系列单片机的每一位 I/O 端口都可独立地设置为输入或输出状态,并且每个端口都内置有弱上拉、弱下拉电阻,可以通过寄存器设置为上拉或下拉输入状态,也可设置为悬浮输入状态。

  SPMC65 系列单片机的 I/O 端口结构如 图 3.1 所示:



图 3 . 1 I/O 结构

  读 P_IOX_Data(X=A ~ F) 寄存器将得到管脚的电平状态,向 P_IOX_Data 写入数据,会存入数据寄存器中。

P_IOX_Data 单元和 P_IOX_Buf 单元的区别:

  对输出而言两者没有区别,但对输入而言,读 P_IOX_Data 单元读的是当前 I/O 的电平值,读 P_IOX_Buf 单元是读的是上次写入的数据。

3.3  I/O 端口寄存器

3.3.1  IO 端口的设置

  SPMC65 系列单片机的 I/O 控制寄存器分别为:数据寄存器 P_IOX_Data 、方向寄存器 P_IOX_Dir 、属性寄存器 P_IOX_Attrib 和数据锁存寄存器 P_IOX_Buf ( X=A~F )。

  通常,对某一个 I/O 端口的设置包括以下 3 个基本项:数据寄存器 Data 、属性寄存器 Attribution 和方向控制寄存器 Direction 。

  其具体作用如下:

•  方向控制寄存器 P_IOX_Dir 将管脚设置为输入或输出

•  属性寄存器 P_IOX_Attrib 将管脚设置为悬浮或不悬浮

•  当管脚作为输入时,数据寄存器 P_IOX_Data 将其设置为上拉或下拉;当管脚作为输出时,写入数值到数据寄存器 Data 里,便可在端口输出相应的的电平。

  I/O 端口的组合控制设置如 表 3.3 所列。

表 3 . 3 I/O 端口的组合控制设置

方向寄存器

P_IOX_Dir

属性寄存器

P_IOX_Attrib

数据寄存器

P_IOX_Data

功能

描述

0

0

0

下拉输入

带下拉电阻的输入管脚

0

0

1

上拉输入

带上拉电阻的输入管脚

1

0

1

输出状态(高电平)

输出高电平

1

0

0

输出状态(低电平)

输出低电平

-

1

-

悬浮输入

悬浮输入管脚

其它

保留

  IO 口的默认状态需要设置芯片配置选项,具体设置方法请参考第十章中的介绍。 ( X=A~F )

3.3.2  端口 A

  端口 A 的控制寄存器为:数据寄存器 P_IOA_Data 、方向寄存器 P_IOA_Dir 、属性寄存器 P_IOA_Attrib 和数据锁存寄存器 P_IOA_Buf 。

•  P_IOA_Data($00 , R/W)

  A 口的数据寄存器,用于向 A 口写入或从 A 口读出数据。当 A 口处于输入状态时,读 P_IOA_Data 寄存器将得到管脚的电平状态,向 P_IOA_Data 写入数据,其值将会存入数据锁存器( P_IOA_Buf )中。当 A 口处于输出状态时,写数据到 A 口的数据寄存器会存入数据锁存器( P_IOA_Buf ),同时在管脚输出相对应电平状态;读 P_IOA_Data 寄存器也将得到管脚的电平状态。 P_IOA_Data 数据寄存器单元的默认初值为 #00h 。

  端口 A 数据寄存器 P_IOA_Data 的设置见 表 3.4

表 3 . 4端口 A 数据寄存器 P_IOA_Data ( $00 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

P_IOA_Data

R/W

  Bit [7:0] P_IOA_Data :端口 A 数据寄存器

     读:读取端口 A 外部管脚上的电平状态值

     写:写入数据到端口 A 的数据锁存器中 ($59)

•  P_IOA_Buf($59 , R/W)

  A 口的数据锁存寄存器, P_IOA_Buf 是一个专门用于存储端口数据的寄存器,并用来对端口各管脚进行位操作,而不直接用 P_IOA_Data 寄存器来操作。而读取 P_IOA_Buf 的值则可得到上次写入寄存器 P_IOA_Data 或 P_IOA_Buf 的值。端口 A 数据锁存器 P_IOA_Buf 的默认初值为 #00h 。

  端口 A 数据锁存器 P_IOA_Buf 的设置见 表 3.5

表 3 . 5 端口 A 数据锁存器 P_IOA_Buf ( $59 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

P_IOA_Buf

R/W

•  P_IOA_Dir($04 , R/W)

  A 口的方向寄存器,用来设置 A 口是输入 / 输出状态。该方向控制寄存器可以写入或从该寄存器内读出方向控制向量。方向寄存器的每一个位决定了对应口位的输入 / 输出状态: 0 为输入, 1 为输出。 P_IOA_Dir 方向寄存器单元的默认初值为 #00h 。

  端口 A 方向寄存器 P_IOA_Dir 的设置见 表 3.6 :

表 3 . 6端口 A 方向寄存器 P_IOA_Dir ( $04 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

P_IOA_Dir

R/W

   Bit [7:0] P_IOA_Dir : 端口 A 方向寄存器

     0 = 输入

     1 = 输出

•  P_IOA_Attrib($08 , R/W)

  A 口的属性寄存器,用于 A 口属性的设置。

  端口 A 属性寄存器 P_IOA_Attrib 的设置见 表 3.7 :

表 3 . 7端口 A 属性寄存器 P_IOA_Attrib ( $08 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

P_IOA_Attrib

R/W

   Bit [7:0] P_IOA_Attrib :端口 A 属性寄存器

     0 = 不悬浮

     1 = 悬浮输入

【例 4-1 】: 将端口 A[7:0] 设置为输出状态,并输出数据:

 lda #00h         ; 将 #00h 写入累加器

 sta P_IOA_Attrib     ; 设置端口 A 的属性

 lda #FFh         ; 将 #FFh 写入累加器

 sta P_IOA_Dir       ; 将累加器值送入 P_IOA_Dir 寄存器中 ,IOA 端口为输出状态

 lda #00h

 sta P_IOA_Data      ; 设置端口 A 的数据 ,PA8~0 输出低电平

  对应的口位的设置见 表 3.8 :

表 3 . 8 I/O 口位设置

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

Dir

1

1

1

1

1

1

1

1

Attrib

0

0

0

0

0

0

0

0

Data

0

0

0

0

0

0

0

0

状态

低电平输出

  【例 4-2 】: 将端口 A[7:0] 设置为下拉输入:

 lda #00h       ; 将 #00h 写入累加器

 sta P_IOA_Dir     ; 将累加器值送入 P_IOA_Dir 寄存器中

 sta P_IOA_Attrib   ; 设置端口 A 的属性

 sta P_IOA_Data    ; 设置端口 A 的数据

  对应的口位的设置见 表 3.9

表 3 . 9 I/O 口位设置

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

Dir

0

0

0

0

0

0

0

0

Attrib

0

0

0

0

0

0

0

0

Data

0

0

0

0

0

0

0

0

状态

下拉电阻输入

3.3.3 端口 B

  端口 B 的控制寄存器为:数据寄存器 P_IOB_Data 、方向寄存器 P_IOB_Dir 、属性寄存器 P_IOB_Attrib 和数据锁存寄存器 P_IOB_Buf 。

■ 端口 B 数据寄存器 P_IOB_Data ( $01 , R/W );

■ 端口 B 方向寄存器 P_IOB_Dir ( $05 , R/W );

■ 端口 B 属性寄存器 P_IOB_Attrib ( $09 , R/W );

■ 端口 B 数据锁存器 P_IOB_Buf ( $5A , R/W )。

3.3.4  端口 C

  端口 C 的控制寄存器为:数据寄存器 P_IOC_Data 、方向寄存器 P_IOC_Dir 、属性寄存器 P_IOC_Attrib 和数据锁存寄存器 P_IOC_Buf 。

■ 端口 C 数据寄存器 P_IOC_Data ( $02 , R/W );

■ 端口 C 方向寄存器 P_IOC_Dir ( $06 , R/W );

■ 端口 C 属性寄存器 P_IOC_Attrib ( $0A , R/W );

■ 端口 C 数据锁存器 P_IOC_Buf ( $5B , R/W )。

3.3.5  端口 D

  端口 D 的控制寄存器为:数据寄存器 P_IOD_Data 、方向寄存器 P_IOD_Dir 、属性寄存器 P_IOD_Attrib 和数据锁存寄存器 P_IOD_Buf 。

■ 端口 D 数据寄存器 P_IOD_Data ( $03 , R/W );

■ 端口 D 方向寄存器 P_IOD_Dir ( $07 , R/W );

■ 端口 D 属性寄存器 P_IOD_Attrib ( $0B , R/W );

■ 端口 D 数据锁存器 P_IOD_Buf ( $5C , R/W )。

3.3.6 端口 E

  端口 E 的控制寄存器为:数据寄存器 P_IOE_Data 、方向寄存器 P_IOE_Dir 、属性寄存器 P_IOE_Attrib 和数据锁存寄存器 P_IOE_Buf 。

■ R/W );

■ 端口 E 方向寄存器 P_IOE_Dir ( $42 , R/W );

■ 端口 E 属性寄存器 P_IOE_Attrib ( $44 , R/W );

■ 端口 E 数据锁存器 P_IOE_Buf ( $5D , R/W )。

3.3.7 端口 F

  端口 F 的控制寄存器为:数据寄存器 P_IOF_Data 、方向寄存器 P_IOF_Dir 、属性寄存器 P_IOF_Attrib 和数据锁存寄存器 P_IOF_Buf 。

■ 端口 F 数据寄存器 P_IOF_Data ( $41 , R/W );

■ 端口 F 方向寄存器 P_IOF_Dir ( $43 , R/W );

■ 端口 F 属性寄存器 P_IOF_Attrib ( $45 , R/W );

■ 端口 F数据锁存器 P_IOF_Buf ( $5E , R/W )。

3.4 特殊功能

  SPMC65 系列单片机的 I/O 端口除了具有一般的输入 / 输出功能外,还提供了一些特殊功能或与片内硬件功能模块复用;其中,端口 F 没有特殊功能或复用功能。

3.4.1 端口 A 特殊功能:

  端口 A 可以作为 A/D 转换的输入通道,具体见 表 3.11 ,端口 A 的特殊功能详细见 A/D 部分。

3.4.2 端口 B 特殊功能:

  PB7 既可以作为 A/D 转换的输入通道,也可以作为 A/D 转换的外部参考电压输入; PB6 可以驱动频率式蜂鸣器; PB[5:4] 可以作为 Timer 外部事件输入或中断输入管脚; PB[3:2] 可以作为比较输出或 PWM 输出管脚; PB[1:0] 可以为捕获输入或 Timer 外部事件输入管脚。

  SPMC65 系列单片机支持慢速输出功能, PB[7:6] 通常情况下作为普通 I/O 口,但是如果将信号斜率控制寄存器 P_IO_Opt ($35) 的 bit0 设置为 1 ,便会打开 PB[7:6] 的慢速输出功能;此时当 PB[7:6] 输出从高电平变为低电平,将会延迟 250ns 左右,具体延迟时间由系统时钟( F SYS )决定。当单片机在进行远距离通信时,慢速输出功能可以防止电磁干扰。 P_IO_Opt 寄存器见 表 3.10 。端口 B 的复用情况见 表 3.11 。

表 3 . 10 慢速输出功能控制寄存器 P_IO_Opt ( $35 , R/W )

Bit7

Bit6

Bit5

Bit4

Bit3

Bit2

Bit1

Bit0

-

-

-

-

-

-

-

SLOWE

-

-

-

-

-

-

-

R/W

Bit [7:1] 保留

Bit 0   SLOWE :慢速输出功能使能位

     1=PB[7:6] 开启慢速输出功能

     0=PB[7:6] 关闭慢速输出功能

  注:该寄存器必须连续写两次相同的值才能将值写入,该寄存器默认初值为 #00h 。

3.4.3 端口 C 特殊功能:

  PC[7:6] 可以用作 IIC 总线的复用端口、 PC[5:4] 可用于 UART 通讯接口、 PC[3:0] 用作 SPI 通讯接口。端口 C 各个管脚复用的特殊功能见 表 3.11 。

3.4.4 端口 D 特殊功能:

  PD[7:6] 可作为比较输出或 PWM 输出管脚、 PD[5:4] 可作为外部中断输入或 Timer 外部事件输入管脚、PD[3:2] 可用于比较输出或 PWM 输出管脚、 PD[1:0] 可用作外部中断输入管脚。端口 D 各个管脚复用的特殊功能见 表 3.11 ,详细描述见相应的章节。

3.4.5 端口 E 特殊功能:

  PE6 可以作为 D/A 转换的输出管脚, PE[5:2] 可以用于模拟电压比较器输入及比较参考电压输入。端口 E 各个管脚复用的特殊功能见 表 3.11 ,详细描述见相应的章节。

表 3 . 11 端口特殊功能

管脚

特殊功能

管脚

特殊功能

PA7

ADC 模拟电压输入

PC3

SPI 数据输出

PA6

ADC 模拟电压输入

PC2

SPI 数据输入

PA5

ADC 模拟电压输入

PC1

SPI 时钟输出 / 时钟输入

PA4

ADC 模拟电压输入

PC0

SPI 片选

PA3

ADC 模拟电压输入

PD7

Timer 5 比较输出 /PWM 输出

PA2

ADC 模拟电压输入

PD6

Timer 4 比较输出 /PWM 输出

PA1

ADC 模拟电压输入

PD5

外部中断 5 输入 /Timer 5 的捕获输入 /Timer 5 的外部事件输入

PA0

ADC 模拟电压输入

PD4

外部中断 4 输入 /Timer 4 的捕获输入 /Timer 4 的外部事件输入

PB7

ADC 模拟电压输入 或 A/D 外部参考电压输入

PD3

Timer 2 比较输出 /PWM 输出

PB6

蜂鸣器输出

PD2

Timer 3 比较输出 /PWM 输出

PB5

外部中断 1 输入 /Timer 3 的捕获输入 / Timer3 的外部事件输入

PD1

外部中断 3 输入

PB4

外部中断 0 输入 /Timer 2 的捕获输入 /Timer2 的外部事件输入

PD0

外部中断 2 输入

PB3

Timer 1 比较输出 / PWM 输出

PE7

PB2

Timer 0 比较输出 /PWM 输出

PE6

D/A 输出

PB1

Timer 1 的捕获输入 /Timer 1 的外部事件输入

PE5

比较器 1 输入

PB0

Timer 0 的捕获输入 /Timer 0 的外部事件输入

PE4

比较器 1 参考输入

PC7

IIC 数据线

PE3

比较器 0 输入

PC6

IIC 时钟线

PE2

比较器 0 参考输入

PC5

UART 接收信号

PE1

PC4

UART 发送信号

PE0

  SPMC65 系列单片机的端口在使用前一般都需要对端口进行初始化,比如要使用端口 A 作为带下拉电阻的输入口时,就要在使用之前对端口进行初始化;而对于端口的复用功能在使用前,也有部分复用功能需要先初始化 I/O 口状态,比如需要用到外部中断输入的复用功能时,就要事先把对应的 I/O 端口设置为输入状态;类似的还有捕获输入、串行通讯接口。而部分复用功能在使用前是无需初始 I/O 端口状态的,如 ADC 输入、 DAC 输出、电压比较器功能、蜂鸣器输出、 PWM 输出、比较输出。具体的复用功能所需要的端口初始化要求请参考后面章节的介绍。

3.5 I/O 端口应用

  【 4-3 】:采用 32 管脚的 SPMC65P2408A ,外接四个按键,当按键按下或放开时,相应的发光二极管便会被熄灭或点亮用作指示。此例主要介绍 I/O 口的简单应用。

  程序如下:

  子函数 Switchx4.asm

CB_CmpTimers       EQU 6 ; 最大比较次数

.PAGE0

GB_KeyValue       DS 1 ; 键值

GB_KeyDownFlag     DS 1 ; 键值改变标志

IB_LastValue      DS 1 ; 最后一次的键值

IB_CmpTimers      DS 1 ; 键值的平均比较次数

.DATA

.CODE

.PUBLIC     F_PAInit

F_PAInit:

lda       #0

sta       P_IOA_Attrib

lda       #$F0

sta       P_IOA_Dir

sta       P_IOA_Data

rts

;===================================================

.PUBLIC         F_SWx4

F_SWx4:

lda    P_IOA_Data         ;扫描键盘

and    #$0F            ;得到键盘值

cmp    GB_KeyValue        ;键盘改变否

beq    ?L_SWx4Exit        ;没有改变

cmp    IB_LastValue        ;和上次取得键值比较

beq    ?L_TimersInc        ;相等?

sta    IB_LastValue

jmp    ?L_CmpClr

?L_TimersInc:

inc    IB_CmpTimers        ;

lda    IB_CmpTimers        ;

cmp    #CB_CmpTimers       ;比较 6 次键值,去抖采用 4ms 每次读取键盘值

bcc    ?L_SWx4Exit        ;

lda IB_LastValue          ;

sta GB_KeyValue           ;

lda    #1

sta    GB_KeyDownFlag       ; 设置键值改变标志

?L_CmpClr:

lda    #0

sta    IB_CmpTimers

?L_SWx4Exit:

rts

;==================================================

.PUBLIC   F_Light

F_Light:               ; 根据相应的键值,点亮对应的数码管

lda    GB_KeyValue

asl    a

asl    a

asl    a

asl    a

eor    #$F0

sta    P_IOA_Data

rts

  硬件原理如 图 3.2 所示:

图3.2 键盘及 LED 原理图

4-4 】:本例采用 28 管脚的 SPMC65P2408A ,外接四个数码管作为显示部分。在程序中开辟了一个四字节的连续空间作为显示缓冲区,往这四个地址里分别写入数据( 0~F )便可以通过外接数码管显示出来。程序如下:

C_4MsOver     EQU  1    ;4ms 中断标志

.PAGE0

GB_ShowBuf   DS  4     ; 定义一个 4 字节显示空间
      
GB_IndexCom   DS  1    ; 控制 LED 顺序

.DATA

.CODE

F_LED_4Disp:

ldx   GB_IndexCom
  
inx              ;LED 扫描
  
cpx   #4          ;LED 扫描结束 ?
  
bcs   ?L_ClearX       ; 结束
  
stx   GB_IndexCom
  
jmp   ?L_Show

?L_ClearX:

ldx   #$00
  
stx   GB_IndexCom      ; 从第一个 LED 开始显示

?L_Show:

lda   #$00
  
sta   P_IOA_Data       ; 清屏
  
lda   T_SevenComTable,x
  
sta   P_IOC_Data       ;
  
lda   GB_ShowBuf,x      ; 从缓冲区得到数据
  
tax   
  
lda   T_SevenSegTable,x    ; 得到段码
  
sta   P_IOA_Data       ; 将段码送到 A?口

?L_Div_End:

rts

;=========================================================

F_IO_Init:

lda   #$00         ;
  
sta   P_IOA_Data      ;
  
sta   P_IOA_Buf      ; 初始化 A 口为低电平输出
  
sta   P_IOA_Attrib
  
lda   #$FF
  
sta   P_IOA_Dir
  
lda   #0
  
sta   P_IOC_Data
  
sta   P_IOC_Buf
  
lda   #0          ; 初始化 C 口为低电平输出
  
sta   P_IOC_Attrib
  
lda   #$F
  
sta   P_IOC_Dir

rts

;================================================================

F_DispBuf_Init:

lda   #$1          ;
  
sta   GB_ShowBuf      ;
  
lda   #$2          ;
  
sta   GB_ShowBuf+1     ; 缓冲区初始化
  
lda   #$3          ;
  
sta   GB_ShowBuf+2     ;
  
lda   #$4          ;
  
sta   GB_ShowBuf+3     ;

rts

;===========================================================

T_SevenComTable: ; 位码

DB   %00000001       ;LED '1'
         
DB   %00000010       ;LED '2'
         
DB   %00000100       ;LED '3'
         
DB   %00001000       ;LED '4'

T_SevenSegTable: ; 段码

DB   %00111111       ; 字符 '0'
         
DB   %00000110       ; 字符 '1'
         
DB   %01011011       ; 字符 '2'
         
DB   %01001111       ; 字符 '3'
         
DB   %01100110       ; 字符 '4'
         
DB   %01101101       ; 字符 '5'
         
DB   %01111101       ; 字符 '6'
         
DB   %00000111       ; 字符 '7'
         
DB   %01111111       ; 字符 '8'
         
DB   %01101111       ; 字符 '9'
         
DB   %01110111       ; 字符 'A'
         
DB   %01111100       ; 字符 'B'
         
DB   %00111001       ; 字符 'C'
         
DB   %01011110       ; 字符 'D'
         
DB   %01111001       ; 字符 'E'
         
DB   %01110001       ; 字符 'F'

  硬件原理如 图 3.3 所示:

图 3 . 3 LED 扫描原理图

版权所有:北京凌阳爱普科技有限公司 京ICP备05061966号 未经许可网站内容严禁复制、转载,任何人不得擅自使用
友情链接:凌阳爱普 嵌入式培训 安卓培训 凌阳大学计划 北京嵌入式培训 深圳嵌入式培训 成都嵌入式培训