I/O端口的简单应用

基本输入输出单元与编程

输出电路

基本输出元件:发光二极管(Light Emitting Diode)

灌入的最大电流为 10 mA     

拉出的最大电流为 1 mA

单片机输出低电平时驱动能力尚可,输出高电平时驱动能力很差。

输入电路        

基本输入元件:按钮(Button)或开关(Switch

当按键未按下压时,Px.n端口为高电平;按压按键后为低电平。

实例独立按键识别

要求采用独立按键方式实现下述功能:开机时LED全熄,然后根据按键动作使相应灯亮,并将亮灯状态保持到按压其它键时为止。

独立按键——每个按键都彼此独立地各占有一位I/O口线。特点是电路简单,但占用I/O口线较多。

分析

为使按键抬起后LED能保持先前的点亮状态,需要在按键未压下期间禁止向P2输出P0状态值。

参考程序如下:

void main( ) {
   char key = 0;		    //定义按键变量
   while(1){
         key = P0 & 0x0f; 	   //读取按键状态,高4位清零
         if (key != 0x0f) P2 = key;  //有按键动作时,P0状态值送P2
    }
}

实例键控流水灯

要求

  K1为“启动键”,首次按压K1可产生“自下向上” 的流水灯运动;

  K2 为“停止键”,按压K2可终止流水灯的运动;

  K3K4为“方向键,分别产生 “自上向下”和 “自下向上” 运动。

思路分析:设立状态标志变量→根据键值修改标志值→根据标志值控制灯的亮灭

总体关系流程图如下:

获取按键状态

状态

无按键—— xxxx 1111B   0x0f

按压K1——xxxx 1110B   0x0e

按压K2——xxxx 1101B   0x0d

按压K3——xxxx 1011B   0x0b

按压K4——xxxx 0111B  0x07

按键动作判断——P0 & 0x0f)是否等于 0x0f?若是,说明无按键动作,反之则有按键动作。

修改方向和启停标志值

switch(P0 & 0x0f){
case 0x0e:run=1;break,
case 0x0d:run=0,dir=0;break,
case 0x0b: dir=1,break,
case 0x07: dir=0;break,
}

D1D4循环方向控制

P2口亮灯编码

xxxx 1110

xxxx 1101

xxxx 1011

xxxx 0111

char led [ ] = {0xfe,0xfd,0xfb,0xf7};

for (i=0; i<=3; i++){ P2 = led [i]; } //↓移动
for (i=3; i>=0; i-- ) { P2 = led [i]; } //↑移动

#include "reg51.h"
char led[]={0x01,0x02,0x04,0x08};
void delay(unsigned int time){
	unsigned int j= 0;
	for(;time>0;time--)
		for(j=0;j<125;j++);
}
void main(){
	bit dir =0,run=0;
	//标志位初始化
	char i;
	while(1){
	switch(P0 & 0x0f){    //根据键值修改标志位
	case 0x0e:run=1;break;
	case 0x0d:run=0;dir=0;break;
	case 0x0b:dir=1;break;
	case 0x07:dir=0;break;
	}
	if(run)    //若run=dir=1,自上而下流动
		if(dir)
			for(i=0;i<=3;i++){
				P2=led[i];
				delay(200);
			}
		else     //若run=l,dir=0, 自下而上流动
			for(i=3;i>=0;i--){
				P2=led[i];
				delay(200);
			}
	else P2=0;   //若run=0,灯全灭
	}
}

实例2原理图与程序界面图

实例2程序运行效果

猜你喜欢

转载自blog.csdn.net/qq_45385706/article/details/112101727
今日推荐