独立新建工程并编写、编译代码,实现按键控制流水灯运行,完成以下任务要求:
【1】程序开始运行时,D4、D3、D6、D5灯全亮一会,然后全灭一会,开始进入流水灯。
【2】流水灯的运行过程为:D4灯亮,其余熄灭,过一会,D3灯亮,其余熄灭,过一会,D6灯亮,其余熄灭,过一会,D5灯亮,其余熄灭,过一会…如此反复运行流水灯。
【3】按下SW1按键松开后,流水灯暂停保留当前状态;再一次SW1按键松开后,从当前状态保留处继续运行流水灯,在按下SW1按键时,不能打断流水灯的运行。
解题思路:
首先需要确定所用的引脚,延时函数的编写和端口IO的初始化。
第一步骤可以写在主函数中加上延时函数实现,之后需要写一个标志位判断是否开启流水灯的运行。
第二步骤需要定义一个时间片,通过时间片的计时实现流水灯的闪烁。用一个简单的if……else if……else 完成流水灯的操作。最后记得要把计数的标志位清零。
第三步骤为按键扫描函数。首先需要延时去抖。当有按键的信号时候,通过判断流水灯是否在运行,当在运行时,按下则暂停流水灯;当暂停的时候,按下则开启流水灯。最终要一点就是在按键按下的时候,不打断流水灯的运行。
Tip:
while(1)其中1代表一个常量表达式,它永远不会等于0。循环会一直执行下去。除非你设置break等类似的跳出循环语句循环才会中止。
1 #include "ioCC2530.h" 2 3 #define D3 P1_0 4 #define D4 P1_1 5 #define D5 P1_3 6 #define D6 P1_4 7 #define SW1 P1_2 8 9 unsigned char F_LED = 0; //流水灯运行标志 10 unsigned int count = 0; //时间片计数 11 12 13 /*=======================简单的延时函数========================*/ 14 void Delay(unsigned int t) 15 { 16 while(t--); 17 } 18 /*=======================端口初始化函数========================*/ 19 void Init_Port() 20 { 21 P1SEL &= ~0x1b; //将P1_0,P1_1,P1_3,P1_4设置为通用I/O端口 0001 1011->1110 0100 普通IO 22 P1DIR |= 0x1b; //将P1_0,P1_1,P1_3,P1_4设置为输出方向 0001 1011 输出 23 P1 &= ~0x1b; //关闭4个LED灯 1110 0100 四个端口为低电平 24 25 P1SEL &= ~0x04; //将P1_2设置为通用I/O端口 0000 0100->1111 1011 普通IO 26 P1DIR &= ~0x04; //将P1_2设置为输入方向 1111 1011 0位输入 27 P1INP &= ~0x04; //将P1_2设置为上拉/下拉 1111 1011 P1_2 0位上下拉 28 P2INP &= ~0x40; //将P1_2设置为上拉 0100 0000—>1011 1111 第七位为端口1的选择 29 } 30 31 32 33 /*=======================流水灯控制函数========================*/ 34 void LED_Running() 35 { 36 Delay(100); //定义时间片 37 if(F_LED == 1) //如果处于运行状态,则累加时间片 38 { 39 count++; 40 } 41 if(count < 1000) //根据时间进行流水变换 42 { 43 D4 = 1; D3 = 0; D6 = 0; D5 = 0; 44 } 45 else if(count < 2000) 46 { 47 D4 = 0; D3 = 1; D6 = 0; D5 = 0; 48 } 49 else if(count < 3000) 50 { 51 D4 = 0; D3 = 0; D6 = 1; D5 = 0; 52 } 53 else if(count < 4000) 54 { 55 D4 = 0; D3 = 0; D6 = 0; D5 = 1; 56 } 57 else 58 { 59 count = 0; //流水周期结束,时间片计数清零 60 } 61 } 62 63 64 /*=======================按键扫描函数=========================*/ 65 void Scan_Keys() 66 { 67 if(SW1 == 0) //发现有SW1按键信号 68 { 69 Delay(100); //延时片刻,去抖动处理 70 if(SW1 == 0) //确认为SW1按键信号 71 { 72 while(SW1 == 0) 73 { 74 LED_Running(); //在按键按下时,不打断流水灯运行 75 } 76 if(F_LED == 0) 77 { 78 F_LED = 1; //流水灯运行标志 79 } 80 else if(F_LED == 1) 81 { 82 F_LED = 0; //流水灯暂停标志 83 } 84 } 85 } 86 } 87 88 89 /*==========================主函数============================*/ 90 void main() 91 { 92 Init_Port(); //端口初始化 93 D4 = 1; //全亮 94 D3 = 1; 95 D6 = 1; 96 D5 = 1; 97 Delay(60000); 98 D4 = 0; //全灭 99 D3 = 0; 100 D6 = 0; 101 D5 = 0; 102 Delay(60000); 103 F_LED = 1; //开启流水灯运行 104 while(1) 105 { 106 Scan_Keys(); //按键扫描 107 LED_Running(); //流水灯运行 108 } 109 }