【51单片机C语言】1-3使用矩阵键盘触发中断,控制LED流水灯方向和速度(速度有四档)

#include <REGX52.H>
#include "Timer0.h"
#include "MatrixKey.h"    //文章最后有Timer0.h和MatrixKey.h的代码链接
#include <INTRINS.H>

unsigned char MKeyNum;
unsigned char LED_Mode=0;
unsigned int time=300;

void main()
{
	P2=0xfe;
	Timer0Init();
	while(1)
	{
		MKeyNum=MatrixKey();
		if(MKeyNum)
		{
			if(MKeyNum==1)
			{
				LED_Mode++;			//s1 每次按下更换流水方向(左/右) 默认右移模式
				if(LED_Mode>=2)LED_Mode=0;
			}
			if(MKeyNum==2)time=100;	//s2 更改流水速度间隔100ms
			if(MKeyNum==3)time=300;	//s3 更改流水速度间隔300ms 默认模式
			if(MKeyNum==4)time=500;	//s4 更改流水速度间隔500ms
			if(MKeyNum==5)time=1000;//s5 更改流水速度间隔1000ms
		}
	}
}

void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count;
	TL0 = 0x66;
	TH0 = 0xFC;
	T0Count++;
	if(T0Count>=time)
	{
		T0Count=0;
		if(LED_Mode==0)
			P2=_crol_(P2,1);
		if(LED_Mode==1)
			P2=_cror_(P2,1);
	}
}

 配置代码中用到的两个头文件:

Timer0.h:【51单片机C语言】2-4模块化定时器_北方大陸網友的博客-CSDN博客

MatrixKey.h:【51单片机C语言】2-2模块化矩阵键盘_北方大陸網友的博客-CSDN博客 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这个问题涉及到嵌入式系统的硬件和编程,需要一定的专业知识。我会尽力解答,如果有不清楚的地方可以再提问。 首先,我们需要使用51单片机的IO口控制LED灯的亮灭。为了实现流水灯效果,我们可以通过逐个点亮和熄灭LED灯的方式来实现。 其次,我们需要使用独立按键来控制流水灯方向速度。我们可以通过检测按键的状态,来实现不同的控制功能。 具体的实现过程如下: 1. 硬件连接 将LED灯连接到51单片机的IO口,按键连接到另一个IO口上。具体的连接方式可以参考开发板的说明书。 2. 编写程序 首先,我们需要定义LED灯的亮灭状态,以及流水灯方向速度。这些可以通过宏定义或枚举类型来实现。例如: ``` #define LED_ON 0 // LED亮 #define LED_OFF 1 // LED灭 enum Direction {LEFT, RIGHT}; // 流水灯方向,左/右 enum Speed {SLOW, MEDIUM, FAST}; // 流水灯速度,慢/中/快 ``` 然后,我们需要初始化IO口状态,将LED灯和按键所在的IO口设置为输出和输入模式,例如: ``` P1 = 0xFF; // 设置P1口为输出模式,所有LED灯熄灭 P3 = 0xFF; // 设置P3口为输入模式,所有按键未按下 ``` 接下来,我们需要编写流水灯控制函数。该函数根据当前的流水灯方向速度,逐个点亮和熄灭LED灯。例如: ``` void Flowing_LED(Direction dir, Speed speed) { int i; int delay_time; int led_state = 0; // LED灯状态,初始为熄灭 switch (speed) { case SLOW: delay_time = 100; // 延时100ms break; case MEDIUM: delay_time = 50; // 延时50ms break; case FAST: delay_time = 10; // 延时10ms break; default: delay_time = 50; break; } for (i = 0; i < 8; i++) { // 逐个点亮和熄灭LED灯 if (dir == LEFT) { // 左移 P1 = ~(1 << i); } else { // 右移 P1 = ~(0x80 >> i); } led_state = !led_state; // 切换LED灯状态 delay(delay_time); // 延时 } } ``` 最后,我们需要编写按键检测函数,根据按键的状态来控制流水灯方向速度。例如: ``` void Key_Detection() { int key_state; Direction dir = LEFT; Speed speed = MEDIUM; key_state = P3; // 获取按键状态 if (!(key_state & 0x01)) { // 检测第一个按键 dir = LEFT; } else if (!(key_state & 0x02)) { // 检测第二个按键 dir = RIGHT; } if (!(key_state & 0x04)) { // 检测第三个按键 speed = SLOW; } else if (!(key_state & 0x08)) { // 检测第四个按键 speed = FAST; } Flowing_LED(dir, speed); // 控制流水灯 } ``` 3. 主函数 在主函数中,我们可以循环调用按键检测函数,来实现对流水灯控制。例如: ``` void main() { while (1) { Key_Detection(); // 检测按键 } } ``` 4. 编译和下载 编译程序,生成HEX文件,然后将HEX文件下载到51单片机中即可。 以上就是51单片机独立按键控制流水灯方向速度的实现方法。希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值