编程4--独立按键

  • 格式:doc
  • 大小:31.00 KB
  • 文档页数:3

独立键盘

前面我们讲了常用的元器件,例如数码管,LED,继电器,蜂鸣器等这一类的期间,接下来我们讲一下键盘的使用,这些器件使我们在后面学习过程中要用到的器件所以我们在这里把这些常用的器件进行一一说明,今天这节课我们来说一下键盘的使用。

键盘分为编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或者键值得称为编码键盘,如计算机键盘,而靠软件编程来识别的键盘称为非编码键盘,在单片机组成的各种系统中,用的较多的是非编码键盘,非编码键盘又分为独立键盘和行列式键盘也称为矩阵式键盘。

在这里我们用按键来控制数码管的显示,按键一次,数码管的数值加1,加到9结束然后再从零开始。下面我们来写一段程序。

#include

#define uchar unsigned char

#define uint unsigned int

sbit K0=P1^0;

uchar num;

unsigned char code s8[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay1ms(uint i)

{uchar j;

while(i--)

{for(j=0;j<115;j++); //1ms基准延时程序

}

}

void delay500us()

{unsigned char j;

for(j=0;j<57;j++); //500us基准延时程序

}

void main()

{ P0=0;

while(1)

{

if(K0==0)

{ num=num+1;

if(num==8)

{

num=0;

}

}

P0=s8[num];

}

}

当我们在硬件仿真的时候发现数码管并不是按照我们想想中的方式进行加法,而是一次加几个数字,产生的原因是由于按键的抖动现象造成的,所以按键在使用的时候要对她进行消抖或者防抖动作。这里的防抖方法有两种方式,一种是硬件防抖,一种是软件防抖。首先来看案件的操作过程,在按键按下去的时候和弹起来的时候都产生了10-20ms的抖动现象,我们仿真的时候这个数字跳动就是由于这些抖动引起的,这些微小的起伏称为噪声。

硬件防止抖动的方法是用RC电路来控制抖动电压。有两个电路见备课笔记手写。

我们用软件修改一下,让抖动的时间消除。写一段延时。但是这时候还是会出现跳动,怎么解决,原因是什么?我们的while语句一直在执行程序,需要等按键松开以后再去执行while语句,因此我们在程序里面加一句等待按键执行结束的语句。

#include

#define uchar unsigned char

#define uint unsigned int

sbit K0=P1^0;

uchar num;

unsigned char code s8[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay1ms(uint i)

{uchar j;

while(i--)

{for(j=0;j<115;j++); //1ms基准延时程序

}

}

void delay500us()

{unsigned char j;

for(j=0;j<57;j++); //500us基准延时程序

}

void main()

{ P0=0;

while(1)

{

if(K0==0)

{ num=num+1;

if(num==8)

{num=0;

}

while(!K0);//等待按键释放

}

P0=s8[num];

}

}

接着我们将刚才讲的蜂鸣器也加进来,让按键的同时带有声音, #include

#define uchar unsigned char

#define uint unsigned int

sbit K0=P1^0;

uchar num;

unsigned char code s8[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay1ms(uint i)

{uchar j;

while(i--)

{for(j=0;j<115;j++); //1ms基准延时程序

}

}

void delay500us()

{unsigned char j;

for(j=0;j<57;j++); //500us基准延时程序

}

void beep() //产生1KHZ频率声音的函数

{

fmq=0;

delay500us();

fmq=1;

delay500us();

}

void main()

{ P0=0;

while(1)

{

if(K0==0)

{

for(i=0;i<100;i++)

{

beep();

}

num=num+1;

if(num==8)

{num=0;

}

while(!K0);//等待按键释放

}

P0=s8[num];

}

}