今天,我们来看看按键这一部分。
首先是看看原理图,这在我们写程序时是非常重要的。这里虽然有16位按键,但蓝桥杯一般只考察最左边这一排的按键,即S7,S6,S5,S4这4个,他们由P30,P31,P32,和P33四个口控制。有人会提出疑问,怎么保证只是这一排按键起作用呢?原因是:在图的左下角有一组串口,只用将条形帽搬至2 3口就行了。那我们来看看样板图会有一个直观的认识。
我画圈的地方就是条形帽的地方。
现在,我们可以写一些代码来实现一些功能。通常来说,独立按键与LED灯 数码管相联系。我们先看第一部分:
- 独立按键和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–);
}