p0口做通用I/O用,需外接上拉电阻,而P1~P3内部有30K欧的电阻。
任意端口想要获得较大的驱动能力,要用低电平输出。
对I/O端口进行控制时,要对I/O端口特殊功能寄存器进行声明。
声明包含在头文件#inlcude <reg51.h>中
制作流水灯,8个发光二极管接到0P1口的P1.0~P1.7引脚上,编写程序来控制由上至下反复循环流水点亮。
第一种方法:移位运算符实现
c中的移位运算符补零,c中无循环移位函数。
1.运用移位运算符
#include<reg51.h>
#define uchar unsigned char
void delay(uchar j){
while(--j);
}
void main(){
uchar q=0x01;
while(1){
for(i=0;i<8;i++){
p1=~q;
delay(63500);
q=q<<1;
}
q=0x80;//反向
for(i=0;i<8;i++){
p1=~q;
delay(63500);
q=q>>1;
}
}
}
2.运用c 51中的循环移位函数
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
void delay(uchar j){
while(--j);
}
void main(){
p1=0xfe;
while(1){
delay(63500);
p1=-=_crol_(p1,1);
}
}
3.利用数组
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
uchar a[]={0xfe,0xfd,0xfb,0xf7,0xef,0xd;f,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
void delay(uchar j){
while(--j);
}
void main(){
for(i=0;i<16;i++){
delay(63500);
p1=a[i];
}
}
开关状态检测button
读入I/O端口电平,检测开关属于闭合还是断开状态。
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit a=p1^0;
sbit b=p1^1;
uchar flag=0;
void main(){
while(1){
if(b==1){
while(b==1);
flag=!flag;
}
if(flag)
a=0;
else a=1;
}
}