STC51单片机IO口模式快速设置
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STC51单片机IO口模式的快速设置新型51单片机STC系列,较传统51单片机在性能和速度上有根本性的提高。
速度提高8—12倍;片上RAM大量增加;片上外围模块大量增加,等等。
其中IO口的模式增加为4种(传统51只有1中),以P0口为例:
这里,每个端口新增两个寄存器PxM0, PxM1(x=0,1,2,3)。
在设置每一个IO端的模式时都需要对这两个寄存器进行操作。
比如:要将P0.7设为推挽输出,
P0.6设为准双向口,
P0.5设为高阻输入;
P0.4设为开路模式,
P0.3---P0.0都设为准双向口,
那么需要如下的代码:
IO_Init()
{
P0M0=0x30;//0011 0000
P0M1=0x90;//1001 0000
}
这样的设置不便于记忆,很容易写错,且写好的代码可读性差,为此,我们可以通过一个宏定义来解决,具体如下:
#define PORT0 0
#define PORT1 1
#define PORT2 2
#define PORT3 3
#define BIT0 0
#define BIT1 1
#define BIT2 2
#define BIT3 3
#define BIT4 4
#define BIT5 5
#define BIT6 6
#define BIT7 7
#define STANDARD 0
#define PP_OUT 1
#define Z_IN 2
#define OD 3
#define IOMODE(Port,bit_n,mode) { \
switch(Port)\
{\
case 0:\
switch(mode) { \
case STANDARD: P0M0&=~(1<<bit_n); P0M1&=~(1<<bit_n); break; \
case PP_OUT: P0M0&=~(1<<bit_n); P0M1|= (1<<bit_n); break; \
case Z_IN: P0M0|=(1<<bit_n); P0M1&=~(1<<bit_n); break; \
case OD: P0M0|=(1<<bit_n); P0M1|=(1<<bit_n); break; \
} \
break;\
case 1:\
switch(mode) { \
case STANDARD: P1M0&=~(1<<bit_n); P1M1&=~(1<<bit_n); break; \
case PP_OUT: P1M0&=~(1<<bit_n); P1M1|= (1<<bit_n); break; \
case Z_IN: P1M0|=(1<<bit_n); P1M1&=~(1<<bit_n); break; \
case OD: P1M0|=(1<<bit_n); P1M1|=(1<<bit_n); break; \
} \
break;\
case 2:\
switch(mode) { \
case STANDARD: P2M0&=~(1<<bit_n); P2M1&=~(1<<bit_n); break; \
case PP_OUT: P2M0&=~(1<<bit_n); P2M1|= (1<<bit_n); break; \
case Z_IN: P2M0|=(1<<bit_n); P2M1&=~(1<<bit_n); break; \
case OD: P2M0|=(1<<bit_n); P2M1|=(1<<bit_n); break; \
} \
break;\
case 3:\
switch(mode) { \
case STANDARD: P3M0&=~(1<<bit_n); P3M1&=~(1<<bit_n); break; \
case PP_OUT: P3M0&=~(1<<bit_n); P3M1|= (1<<bit_n); break; \
case Z_IN: P3M0|=(1<<bit_n); P3M1&=~(1<<bit_n); break; \
case OD: P3M0|=(1<<bit_n); P3M1|=(1<<bit_n); break; \
} \
break;\
}\
}
有了上面的宏定义,在初始化程序中可以直接这样写
IO_Init()
{
IOMODE(PORT0,BIT7,PP_OUT)
IOMODE(PORT0,BIT6, STANDARD)
IOMODE(PORT0,BIT5, Z_IN)
IOMODE(PORT0,BIT4, OD)
IOMODE(PORT0,BIT3, STANDARD)
IOMODE(PORT0,BIT2, STANDARD)
IOMODE(PORT0,BIT1, STANDARD)
IOMODE(PORT0,BIT0, STANDARD)
}。