N76E003最多支持26个可位寻址的通用I/O引脚,分成4组 P0 到 P3 。每一个端口有它的端口控制寄存器(Px)。端口控制寄存器的写和读有不同的意思。写端口控制寄存器设置输出锁存逻辑值,读端口引脚的逻辑状态。所有I/O引脚(除P2.0)可以被软件独立配置成四种I/O模式中的一种。这四种模式是准双向模式(标准8051端口结构)、推挽输出、输入和开漏模式。每一个端口通过两个特殊功能寄存器PxM1 和 PxM2来选择端口Px的I/O模式。下表指示如何选择Px.n的I/O模式。注意任何复位之后,默认的配置是高阻输入模式。

所有I/O引脚可以通过PxS寄存器里对应的位选择为TTL电平输入或施密特触发输入 。施密特触发输入有更好的抗干扰能力。所有的I/O引脚可通过软件选择位控制,斜率输出能力。输出斜率控制寄存器是PxSR。默认是慢斜率。.如果用户想要增加I/O引脚输出速率,设置PxSR的相应位,将斜率设置成高速输出。
当配置RPD (CONFIG0.2) 为0,P2.0被配置为输入引脚。同时P2.0将永远在输入模式和施密特触发模式,通过P20UP(P2S.7)使能内部上拉电阻。如果RPD未编程,P2.0作为外部复位引脚,P2.0作为管脚功能无效,由于作为复位脚,内部上拉电阻始终有效,此种状态下读取P2.0的值始终为0.

准双向模式
准双向模式作为标准8051的I/O结构,可以同时用作输入和输出。当端口输出逻辑高时,驱动能力较弱,同时允许外部器件将电平拉低。当引脚被拉低时有强驱动能力,会吸收大电流。在准双向I/O 结构中,有三个上拉MOS管,适应不同的应用。其中一个上拉叫做特弱上拉,当端口锁定在逻辑1时,打开特弱上拉,特弱上拉有很小电流将引脚拉高。
第二种上拉为“弱上拉”,当外部端口引脚自身处于逻辑1时打开。这种上拉提供源电流以使准双向引脚输出1。如果引脚为逻辑1,被外部器件拉低, “弱上拉”关闭, 仅有“特弱上拉”打开。 此时要将引脚拉低,外部器件要有足够的灌电流 (大于ITL)以克服“弱上拉”,并使端口的电压低于输入门限电压 (低于VIL)。

第三种上拉为“强上拉”。这种上拉用于在准双向口引脚上,加速端口电平由逻辑0转为逻辑1的转换速度。 当这种
情况发生时,打开强上拉用两个CPU时钟的时间快速地将端口引脚拉高。 然后就关闭,弱上拉和特弱上拉继续
保持该端口引脚为高。 准双向端口结构如下所示。

推挽模式

推挽输出模式与准双向输出模式有相同的下拉结构。当端口锁定为1时,提供持续的强上拉。推挽输出模式用于需要从端口输出大电流时的应用。

输入高阻模式

输入模式提供真实的高阻输入路径。虽然准双向模式也可以作为输入引脚,但是它需要相对强的输入源。输入模式的好处是减少在逻辑0时电流的消耗,如果是准双向模式,逻辑0时总是消耗来自VDD 的电流。用户需要注意的是,输入模式应该由外部设备或电阻提供一个确定的电平。悬浮的引脚在掉电状态下会引起漏电。

开漏模式
开漏输出配置关闭所有内部上拉,当端口锁定为逻辑0时,仅打开驱动端口的下拉晶体管。当端口锁存为逻辑1
时,它就和输入模式一样。通常用于I2C输出线上,开漏引脚需要加一个外部上拉电阻,典型连一个电阻到
VDD。 用户需要注意的是,开漏模式输出逻辑1的时候,应该由外部设备或电阻提供一个确定的电平。悬浮的引
脚在掉电状态下会引起漏电。

读-修改-写 指令
从SFR或内部RAM读一个字节,修改它,并重新写回去的指令,叫做读-修改-写指令。当目标是一个I/O端口或
一个端口位,这些指令读内部输出锁存而不是外部引脚的状态,这种指令读端口SFR的值,修改它并写回到SFR
端口。所有读-修改-写的指令如下所列:

