02 蓝桥杯--按键与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–);
    }

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值