IO口控制-按键控制LED灯花式显示
一、实验目的
掌握P0-P3 各个I/O的工作原理和作用
掌握I/O口的输入输出控制
进一步熟练C51编程和软硬件联调
二、实验内容
在交通灯控制系统的基础上修改硬件电路
AT89C51单片机的P1口接8个独立按键,P0口接8个LED灯,led等的上拉电阻改用排阻,设计硬件电路。
编写程序,实现基本要求:当P1.0键按下后P0.0灯亮, P1.1键按下后P0.0~P1.1灯亮,
P1.2键按下后P0.0~P1.2灯亮,以此类推, P1.7键按下后P0.0~P1.7灯亮
进一步发挥,按如下规则显示,或自己制定显示规则。(另一程序)
当key0 按下时,LED等全亮
当key1 按下时,后四个LED灯亮
当key2 按下时,前四个LED灯亮
当key3 按下时,奇数灯亮
当key4 按下时,偶数灯亮
当key5 按下时,从右到左依次显示
当key6 按下时,从左到有依次显示
当key7 按下时,显示如下花样显示效果。
三、电路图
四、总结
问题讨论
P0-P3四个I/O端口的主要功能有什么区别?各个口在什么情况下需接上拉电阻?
区别:
P0口作输出口用时,需加上拉电阻。P0口有复用功能。当对外部存储器进行读写操作时,P0口先是提供外部存储器的低8位地址,供外部存储器地址锁存器锁存,然后充当数据线,用于写出或读入数据。P1口、P2口只是普通IO口。
P0口第一个功能是数据接口,第二个功能是地址低八位,P2口第二个功能是地址高八位。另外除了P0口没有内部上拉电阻外,其他三个都有内部上拉电阻。
P1、P2、P3都有内部上拉电阻,所以外部的上拉电阻可接可不接。
P1、P2、P3输出一个高电平,或者提供一个驱动能力的时候,需接上拉电阻。
而P0没有,所以。如果用P0口驱动必须接上拉电阻。
P0口,输出高电平时,接口本身根本就没有输出能力,必须用外接上拉电阻来形成高电平。
问题和建议
上拉电阻是一个很好的设计,优点是不需要添加外部上拉电阻。
缺点是驱动电流受到内部上拉电阻的限制。
上拉电阻越小则驱动能力就越大,所以当驱动能力不足的时候可以并联上拉电阻。
五、代码
代码:
\#include \<reg52.h\>
sbit LED0 = P0\^0;
sbit LED1 = P0\^1;
sbit LED2 = P0\^2;
sbit LED3 = P0\^3;
sbit LED4 = P0\^4;
sbit LED5 = P0\^5;
sbit LED6 = P0\^6;
sbit LED7 = P0\^7;
sbit key0 = P1\^0;
sbit key1 = P1\^1;
sbit key2 = P1\^2;
sbit key3 = P1\^3;
sbit key4 = P1\^4;
sbit key5 = P1\^5;
sbit key6 = P1\^6;
sbit key7 = P1\^7;
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x\>0;x--)
for(y=110;y\>0;y--) ;
}
void main(){
P1=0xff;
P0=0x00;
LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
while(1){
if(key0==0){
LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
}
if(key1==0){
LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 1;
LED5 = 1;
LED6 = 1;
LED7 = 1;
}
if(key2==0){
LED0 = 1;
LED1 = 1;
LED2 = 1;
LED3 = 1;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
}
if(key3==0){
LED0 = 0;
LED1 = 1;
LED2 = 0;
LED3 = 1;
LED4 = 0;
LED5 = 1;
LED6 = 0;
LED7 = 1;
}
if(key4==0){
LED0 = 1;
LED1 = 0;
LED2 = 1;
LED3 = 0;
LED4 = 1;
LED5 = 0;
LED6 = 1;
LED7 = 0;
}
if(key5==0){
LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
delay(500);
LED7 = 1;
delay(500);
LED6 = 1;
delay(500);
LED5 = 1;
delay(500);
LED4 = 1;
delay(500);
LED3 = 1;
delay(500);
LED2 = 1;
delay(500);
LED1 = 1;
delay(500);
LED0 = 1;
}
if(key6==0){
LED0 = 0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 0;
delay(500);
LED0 = 1;
delay(500);
LED1 = 1;
delay(500);
LED2 = 1;
delay(500);
LED3 = 1;
delay(500);
LED4 = 1;
delay(500);
LED5 = 1;
delay(500);
LED6 = 1;
delay(500);
LED7 = 1;
}
if(key7==0){
LED0 = 1;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 1;
delay(500);
LED6 = 1;
LED1 = 1;
delay(500);
LED5 = 1;
LED2 = 1;
delay(500);
LED4 = 1;
LED3 = 1;
delay(500);
LED7 = 0;
LED0 = 0;
delay(500);
LED6 = 0;
LED1 = 0;
delay(500);
LED5 = 0;
LED2 = 0;
delay(500);
LED4 = 0;
LED3 = 0;
delay(500);
}
}
}
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
LED5 = 0;
LED6 = 0;
LED7 = 1;
delay(500);
LED6 = 1;
LED1 = 1;
delay(500);
LED5 = 1;
LED2 = 1;
delay(500);
LED4 = 1;
LED3 = 1;
delay(500);
LED7 = 0;
LED0 = 0;
delay(500);
LED6 = 0;
LED1 = 0;
delay(500);
LED5 = 0;
LED2 = 0;
delay(500);
LED4 = 0;
LED3 = 0;
delay(500);
}
}
}
|