蓝桥杯单片机综合练习8

模块:独立按键 LED (CD107D开发板)

  1.  按键S7和S6为选择键,确定控制键控制那组LED指示灯。按键S5和S4为控制键,按键该键点亮指定的LED指示灯,松开后熄灭。

  2. 按下S7点亮L1指示灯,L1点亮后,S6不响应操作,S5控制L3,S4控制L4,再次按下S7,L1指示灯熄灭,S6可可响应操作。

  3. 按下S6点亮L2指示灯,L2点亮后,S7不响应操作,S5控制L5,S4控制L6,再次按下S6,L2指示灯熄灭,S7可可响应操作。

  4. S7和S6未按下时,即L1或L2未点亮时S5和S4不响应操作也就是未作LED灯区域选择时,控制键不能操作。

#include "STC15F2K60S2.H" 
#include <intrins.h>
#define uint unsigned int 
#define uchar unsigned char
uchar flag;
sbit s7 = P3^0;
sbit s6 = P3^1;
sbit s5 = P3^2;
sbit s4 = P3^3;
sbit LED1 = P0^0;
sbit LED2 = P0^1;
sbit LED3 = P0^2;
sbit LED4 = P0^3;
sbit LED5 = P0^4;
sbit LED6 = P0^5;
sbit LED7 = P0^6;
sbit LED8 = P0^7;
void HC138init (uchar n)
{
   switch (n)
   {
   	  case 4:
	    P2 = (P2&0x1f)|0x80;
	  break;
	  case 5:
	    P2 = (P2&0x1f)|0xa0;
	  break;
	  case 6:
	    P2 = (P2&0x1f)|0xc0;
	  break;
	  case 7:
	    P2 = (P2&0x1f)|0xe0;
	  break;
   }
}
void Delay5ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 54;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}
void scankeys ()
{
  if(s7 == 0 )
  {
     Delay5ms();
	 if(s7 == 0 )
	 {
	   if(flag == 0) // 声明flag 用来判断 s6 或者 s7 是否已经被按下
	  {
	    LED1 = 0;
	    flag = 1;  // s7 已经按下 s6 不能再进行操作
	  }
	  else if (flag == 1)
	  {
	     LED1 = 1;
		 flag = 0;
	  }
	 }
	 while(!s7);
  }
  if(s6 == 0 )
  {
     Delay5ms();
	 if(s6 == 0 )
	 {
	   if(flag == 0)
	  {
	    LED2 = 0;
	    flag = 2; // s6 已经按下 s7 不能再进行操作
	  }
	  else if (flag == 2)
	  {
	     LED2 = 1;
		 flag = 0;
	  }
	 }
	 while(!s6);
  } 
   if(s5 == 0 )
  {
     Delay5ms();
	 if(s5 == 0 )
	 {
	   if(flag == 1)  // flag = 1 代表是s7已经按下
	  {
	    LED3 = 0;	 
		while(!s5);
	    LED3 = 1;	
	  }
	  else if(flag == 2)  // flag = 2 代表是s6已经按下
	   { LED5 = 0;	 
		while(!s5);
	    LED5 = 1;
	   }
	 }	
  }
   if(s4 == 0 )
  {
     Delay5ms();
	 if(s4 == 0 )
	 {
	   if(flag == 1)	// flag = 1 代表是s7已经按下
	  {
	    LED4 = 0;	 
		while(!s4);
	    LED4 = 1;	
	  }
	  else if(flag == 2)   // flag = 2 代表是s6已经按下
	   { 
	    LED6 = 0;	 
		while(!s5);
	    LED6 = 1;
	   }	
     }
  }
}
void main ()
{
   HC138init (4);
   while(1)
   {
   	 scankeys ();
   }
}

 

 

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值