按键控制LED流水灯模式

 main.c

#include<REGX52.H>
#include<INTRINS.H>    //循环左移_crol_,循环右移_cror_
#include“Timer0.h”
#include“Key.h”


unsigned char KeyNum;

void main()
{
    Timer0_Init()      //定时器初始化
    while(1)
    {
        KeyNum=Key()
        if(KeyNum)
        {
            if(KeyNum==1)
            {
                LEDMode++;
                if(LEDMode>=2)LEDMode=0;    
            }
        }  
    }
}


void Timer0_Routine() interrupt 1
{
    static unsigned int T0Count;    //局部变量,静态,只可以由本函数引用
    TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
    T0Count++;
    if(T0Count>=500)
    {
        T0Count=0;
        if(LEDMode==0)
            P2=_crol_(P2,1);//左移一位
        if(LEDMode==1)
            P2=_cror_(P2,1);//右移一位
    }
}

Timer0.c


//定时器0初始化,1毫秒12Mhz


void Timer0_Init(void)        //定时器配置
{
	            //AUXR &= 0x7F;	定时器时钟12T模式   删除
	TMOD &= 0xF0;			//设置定时器模式
	TMOD |= 0x01;			//设置定时器模式
	TL0 = 0x18;				//设置定时初始值
	TH0 = 0xFC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
    ET0=1;    
    EA=1;
    PT0=0;                  //优先级
}

 Timer0.H

#ifndef__TIMER0_H__
#define__TIMER0_H__

void Timer0_Init(void)

#endif

key.c

#include<REGX52.H>
#include"Delay.h"

unsigned char Key()
{
    unsigned char KeyNumber=0;
    
    if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1}
    if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2}
    if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3}
    if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4}
    
    return KeyNumber;
}
//获取独立按键键码
//按下键码范围0~4,无按键按下时返回值为0

key.h-------头文件预处理如上

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好,这个问题可以分为两部分来解决:独立按键的检测和LED流水灯的控制。 首先,我们需要连接一个或多个LED灯到单片机的GPIO引脚上。然后,我们需要连接独立按键到另一个GPIO引脚上。 接下来,我们需要编写程序来检测按键是否按下。当按键按下时,程序需要控制LED流水灯按照一定的模式进行闪烁。 以下是一个示例程序,演示了如何使用单片机的GPIO引脚控制LED流水灯,并使用独立按键检测来控制LED流水灯模式: ```c #include <avr/io.h> #include <util/delay.h> #define LED_PORT PORTB #define LED_DDR DDRB #define LED_PINS 0b11111111 #define KEY_PORT PORTC #define KEY_DDR DDRC #define KEY_PIN 0 void led_init() { LED_DDR = LED_PINS; } void led_on(uint8_t pin) { LED_PORT |= (1 << pin); } void led_off(uint8_t pin) { LED_PORT &= ~(1 << pin); } void key_init() { KEY_PORT |= (1 << KEY_PIN); KEY_DDR &= ~(1 << KEY_PIN); } int key_pressed() { return !(KEY_PIN & (1 << KEY_PIN)); } int main() { led_init(); key_init(); uint8_t pattern = 0b00000001; while (1) { if (key_pressed()) { pattern <<= 1; if (!pattern) { pattern = 0b00000001; } } for (uint8_t i = 0; i < 8; i++) { if (pattern & (1 << i)) { led_on(i); } else { led_off(i); } } _delay_ms(100); } return 0; } ``` 在这个示例程序中,我们使用了AVR单片机来控制LED流水灯和独立按键。首先,我们定义了LED引脚和独立按键引脚的端口和引脚号码。然后,我们编写了一些辅助函数来控制LED的开关状态以及按键的检测。 在主函数中,我们初始化了LED和按键的GPIO引脚,并设置了初始的LED模式。然后,我们进入了一个循环中,不断检测按键是否按下,并根据按键的状态来改变LED模式。 在LED模式改变的过程中,我们使用位移运算和位运算来控制LED的开关状态。最后,我们使用延时函数来控制LED的闪烁频率。 注意,这个示例程序只是一个简单的演示,实际应用中需要考虑更多的因素,例如按键去抖动、LED流水灯模式设计等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值