指令 描述
ANL 逻辑 与. (ANL direct, A and ANL direct, #data)
ORL 逻辑 或. (ORL direct, A and ORL direct, #data)
XRL 逻辑 异或 OR. (XRL direct, A and XRL direct, #data)

JBC if bit = 1 转跳指令并清除. (JBC bit, rel)
CPL 位取反. (CPL bit)
INC 加一指令. (INC direct)
DEC 减一指令. (DEC direct)
DJNZ 减一不为零转跳指令. (DJNZ direct, rel)
MOV bit, C 移进位标志到位. (MOV bit, C)
CLR bit 清位. (CLR bit)
SETB bit 置位. (SETB bit)

最后三条指令看似不是明显的读-修改-写指令,实际它们就是读-修改-写指令。 可以读整个端口锁定值,修改改变位,写入新的值。

管脚控制寄存器
N76E003有许多I/O控制寄存器提供灵活的各种应用。和I/O端口相关的SFRs可以分类成四组:输入输出控制,输出模式控制、输入类型和灌电流控制,输出斜率控制。所有SFRs如下所列:
输入输出数据控制 
这些寄存器是I/O输入输出数据缓存。读获取I/O输入的数据。写驱动数据输出,所有这些寄存器都是可位寻址的。

输出模式控制
这些寄存器控制输出模式。配置为输出模式在四种模式中:输入模式、准双向模式、推挽或开漏模式。每一个引脚可以独立地配置。对P2.0引脚,有一个上拉电阻控制位是P2S.7。

输入类型
每一个 I/O 引脚可以独立地配置成TTL输入或施密特触发输入。注意所有PxS 寄存器通过切换SFR页到页1来访问。

输出斜率控制
N76E003可单独控制管脚输出斜率。默认情况下,管脚采用普通斜率模式。当用户切换到高速斜率模式时,每个管脚斜率可看到显著变化。注更改PxSR寄存器需要将SFR页切换到页1 。

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h" //***************** The Following is in define in Fucntion_define.h ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0
////------------------- Define Port as Quasi mode -------------------
//#define P00_Quasi_Mode P0M1&=~SET_BIT0;P0M2&=~SET_BIT0
//#define P01_Quasi_Mode P0M1&=~SET_BIT1;P0M2&=~SET_BIT1
//#define P02_Quasi_Mode P0M1&=~SET_BIT2;P0M2&=~SET_BIT2
//#define P03_Quasi_Mode P0M1&=~SET_BIT3;P0M2&=~SET_BIT3
//#define P04_Quasi_Mode P0M1&=~SET_BIT4;P0M2&=~SET_BIT4
//#define P05_Quasi_Mode P0M1&=~SET_BIT5;P0M2&=~SET_BIT5
//#define P06_Quasi_Mode P0M1&=~SET_BIT6;P0M2&=~SET_BIT6
//#define P07_Quasi_Mode P0M1&=~SET_BIT7;P0M2&=~SET_BIT7
//#define P10_Quasi_Mode P1M1&=~SET_BIT0;P1M2&=~SET_BIT0
//#define P11_Quasi_Mode P1M1&=~SET_BIT1;P1M2&=~SET_BIT1
//#define P12_Quasi_Mode P1M1&=~SET_BIT2;P1M2&=~SET_BIT2
//#define P13_Quasi_Mode P1M1&=~SET_BIT3;P1M2&=~SET_BIT3
//#define P14_Quasi_Mode P1M1&=~SET_BIT4;P1M2&=~SET_BIT4
//#define P15_Quasi_Mode P1M1&=~SET_BIT5;P1M2&=~SET_BIT5
//#define P16_Quasi_Mode P1M1&=~SET_BIT6;P1M2&=~SET_BIT6
//#define P17_Quasi_Mode P1M1&=~SET_BIT7;P1M2&=~SET_BIT7
//#define P20_Quasi_Mode P2M1&=~SET_BIT0;P2M2&=~SET_BIT0
//#define P30_Quasi_Mode P3M1&=~SET_BIT0;P3M2&=~SET_BIT0
////------------------- Define Port as Push Pull mode -------------------
//#define P00_PushPull_Mode P0M1|=SET_BIT0;P0M2&=~SET_BIT0
//#define P01_PushPull_Mode P0M1|=SET_BIT1;P0M2&=~SET_BIT1
//#define P02_PushPull_Mode P0M1&=~SET_BIT2;P0M2|=SET_BIT2
//#define P03_PushPull_Mode P0M1&=~SET_BIT3;P0M2|=SET_BIT3
//#define P04_PushPull_Mode P0M1&=~SET_BIT4;P0M2|=SET_BIT4
//#define P05_PushPull_Mode P0M1&=~SET_BIT5;P0M2|=SET_BIT5
//#define P06_PushPull_Mode P0M1&=~SET_BIT6;P0M2|=SET_BIT6
//#define P07_PushPull_Mode P0M1&=~SET_BIT7;P0M2|=SET_BIT7
//#define P10_PushPull_Mode P1M1&=~SET_BIT0;P1M2|=SET_BIT0
//#define P11_PushPull_Mode P1M1&=~SET_BIT1;P1M2|=SET_BIT1
//#define P12_PushPull_Mode P1M1&=~SET_BIT2;P1M2|=SET_BIT2
//#define P13_PushPull_Mode P1M1&=~SET_BIT3;P1M2|=SET_BIT3
//#define P14_PushPull_Mode P1M1&=~SET_BIT4;P1M2|=SET_BIT4
//#define P15_PushPull_Mode P1M1&=~SET_BIT5;P1M2|=SET_BIT5
//#define P16_PushPull_Mode P1M1&=~SET_BIT6;P1M2|=SET_BIT6
//#define P17_PushPull_Mode P1M1&=~SET_BIT7;P1M2|=SET_BIT7
//#define P20_PushPull_Mode P2M1&=~SET_BIT0;P2M2|=SET_BIT0
//#define P30_PushPull_Mode P3M1&=~SET_BIT0;P3M2|=SET_BIT0
////------------------- Define Port as Input Only mode -------------------
//#define P00_Input_Mode P0M1|=SET_BIT0;P0M2&=~SET_BIT0
//#define P01_Input_Mode P0M1|=SET_BIT1;P0M2&=~SET_BIT1
//#define P02_Input_Mode P0M1|=SET_BIT2;P0M2&=~SET_BIT2
//#define P03_Input_Mode P0M1|=SET_BIT3;P0M2&=~SET_BIT3
//#define P04_Input_Mode P0M1|=SET_BIT4;P0M2&=~SET_BIT4
//#define P05_Input_Mode P0M1|=SET_BIT5;P0M2&=~SET_BIT5
//#define P06_Input_Mode P0M1|=SET_BIT6;P0M2&=~SET_BIT6
//#define P07_Input_Mode P0M1|=SET_BIT7;P0M2&=~SET_BIT7
//#define P10_Input_Mode P1M1|=SET_BIT0;P1M2&=~SET_BIT0
//#define P11_Input_Mode P1M1|=SET_BIT1;P1M2&=~SET_BIT1
//#define P12_Input_Mode P1M1|=SET_BIT2;P1M2&=~SET_BIT2
//#define P13_Input_Mode P1M1|=SET_BIT3;P1M2&=~SET_BIT3
//#define P14_Input_Mode P1M1|=SET_BIT4;P1M2&=~SET_BIT4
//#define P15_Input_Mode P1M1|=SET_BIT5;P1M2&=~SET_BIT5
//#define P16_Input_Mode P1M1|=SET_BIT6;P1M2&=~SET_BIT6
//#define P17_Input_Mode P1M1|=SET_BIT7;P1M2&=~SET_BIT7
//#define P20_Input_Mode P2M1|=SET_BIT0;P2M2&=~SET_BIT0
//#define P30_Input_Mode P3M1|=SET_BIT0;P3M2&=~SET_BIT0
////-------------------Define Port as Open Drain mode -------------------
//#define P00_OpenDrain_Mode P0M1|=SET_BIT0;P0M2|=SET_BIT0
//#define P01_OpenDrain_Mode P0M1|=SET_BIT1;P0M2|=SET_BIT1
//#define P02_OpenDrain_Mode P0M1|=SET_BIT2;P0M2|=SET_BIT2
//#define P03_OpenDrain_Mode P0M1|=SET_BIT3;P0M2|=SET_BIT3
//#define P04_OpenDrain_Mode P0M1|=SET_BIT4;P0M2|=SET_BIT4
//#define P05_OpenDrain_Mode P0M1|=SET_BIT5;P0M2|=SET_BIT5
//#define P06_OpenDrain_Mode P0M1|=SET_BIT6;P0M2|=SET_BIT6
//#define P07_OpenDrain_Mode P0M1|=SET_BIT7;P0M2|=SET_BIT7
//#define P10_OpenDrain_Mode P1M1|=SET_BIT0;P1M2|=SET_BIT0
//#define P11_OpenDrain_Mode P1M1|=SET_BIT1;P1M2|=SET_BIT1
//#define P12_OpenDrain_Mode P1M1|=SET_BIT2;P1M2|=SET_BIT2
//#define P13_OpenDrain_Mode P1M1|=SET_BIT3;P1M2|=SET_BIT3
//#define P14_OpenDrain_Mode P1M1|=SET_BIT4;P1M2|=SET_BIT4
//#define P15_OpenDrain_Mode P1M1|=SET_BIT5;P1M2|=SET_BIT5
//#define P16_OpenDrain_Mode P1M1|=SET_BIT6;P1M2|=SET_BIT6
//#define P17_OpenDrain_Mode P1M1|=SET_BIT7;P1M2|=SET_BIT7
//#define P20_OpenDrain_Mode P2M1|=SET_BIT0;P2M2|=SET_BIT0
//#define P30_OpenDrain_Mode P3M1|=SET_BIT0;P3M2|=SET_BIT0
////--------- Define all port as quasi mode ---------
//#define Set_All_GPIO_Quasi_Mode P0M1=0;P0M1=0;P1M1=0;P1M2=0;P2M1=0;P2M2=0;P3M1=0;P3M2=0
#endif /*------------------------------------------------
The main C function. Program execution starts
here after stack initialization.
------------------------------------------------*/ void main (void)
{
// unsigned char temp;
Set_All_GPIO_Quasi_Mode; // Define in Function_define.h #if 0
InitialUART0_Timer3();
// set_CLOEN; // For clock out from P1.1 while()
{
clr_GPIO1; // Tiny board GPIO1 LED define
P0 = 0x00;
P2 = 0x00;
P1 = 0x00;
Timer0_Delay1ms();
P0 = 0xff;
P2 = 0xff;
P1 = 0xff;
set_GPIO1; Send_Data_To_UART0(0x35); //UART0 send ascii "U"
temp = 0x31 + P0;
Send_Data_To_UART0(temp);
temp = 0x31 + P1;
Send_Data_To_UART0(temp); Timer0_Delay1ms();
}
#endif #if 1 while()
{
clr_GPIO1; // Tiny board GPIO1 LED define
P0 = 0x00;
P2 = 0x00;
P1 = 0x00;
Timer0_Delay1ms();
P0 = 0xff;
P2 = 0xff;
P1 = 0xff;
set_GPIO1;
Timer0_Delay1ms();
}
#endif }

我自己写的一个根据例程驱动继电器的例程,额,怎么说呢,就改了

//***********************************************************************************************************
// File Function: N76E003 Timer0/1 Mode1 demo code
//***********************************************************************************************************
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h" //***************** The Following is in define in Fucntion_define.h ***************************
//****** Always include Function_define.h call the define you want, detail see main(void) *******
//***********************************************************************************************
#if 0 #endif #define TH0_INIT 50000
#define TL0_INIT 50000
UINT8 u8TH0_Tmp,u8TL0_Tmp,u8TH1_Tmp,u8TL1_Tmp; int i=;
/************************************************************************************************************
* TIMER 0 interrupt subroutine
************************************************************************************************************/
void Timer0_ISR (void) interrupt //interrupt address is 0x000B
{
i++;
TH0 = u8TH0_Tmp;
TL0 = u8TL0_Tmp;
if(i==)
{
P12 =;
i=;
} } void main (void)
{ P12_PushPull_Mode; clr_GPIO1;
TIMER0_MODE1_ENABLE; clr_T1M; u8TH0_Tmp = (-TH0_INIT)/;
u8TL0_Tmp = (-TL0_INIT)%; TH0 = u8TH0_Tmp;
TL0 = u8TL0_Tmp; set_ET0; //enable Timer0 interrupt set_EA; //enable interrupts
set_TR0; //Timer0 run
while(); }

准双向是一个没有那么大的驱动电流,驱动不了电机所以选择推挽模式。

N76E003之IO控制的更多相关文章

  1. [Intel Edison开发板] 05、Edison开发基于MRAA实现IO控制,特别是UART通信

    一.前言 下面是本系列文章的前几篇: [Intel Edison开发板] 01.Edison开发板性能简述 [Intel Edison开发板] 02.Edison开发板入门 [Intel Edison ...

  2. TMS320F28335——IO控制/定时计操作

    一.实现GPIO控制 1.硬件连接 从电路原理图上看来,LED灯是接在GPIO34 上的. 2.IO设置 2.1设置功能 GPXMUX1/2:功能选择寄存器 GPXMUX1/2    每组 IO 一般 ...

  3. 操作系统:进程管理和IO控制

    一.进程管理 进程管理包括进程控制,进程调度,进程同步与通信,死锁控制四个内容. (一)进程控制 进程是操作系统中运行的基本单位,包括程序段,数据段和进程控制段.操作系统通过进程控制块(PCB)管理进 ...

  4. Linux IO控制命令生成

    在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值.cmd除了可区别数字外,还包含有助于处理的几种相应信息. cmd的大小为 32位,共分 4 个 ...

  5. socket.io,远程控制你的幻灯片

    原文:http://www.cnblogs.com/xiezhengcai/p/3964455.html 中秋休息了几天,今天又开始捣鼓socket.io了.今天的任务是通过socket.io控制你的 ...

  6. 文件IO操作

    前言 本文介绍使用java进行简单的文件IO操作. 操作步骤 - 读文件 1. 定义一个Scanner对象 2. 调用该对象的input函数族进行文件读取 (参见下面代码) 3. 关闭输入流 说明:其 ...

  7. 用一个I/O口控制1个三色指示灯, 2个单色指示灯

    http://www.baiheee.com/Documents/081207/081207184434.htm http://www.baiheee.com/Documents/081207/081 ...

  8. linux下 文件IO 相关

    linux下操作文件或设备,需要一个文件描述符 file descriptor,fd 来引用.fd是一个非负整数,实际上是一个索引值,指向文件的记录表,对文件的操作都需要fd.默认的几个:标准输入流 ...

  9. 树莓派控制HC-SR04超声波模块测距(新手向+C语言向)

    因为作业要求使用c语言代码,这里先附上一段摘自网上的代码 感谢KalaerSun的c语言代码,摘自https://blog.csdn.net/qq_25247589/article/details/6 ...

随机推荐

  1. thinkphp 无限极分类的数据库设计及效果测试

    控制器继承IndexAction.class.php <?php // 本类由系统自动生成,仅供测试用途 class IndexAction extends CateAction { } ?&g ...

  2. c++ 常用数据类型,命名规则, 不常有数据类型

    1. 常用数据类型 最大值0111111111111111 = 32767最小值1000000000000000 = -32768 short 最低16位 2**7 - 1 负值:反码 int 至少和 ...

  3. 第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中

    第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详 ...

  4. CentOS 7 之前好好的,突然一天启动时黑屏,没有登陆界面了(配置 network-scripts 连网)

    原因: 百度大神说是Gnome(一套纯粹自由的计算机软件,运行在操作系统上,提供图形桌面环境)不行了. 解决方法: 1. 重启系统,ctrl + alt + F2 进入命令行界面. 2. sudo s ...

  5. e809. 在菜单中使菜单项分开

    A separator typically appears as a horizontal line. It is used to group related sets of menu items i ...

  6. MySQL谨慎使用"replace into"

    From: http://blog.xupeng.me/2013/10/11/mysql-replace-into-trap/ MySQL 对 SQL 有很多扩展,有些用起来很方便,但有一些被误用之后 ...

  7. quake3中求1/sqrt(x)的算法源代码

    quake3中求1/sqrt(x)的算法源代码如下(未作任何修改): float Q_rsqrt( float number ) { long i; float x2, y; const float ...

  8. iOS: 定义 Block

    定义 typedef void (^RFAudioBasicBlock) (void); typedef void (^RFAudioSuccessBlock) (BOOL flag); typede ...

  9. 【ES】简单使用

    import sys reload(sys) sys.setdefaultencoding('utf-8') from datetime import datetime from elasticsea ...

  10. Android四大组件之——ContentProvider(二)

    Content Resolver介绍: 开发者文档中这么定义的: This class provides applications access to the content model. 这个类为应 ...