按键控制流水灯
具体想要实现按一下按键,然后单片机的三个灯会以流水灯的形式都亮一遍
实验相关寄存器
实验相关电路
宏定义
#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,实验现象都是一样的,下周上课需要问一下老师。
实验心得
通过这个实验,知道了按键相应的接口