02 蓝桥杯--按键与LED灯

本文详细介绍了如何使用单片机控制LED灯通过按键进行开关操作,包括按键原理、消除抖动的方法及其实现代码。文章深入探讨了按键与LED灯的连接方式,提供了从简单控制到复杂功能的代码示例,如位移LED灯控制和按键消抖程序。

今天,我们来看看按键这一部分。

首先是看看原理图,这在我们写程序时是非常重要的。十六位按键这里虽然有16位按键,但蓝桥杯一般只考察最左边这一排的按键,即S7,S6,S5,S4这4个,他们由P30,P31,P32,和P33四个口控制。有人会提出疑问,怎么保证只是这一排按键起作用呢?原因是:在图的左下角有一组串口,只用将条形帽搬至2 3口就行了。那我们来看看样板图会有一个直观的认识。
矩阵键盘
我画圈的地方就是条形帽的地方。

现在,我们可以写一些代码来实现一些功能。通常来说,独立按键与LED灯 数码管相联系。我们先看第一部分:

  1. 独立按键和LED灯
  • 下面是用独立按键控制LED的程序

    #include<stc15f2k60s2.h>

    void main()
    {
    P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //板子初始化程序

     while(1)
     {
     	if(P30==0)P00=0;
     	
     	if(P31==0)P07=0;
     	
     	if(P32==0)P00=1;
    
     }
    

    }

  • 下面的程序是借鉴了LED位移的程序,只是加了一个独立按键
    #include<stc15f2k60s2.h>

    unsigned char num=0;

    void main()
    {
    P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //板子初始化程序 ,以后讲

     while(1)
     {
     	if(P30==0)//判断是否被按下了
     	{
     		P0=~(1<<num);
     		num++;//num=num+1;
     		if(num==8)num=0;
     	}
     }
    

    }

  • 在上一个程序执行的过程中,出现了灯不规律变化的问题。这需要用到单片机的知识来解决。我们需要看一个图,便可知道原因在哪里。
    左图为原理图,右图为一个门电路因为存在抖动现象,所以要判断有没有被按下。这就可以实现具体的功能。下面来看具体的程序:
    #include<stc15f2k60s2.h>

    unsigned char num=0;
    unsigned char flag=0;

    void main()
    {
    P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //板子初始化程序 ,以后讲

     while(1)
     {
     	if(P30==0)//判断是否被按下了
     	{
     		flag=1;//按下后,标记了标志位。
     	}
     	if(flag==1)//判断按下了
     	{
     		if(P30==1)//按下了,执行下面的程序
     		{
     			flag=0;//标志位必须归0,这一点很重要,因为不归0,灯就不会亮了。
     			P0=~(1<<num);
     			num++;//num=num+1;
     			if(num==8)num=0;
     		}
     	}
     }
    

    }

  • 还有另外一种方法,就是设置延时函数就可以达到效果了。具体程序如下:

    #include<stc15f2k60s2.h>

    unsigned char num=0;
    unsigned char flag=0;

    void delayms(int ms);

    void main()
    {
    P2=0XA0;P0=0X00;P2=0X80;P0=0XFF; //板子初始化程序 ,以后讲

     while(1)
     {
     	if(P30==0)
     	{
     		delayms(5);
     		if(P30==0)
     		{
     			P0=~(1<<num);
     			num++;//num=num+1;
     			if(num==8)num=0;
     		}
     		while(!P30);//等待松手
     	}
     }
    

    }

    void delayms(int ms)
    {
    int i,j;
    for(i=ms;i>0;i–)
    for(j=845;j>0;j–);
    }

  • 实际上,我们也可以讲独立按键写成一个函数。具体如下:
    #include<stc15f2k60s2.h>

    void delayms(int ms);
    void keyscan();

    unsigned char num=0;
    unsigned char flag=0;
    unsigned char S7=0;

    void mian()
    {
    P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;

     while(1)
     {
     	keyscan();
     	
     	if(S7==1)
     	{
     		S7=0;//相当于标志位
     		P0=~(1<<num);
     		num++;
     		if(num==8)	num=0;
     	}
     }
    

    }

    void keyscan()
    {
    if(P30==0)
    {
    delayms(5);
    if(P30=0)//这里是两个等号
    {
    S7=1;
    }
    while(!P30);
    }
    }

    void delayms(int ms)
    {
    int i,j;
    for(i=0;i<ms;i++)
    for(j=845;j>0;j–);
    }

### 蓝桥杯单片机按键控制LED位移 在蓝桥杯竞赛中,使用单片机实现按键控制LED的位移是一个常见的题目。该功能可以通过编程使能按键输入改变LED的状态并移动其位置。 #### 原理说明 当按下同的按键时,程序会检测到相应的中断信号或状态变化,并据此调整存储于寄存器中的LED模式变量。随后,在主循环或其他处理函数内更新实际连接至LED端口的数据输出值,从而达到视觉上的光位移效果[^1]。 对于具体的硬件电路而言,一般采用矩阵键盘配合行列扫描法读取按压情况;而LED则可能被串联成流水线形式以便逐个点亮或熄灭。为了简化逻辑判断过程,还可以引入标志位来记录当前活动的LED编号以及方向参数用于指示向左还是向右切换下一个目标元件。 #### 示例代码 下面给出一段C语言编写的简易示例代码片段: ```c #include <reg52.h> sbit KEY_UP = P3^0; // 定义上键对应的I/O引脚 sbit KEY_DOWN = P3^1; // 定义下键对应的I/O引脚 sfr LED_PORT = 0x90; // 设定P1作为LED驱动接口地址 unsigned char led_pos = 0; void main(void){ while(1){ if(KEY_UP == 0){ // 如果检测到上升沿触发事件,则执行相应操作 delay(); // 防抖动延时子程序调用 move_left(); } if(KEY_DOWN == 0){ // 同样地处理下降沿的情况 delay(); move_right(); } update_led_display(); // 刷新显示 } } // 左移一位 void move_left(){ if (led_pos != 0) --led_pos; } // 右移一位 void move_right(){ if (led_pos != 7) ++led_pos; } // 更新LED显示 void update_led_display(){ unsigned char i, data=0xFF; for(i=0;i<8;++i){ if(i==led_pos) data &= ~(1<<i); // 设置对应位低电平表示亮起 } LED_PORT = data; } ``` 这段代码展示了如何利用两个外部按钮分别控制一串共阳极八段LED显示器内的光标左右游走。每当有新的指令到来时,`move_*()` 函数负责修改全局变量 `led_pos` 的数值范围限定在 `[0..7]`之间,之后再经由 `update_led_display()` 方法同步映射到物理层面上的变化上去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值