单片机,独立按键,(STC89C51)

通过代码实现:

k1按键按下,8盏灯点亮;

k2按键按下,8盏灯熄灭/;

k3按键按下,流水灯从左到右不停点亮;

k4按键按下,流水灯从右到左不停点亮;

独立按键原理图

 

LED模块原理图

 代码部分实现:

#include "reg51.h"
#include<intrins.h>	
sbit k1=P3^1;	 //定义P31口是k1
sbit k2=P3^0;	 //定义P30口是k2
sbit k3=P3^2;//定义P32口是k3
sbit k4=P3^3;//定义P33口是k4
void delayms(int ms)//延时函数
{  
 int i,j;
	for(j=0;j<ms;j++)
		for(i=0;i<300;i++);
}
void lsd1()//流水灯从左向右不停的亮
{
	while(k1==1&&k2==1&&k4==1)
	{
	P2=_crol_(P2,1);
	delayms(100); //延时100ms
	}
}
void lsd2()//流水灯从右向左不停的亮
{
	while(k1==1&&k2==1&&k3==1)
		{P2=_crol_(P2,1);
		 delayms(100); //延时100ms
		}
}
void key()
{
		if(k1==0)		  //检测按键K1是否按下
				{	
					delayms(10);   //消除抖动10ms
					if(k1==0)	 //再次判断按键是否按下
					P2=0x00;
					while(!k1);	 //检测按键是否松开
					delayms(10);
				}		
				//按下k2 led灭
		if(k2==0)		  //检测按键K2是否按下
				{	
					delayms(10);   //消除抖动10ms
					if(k2==0)	 //再次判断按键是否按下
					P2=0xff;
					while(!k2);	 //检测按键是否松开
					delayms(10);
				}		
		if(k3==0)		  //检测按键K3是否按下
		{	
			delayms(10);   //消除抖动10ms
			if(k3==0)	 //再次判断按键是否按下
			P2=0xfe;//1111 1110
			lsd1();//调用函数 流水灯从左向右不停的亮		
			while(!k3);	 //检测按键是否松开
			delayms(10);
		}		
		if(k4==0)		  //检测按键K4是否按下
		{	
			delayms(10);   //消除抖动10ms
			if(k4==0)	 //再次判断按键是否按下
			P2=0xfe;//1111 1110
			lsd2();//调用函数	流水灯从右向左不停的亮	
			while(!k4);	 //检测按键是否松开
			delayms(10);
		}		
	}		
void main()
	{	
	
	while(1)
	{
		key();	
	}		
}

编写一个程序以利用中断技术在开发板上实现您所描述的功能,通常需要以下几个步骤: 1. **硬件连接**: - 将按K3和K4连接到微控制器的输入引脚,例如Arduino Uno或其他支持中断的开发板。 - 将8个LED分别连接到输出引脚,形成一条环形线路,便于实现左右流动。 2. **初始化设置**: - 初始化GPIO引脚,将按设置为输入模式,LED设置为输出模式,并配置为推挽式操作(如有必要)。 - 开启中断服务函数,如定时器中断或电平触发中断,当按被按下时会触发。 3. **中断处理函数**: - 对于K3按,当检测到下降沿(按下)时,记下当前LED的位置,并开始向左滚动LED的状态。每当扫描到下一个LED时,更新其状态并递增位置(如果超过最大值,则回滚到第一个LED)。 - 对于K4按,同样的原理,当检测到下降沿(按下)时,开始向右滚动LED,更新时也需要注意边界条件。 4. **流水灯算法**: - 使用循环结构,在中断服务函数内部或主循环里检查LED的位置,更新每个LED的状态(亮或灭)。 5. **中断服务和主循环结合**: - 主循环中处理其他非中断任务,同时检查是否有新的中断请求。如果有,暂停处理其他任务,转去执行中断处理。 - 中断处理完毕后,返回主循环继续执行流水灯效果,直到另一个按被按下。 6. **异常情况处理**: - 需要考虑按长时间按下的情况,以及中断期间其他意外中断的处理,防止程序混乱。 7. **编写伪代码示例**: ```cpp void setup() { pinMode(K3_PIN, INPUT_PULLUP); pinMode(LEDs, OUTPUT); attachInterrupt(digitalPinToInterrupt(K3_PIN), left_flow_handler, FALLING); // 同理为K4设定中断 } void loop() { // 主循环执行其他任务... } void left_flow_handler() { if (isButtonPressed(K3_PIN)) { int led_pos = ...; // 获取当前LED位置 for (int i = led_pos; ; i++) { if (i >= LED_COUNT) i = 0; setLedState(i); // 更新LED状态 } } } void right_flow_handler() { ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值