中颖51芯片学习2. IO端口操作

一、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.7P0CR.6P0CR.5P0CR.4P0CR.3P0CR.2P0CR.1P0CR.0
P1CR (E2H, Bank0)P1CR.7P1CR.6P1CR.5P1CR.4P1CR.3P1CR.2P1CR.1P1CR.0
P2CR (E3H, Bank0)P2CR.7P2CR.6P2CR.5P2CR.4P2CR.3P2CR.2P2CR.1P2CR.0
P3CR (E4H, Bank0)--P3CR.5P3CR.4P3CR.3P3CR.2P3CR.1P3CR.0
读/写读/写读/写读/写读/写读/写读/写读/写读/写
复位值 (POR/WDT/LVR/PIN)00000000
  • 值0为输入模式;
  • 值1为输出模式。

代码示例:

P1CR |=0x01;    //配置Port P1端口的bit0为输出模式 

(2)端口上拉电阻控制寄存器

当IO端口作为输入时,每个I/O端口带有由PxPCRy控制的内部上拉电阻,详细定义如下:

寄存器位7位6位5位4位3位2位1位0
P0PCR (E9H, Bank0)P0PCR.7P0PCR.6P0PCR.5P0PCR.4P0PCR.3P0PCR.2P0PCR.1P0PCR.0
P1PCR (EAH, Bank0)P1PCR.7P1PCR.6P1PCR.5P1PCR.4P1PCR.3P1PCR.2P1PCR.1P1PCR.0
P2PCR (EBH, Bank0)P2PCR.7P2PCR.6P2PCR.5P2PCR.4P2PCR.3P2PCR.2P2PCR.1P2PCR.0
P3PCR (ECH, Bank0)--P3PCR.5P3PCR.4P3PCR.3P3PCR.2P3PCR.1P3PCR.0
读/写读/写读/写读/写读/写读/写读/写读/写读/写
复位值 (POR/WDT/LVR/PIN)00000000
  • 值0:内部拉电阻关闭;
  • 值1:内部上拉电阻开启。

使用示例:

P0PCR |= 0x02;   // P0PCR.1 内部上拉电阻开启

(3)端口数据寄存器

端口数据寄存器用来读写端口值,定义如下:

寄存器位7位6位5位4位3位2位1位0
P0 (80H, Bank0)P0.7P0.6P0.5P0.4P0.3P0.2P0.1P0.0
P1 (90H, Bank0)P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0
P2 (A0H, Bank0)P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.0
P3 (B0H, Bank0)--P3.5P3.4P3.3P3.2P3.1P3.0
读/写读/写读/写读/写读/写读/写读/写读/写读/写
复位值(POR/WDT/LVR/PIN)00000000

使用示例:

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)P0V0P0R1P0R0--P03VOP02VOP01VO
读/写读/写读/写读/写--读/写读/写读/写
复位值(POR/WDT/LVR/PIN)00--0000
位编号位符号说明
7-6PORX (x=0-1)P0RX:分压电阻选择
00: 分压电阻选择10K
分压电阻选择20K
分压电阻选择40K
分压电阻选择80K
3-0P0xVO(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 端口输出2VP0V0 = 0x0f;// 输出低电平P0_0 = 1;while(1);
}

(5)端口模式选择寄存器

PIMS0

控制P0口输入电平逻辑控制,即控制输入时的高、低电平阈值。

寄存器第7位第6位第5位第4位第3位第2位第1位第0位
PIMS0 (D4H, Bank1)P07SP06S--P03SP02SP01SP00S
读/写读/写读/写--读/写读/写读/写读/写
复位值(POR/WDT/LVR/PIN)00----00

值说明:

位编号位符号说明
7-6P0xSP0.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-0P0xSP0.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-P15SP14S--P11SP10S
读/写-读/写读/写--读/写读/写
复位值 (POR/WDT/LVR/PIN)-00--00

其中:

  • P15S、P14S 值定义与 P07S、P06S 值定义相同,
  • P11S、P10S 值定义与 P01S、P00S 值定义相同。
PIMS2
D6H,Bank1第7位第6位第5位第4位第3位第2位第1位第0位
PIMS2P27SP26S------
读/写读/写读/写------
复位值 (POR/WDT/LVR/PIN)00------

