一、SH79F9476 I/O端口介绍
1. 特性
- SH79F9476提供了30/26位可编程双向 I/O 端口;
- 端口数据在寄存器Px中;
- 端口控制寄存器PxCRy是控制端口作为输入还是输出;
- 端口作为输入时,每个I/O端口均带有PxPCRy控制的内部上拉电阻。
- 有些I/O引脚功能是复用的,所有功能都允许时,CPU存在优先权避免冲突。
2. 端口模块图
3. 寄存器
(1)端口控制寄存器 PxCRy
寄存器PxCRy用来控制端口的输入、输出功能,其中x的取值范围是0~3, y的取值是0~7 。
位定义如下表所示:
寄存器 | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
---|---|---|---|---|---|---|---|---|
P0CR (E1H, Bank0) | P0CR.7 | P0CR.6 | P0CR.5 | P0CR.4 | P0CR.3 | P0CR.2 | P0CR.1 | P0CR.0 |
P1CR (E2H, Bank0) | P1CR.7 | P1CR.6 | P1CR.5 | P1CR.4 | P1CR.3 | P1CR.2 | P1CR.1 | P1CR.0 |
P2CR (E3H, Bank0) | P2CR.7 | P2CR.6 | P2CR.5 | P2CR.4 | P2CR.3 | P2CR.2 | P2CR.1 | P2CR.0 |
P3CR (E4H, Bank0) | - | - | P3CR.5 | P3CR.4 | P3CR.3 | P3CR.2 | P3CR.1 | P3CR.0 |
读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 |
复位值 (POR/WDT/LVR/PIN) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 值0为输入模式;
- 值1为输出模式。
代码示例:
P1CR |=0x01; //配置Port P1端口的bit0为输出模式
(2)端口上拉电阻控制寄存器
当IO端口作为输入时,每个I/O端口带有由PxPCRy控制的内部上拉电阻,详细定义如下:
寄存器 | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
---|---|---|---|---|---|---|---|---|
P0PCR (E9H, Bank0) | P0PCR.7 | P0PCR.6 | P0PCR.5 | P0PCR.4 | P0PCR.3 | P0PCR.2 | P0PCR.1 | P0PCR.0 |
P1PCR (EAH, Bank0) | P1PCR.7 | P1PCR.6 | P1PCR.5 | P1PCR.4 | P1PCR.3 | P1PCR.2 | P1PCR.1 | P1PCR.0 |
P2PCR (EBH, Bank0) | P2PCR.7 | P2PCR.6 | P2PCR.5 | P2PCR.4 | P2PCR.3 | P2PCR.2 | P2PCR.1 | P2PCR.0 |
P3PCR (ECH, Bank0) | - | - | P3PCR.5 | P3PCR.4 | P3PCR.3 | P3PCR.2 | P3PCR.1 | P3PCR.0 |
读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 |
复位值 (POR/WDT/LVR/PIN) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
- 值0:内部拉电阻关闭;
- 值1:内部上拉电阻开启。
使用示例:
P0PCR |= 0x02; // P0PCR.1 内部上拉电阻开启
(3)端口数据寄存器
端口数据寄存器用来读写端口值,定义如下:
寄存器 | 位7 | 位6 | 位5 | 位4 | 位3 | 位2 | 位1 | 位0 |
---|---|---|---|---|---|---|---|---|
P0 (80H, Bank0) | P0.7 | P0.6 | P0.5 | P0.4 | P0.3 | P0.2 | P0.1 | P0.0 |
P1 (90H, Bank0) | P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 |
P2 (A0H, Bank0) | P2.7 | P2.6 | P2.5 | P2.4 | P2.3 | P2.2 | P2.1 | P2.0 |
P3 (B0H, Bank0) | - | - | P3.5 | P3.4 | P3.3 | P3.2 | P3.1 | P3.0 |
读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 |
复位值(POR/WDT/LVR/PIN) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
使用示例:
P1_0 = 0; // 控制P1_0pin输出低电平
P1 = 0; // 控制P1 8个引脚全输出低电平
(4)P0口输出电压控制寄存器
P0.0~P0.3口可输出 1/2VDD 电压,由P0V0单独控制。
寄存器 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 第0位 |
---|---|---|---|---|---|---|---|---|
P0V0 (AFH, Bank0) | P0V0 | P0R1 | P0R0 | - | - | P03VO | P02VO | P01VO |
读/写 | 读/写 | 读/写 | 读/写 | - | - | 读/写 | 读/写 | 读/写 |
复位值(POR/WDT/LVR/PIN) | 0 | 0 | - | - | 0 | 0 | 0 | 0 |
位编号 | 位符号 | 说明 |
---|---|---|
7-6 | PORX (x=0-1) | P0RX:分压电阻选择 00: 分压电阻选择10K 分压电阻选择20K 分压电阻选择40K 分压电阻选择80K |
3-0 | P0xVO(x=0-3) | P0.x输出电平选择 0: 普通I/O 1: Pxy输出VDD/2 |
示例,让P0_0输出0.2V电压
#include "SH79F9476.h"
void main(){
// 配置Port P0端口Bit0为输出模式
P0CR |= 0x01;
// P0的 0-3 端口输出2V
P0V0 = 0x0f;
// 输出低电平
P0_0 = 1;
while(1);
}
(5)端口模式选择寄存器
PIMS0
控制P0口输入电平逻辑控制,即控制输入时的高、低电平阈值。
寄存器 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 第0位 |
---|---|---|---|---|---|---|---|---|
PIMS0 (D4H, Bank1) | P07S | P06S | - | - | P03S | P02S | P01S | P00S |
读/写 | 读/写 | 读/写 | - | - | 读/写 | 读/写 | 读/写 | 读/写 |
复位值(POR/WDT/LVR/PIN) | 0 | 0 | - | - | - | - | 0 | 0 |
值说明:
位编号 | 位符号 | 说明 |
---|---|---|
7-6 | P0xS | P0.x 输入电平逻辑控制位(不包含端口数据寄存器输入) 0:输入高电平阈值为0.8V DD ,输入低电平阈值为0.2V DD (带施密特) 1:输入高电平阈值为2.0V,输入低电平阈值为0.8V(V DD = 4.5-5.5V)(TTL逻辑) 输入高电平阈值为0.25V DD +0.8,输入低电平阈值为0.15V DD (V DD = 2.7V-4.5V) 注:PowerDown模式下,TLL逻辑无效。 |
1-0 | P0xS | P0.x 输入电平逻辑控制位(不包含端口数据寄存器输入) 0:输入高电平阈值为0.8V DD ,输入低电平阈值为0.2V DD (带施密特) 1:输入高电平阈值为2.0V,输入低电平阈值为0.8V(V DD = 4.5-5.5V)(TTL逻辑) 输入高电平阈值为0.25V DD +0.8,输入低电平阈值为0.15V DD (V DD = 2.7V-4.5V) 注:PowerDown模式下,TLL逻辑无效。 |
PIMS1
控制功能与PIMS0类似 。
D5H,Bank1 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 第0位 |
---|---|---|---|---|---|---|---|---|
PIMS1 | - | P15S | P14S | - | - | P11S | P10S | |
读/写 | - | 读/写 | 读/写 | - | - | 读/写 | 读/写 | |
复位值 (POR/WDT/LVR/PIN) | - | 0 | 0 | - | - | 0 | 0 |
其中:
- P15S、P14S 值定义与 P07S、P06S 值定义相同,
- P11S、P10S 值定义与 P01S、P00S 值定义相同。
PIMS2
D6H,Bank1 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 第0位 |
---|---|---|---|---|---|---|---|---|
PIMS2 | P27S | P26S | - | - | - | - | - | - |
读/写 | 读/写 | 读/写 | - | - | - | - | - | - |
复位值 (POR/WDT/LVR/PIN) | 0 | 0 | - | - | - | - | - | - |
其中:
- P27S、P26S的P07S、P06S 值定义相同。
PIMS3
D7H,Bank1 | 第7位 | 第6位 | 第5位 | 第4位 | 第3位 | 第2位 | 第1位 | 第0位 |
---|---|---|---|---|---|---|---|---|
PIMS2 | - | - | P35S | P34S | P33S | P32S | P31S | P30S |
读/写 | - | - | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 | 读/写 |
复位值 (POR/WDT/LVR/PIN) | - | - | 0 | 0 | 0 | 0 | 0 | 0 |
其中:P35S~P30S 值定义与P07S、P06S 值定义相同。
4. 其它说明
- 输入端口读操作直接读引脚电平。
- 输出端口读操作的输入源有两种,一种是从端口数据寄存器读取,另一种是直接读引脚电平。
- 用读取指令来区分:读 - 改 - 写指令是读寄存器,而其它指令读引脚电平。
- 不管端口是否共享为其它功能,对端口写操作都是针对端口数据寄存器。
二、示例程序
下面简单的示例程序,设置P0端口的:
- Pin0 :输入状态
- Pin1 :输出模式,固定输出低电平
- Pin2 :输出模式
Pin2的值跟随Pin0变化,Pin0接地时,Pin2输出低电平;Pin0接高电平时,Pin2输出高电平。
#include "SH79F9476.h"
#include "cpu.h"
void main()
{
P0CR &= 0xFE; // 配置Port P0端口的bit0为输入模式
P0CR |= 0x02; // 配置Port P0端口bit1为输出模式
P0CR |= 0x04; // Port P0 bit2 为输出模式
P0V0 = 0x00; // 正常电压输出
P0_1 = 0;
while(1){
// 读取bit0
P0_2 = P0_0;
}
}
本系列博文代码开源地址:
https://gitee.com/xundh/learn-sinowealth-51