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