實驗目的:掌握 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(); //處理掃描結果
}
}