按鍵控制流水燈
具體想要實現按一下按鍵,然后單片機的三個燈會以流水燈的形式都亮一遍
實驗相關寄存器
實驗相關電路
宏定義
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P0_4
#define KEY1 P0_1
初始化步驟
graph TD id1[設置P0_1 P1_0 P1_1 P0_4為通用接口] id2[設置P0_1為輸入接口 P1_0 P1_1 P0_4為輸出接口] id3[設置P0_1為上拉下拉電路 也就是設置P0INP] id1-->id2-->id3
初始化代碼
void InitIO(void)
{
//設置P0_1,P1_0,P1_1,P0_4,為通用接口
P0SEL&=~0x11; //P0SEL:1110 1110
P1SEL&=~0x03; //P1SEL:1111 1100
//設置P0_1為輸入接口
P0DIR&=~0x02; //P0DIR:1111 1101
//設置P1_0,P1_1,P0_4為輸出接口
P1DIR|=0x03; //P1DIR=0000 0011
P0DIR|=0x10; //P0SEL=0001 0000
//讓三個燈先滅
LED1=1;
LED1=1;
LED1=1;
}
main函數中的步驟
graph TD id1[初始化 InitIO] id2{是否被按下KeyScan} id3[三個燈以流水的方式亮WaterLight] id1-->id2 id2--按下-->id3 id2--沒按下-->id2 id3-->id2
KeyScan()函數用來檢測按鍵是否被按下
//檢測按鍵是否被按下,如果被按下返回true,如果沒被按下,返回false
uint KeyScan()
{
if(KEY1==0)
{
while(KEY1==0); //直到按鍵被松開
return 1;
}
return 0;
}
WaterLight()函數用實現
//讓三個燈以流水燈的方式亮一次
void WaterLight()
{
LED1=!LED1;
Delay(10000);
LED2=!LED2;
Delay(10000);
LED3=!LED3;
Delay(10000);
LED1=!LED1;
Delay(10000);
LED2=!LED2;
Delay(10000);
LED3=!LED3;
Delay(10000);
}
ok接下來將這些代碼塊拼接一下,就得到全部的代碼了
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char //定義控制燈的端口
#define LED1 P1_0 //定義LED1 為P10 口控制
#define LED2 P1_1 //定義LED2 為P11 口控制
#define LED3 P0_4 //定義LED3 為P04 口控制
#define KEY1 P0_1 //定義KEY1 P_01
//延時 *****************************/
void Delay(uint n)
{
uint i;
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
}
//初始化IO 口程序 *****************************/
void InitIO(void)
{
//設置P0_1,P1_0,P1_1,P0_4,為通用接口
P0SEL&=~0x11; //P0SEL:1110 1110
P1SEL&=~0x03; //P1SEL:1111 1100
//設置P0_1為輸入接口
P0DIR&=~0x02; //P0DIR:1111 1101
//設置P1_0,P1_1,P0_4為輸出接口
P1DIR|=0x03; //P1DIR=0000 0011
P0DIR|=0x10; //P0SEL=0001 0000
//調整P0_1為上拉下拉
P0INP&=~0x02; //P0INP:1111 1101
}
//檢測按鍵是否被按下,如果被按下返回true,如果沒被按下,返回false
uint KeyScan()
{
if(KEY1==0)
{
while(KEY1==0);
return 1;
}
return 0;
}
//讓三個燈以流水燈的方式亮一次
void WaterLight()
{
LED1=!LED1;
Delay(10000);
LED2=!LED2;
Delay(10000);
LED3=!LED3;
Delay(10000);
LED1=!LED1;
Delay(10000);
LED2=!LED2;
Delay(10000);
LED3=!LED3;
Delay(10000);
}
//主函數 ***************************/
void main(void)
{
InitIO();
while(1)
{
if(KeyScan())
WaterLight();
}
}
實驗過程中的問題
感覺這個寄存器的設置沒什么用啊,因為無論為0或者是為1,實驗現象都是一樣的,下周上課需要問一下老師。
實驗心得
通過這個實驗,知道了按鍵相應的接口