实验目的:掌握 led 灯的点亮原理;
理解并掌握独立按键的操作原理及操作方法;
实验模块:核心板+8 位流水灯与独立按键模块
实验内容:用按键控制对应的 led 灯点亮,即第一个按键按下点亮第一个 led
灯,点亮后不熄灭;第二个按键按下点亮第二个 led 灯,第三个按键按下点亮第
三个 led 灯,第四个按键按下熄灭所有的 led 灯。
模块连接图:
电路原理图:
功能描述: 当按下S17~S21中的任一个按键,有对应的LED被点亮
硬件连接: 用8位杜邦线将J8与J13连接,
用5位杜邦线将J9_7与J7_s17、J9_6与J7_s18、J9_5与J7_s19、J9_4与J7_s20、J9_3与J7_s21
实验源码:
#include "reg51.h" //包含头文件
sbit s17=P3^7; //定义S17按键控制IO
sbit s18=P3^6; //定义S18按键控制IO
sbit s19=P3^5; //定义S19按键控制IO
sbit s20=P3^4; //定义S20按键控制IO
sbit s21=P3^3; //定义S21按键控制IO
sbit s18=P3^6; //定义S18按键控制IO
sbit s19=P3^5; //定义S19按键控制IO
sbit s20=P3^4; //定义S20按键控制IO
sbit s21=P3^3; //定义S21按键控制IO
#define uchar unsigned char
#define uint unsigned int
#define uint unsigned int
uchar keyValue; //定义扫描结果参数
//**************************************************************************************************
//延时函数
//**************************************************************************************************
delay(uint time) //int型数据为16位,所以最大值为65535
{
uint i,j; //定义变量i,j,用于循环语句
for(i=0;i<time;i++) //for循环,循环50*time次
for(j=0;j<50;j++); //for循环,循环50次
}
//**************************************************************************************************
//1*5按键扫描函数
//**************************************************************************************************
keyScan()
{
P3=P3|0xf8; //P3高5位置1,设置为输入
if((P3&0xf8)!=0xf8) //判断是否有按键按下
{
delay(20); //延时肖抖
if((P3&0xf8)!=0xf8) //再次判断是否有按键按下
keyValue=(P3&0xf8); //读取扫描结果
}
}
//**************************************************************************************************
//1*5按键扫描结果处理函数
//**************************************************************************************************
keyHandle()
{
switch(keyValue)
{
case 0x78: //如果S17按键按下
{
P1=~0x01; //点亮一个发光二极管
break;
}
case 0xb8: //如果S18按键按下
{
P1=~0x02; //点亮一个发光二极管
break;
}
case 0xd8: //如果S19按键按下
{
P1=~0x04; //点亮一个发光二极管
break;
}
case 0xe8: //如果S20按键按下
{
P1=~0x08; //点亮一个发光二极管
break;
}
case 0xf0: //如果S21按键按下
{
P1=~0x10; //点亮一个发光二极管
break;
}
default:
break;
}
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main() //主函数
{
while(1) //进入while死循环
{
keyScan(); //按键扫描
keyHandle(); //处理扫描结果
}
}
//**************************************************************************************************
//延时函数
//**************************************************************************************************
delay(uint time) //int型数据为16位,所以最大值为65535
{
uint i,j; //定义变量i,j,用于循环语句
for(i=0;i<time;i++) //for循环,循环50*time次
for(j=0;j<50;j++); //for循环,循环50次
}
//**************************************************************************************************
//1*5按键扫描函数
//**************************************************************************************************
keyScan()
{
P3=P3|0xf8; //P3高5位置1,设置为输入
if((P3&0xf8)!=0xf8) //判断是否有按键按下
{
delay(20); //延时肖抖
if((P3&0xf8)!=0xf8) //再次判断是否有按键按下
keyValue=(P3&0xf8); //读取扫描结果
}
}
//**************************************************************************************************
//1*5按键扫描结果处理函数
//**************************************************************************************************
keyHandle()
{
switch(keyValue)
{
case 0x78: //如果S17按键按下
{
P1=~0x01; //点亮一个发光二极管
break;
}
case 0xb8: //如果S18按键按下
{
P1=~0x02; //点亮一个发光二极管
break;
}
case 0xd8: //如果S19按键按下
{
P1=~0x04; //点亮一个发光二极管
break;
}
case 0xe8: //如果S20按键按下
{
P1=~0x08; //点亮一个发光二极管
break;
}
case 0xf0: //如果S21按键按下
{
P1=~0x10; //点亮一个发光二极管
break;
}
default:
break;
}
}
//**************************************************************************************************
//主函数
//**************************************************************************************************
void main() //主函数
{
while(1) //进入while死循环
{
keyScan(); //按键扫描
keyHandle(); //处理扫描结果
}
}