其中:

  • P27S、P26S的P07S、P06S 值定义相同。
PIMS3
D7H,Bank1第7位第6位第5位第4位第3位第2位第1位第0位
PIMS2--P35SP34SP33SP32SP31SP30S
读/写--读/写读/写读/写读/写读/写读/写
复位值 (POR/WDT/LVR/PIN)--000000

其中: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){// 读取bit0P0_2 = P0_0;}
}

本系列博文代码开源地址:
https://gitee.com/xundh/learn-sinowealth-51

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/597011.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java Spring IoCDI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性

💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录文章:Java Spring IoC&DI :探索Java Spring中控制反转和依赖注入的威力,增强灵活性和可维护性 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 前提小知识:高内…

一点点金融

一点点金融 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多趋势分析 改进MACD策略,使用涨跌幅比值RSI计算MACD原始MACD计算改进思路:使用涨跌幅比值RSI计算MACD 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多…

使用AI开源引擎构建:智能文档处理系统提升企业生产效率

企业面临着海量文档的处理和管理挑战。智能文档处理技术(Intelligent Document Processing, IDP)应运而生,旨在通过人工智能(AI)技术提高文档处理的效率和准确性。本文将探讨IDP技术的核心功能、应用场景以及对企业效率…

RGB三通道和灰度值的理解

本文都是来自于chatGPT的回答!!! 目录 Q1:像素具有什么属性?Q2:图像的色彩是怎么实现的?Q3:灰度值和颜色值是一个概念吗?Q4:是不是像素具有灰度值,也有三个颜色分量RGB?Q5:灰度图像是没有色彩的吗?Q6: 彩色图像是既具有灰度值也具有RGB三…

数据流图

数据字典 数据流图平衡原则 父图与子图之间的平衡子图内平衡

Java中利用BitMap位图实现海量级数据去重

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 前言 什么是BitMap?有什么用? 基本概念 位图的优势 …

多模态系列-综述Video Understanding with Large Language Models: A Survey

本文是LLM系列文章,针对《Video Understanding with Large Language Models: A Survey》的翻译。 论文链接:https://arxiv.org/pdf/2312.17432v2.pdf 代码链接:https://github.com/yunlong10/Awesome-LLMs-for-Video-Understanding 大型语言模型下的视频理解研究综述 摘要…

面试(02)————Java基础和集合

一、Java基础知识 1、面向对象的特征 2、Java 的基本数据类型有哪些 3、JDK JRE JVM 的区别 4、重载和重写的区别 5、Java中和equals的区别 6 、String、StringBuffer、StringBuilder三者之间的区别 7、接口和抽象类的区别是什么? 8、反射 9、jdk1.8 的新特…

C/C++预处理过程

目录 前言: 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作用的宏参数 5. 宏替换的规则 6. 宏和函数的对比 7. #和## 8. 命名约定 9. #undef 10. 命令行定义 11. 条件编译 12. 头文件的包含 13. 其他预处理指令 总结&#x…

JS详解-class-类的核心语法关于ES6与ES5

class基本核心语法: //定义类class Person{//公有属性(推荐此处定义)name// 定义属性并设置默认值price 100//构造函数constructor(name,age){// 构造函数内部的this实例化对象this.name namethis.age age// 动态添加属性(不推荐,查找麻烦)this.rank …

JavaScript-1(变量+数据类型+数据类型转换)

目录​​​​​​​ 1.计算机 编程语言 计算机基础 2.JS JS是什么 浏览器执行JS JS组成 ECMAScript DOM——文档对象模型 BOM——浏览器对象模型 JS写法 JS注释 JS输入输出语句 3.变量 变量的使用 变量使用注意点 变量小结 4.数据类型 变量的数据类型 基本…

Python免滑块验证脚本

说明 这是一个用于自动登录京东并更新Cookie到青龙管理系统的Python脚本。脚本支持通过账号密码自动登录,适用于需要定期更新京东Cookie的情况,特别是在使用青龙等自动化工具进行京东相关活动脚本运行时。 代码展示 全代码如下 # -*- coding: utf-8 -*- jdck.ini配置文件…