按下接通,松开断开。
一共四个管脚,两对距离较远的初始状态是导通的,按下之后另外两对才导通。
TXD接P3.0口,RXD接P3.1口
K1,2,3,4分别接的是P31,P30,P32,P33,另一端共地,即按键按下时端口会被拉低。
内部结构图:
输入1,则输出1;
输入0,则输出0.
(例如输入1 的时候,非门输出0,二极管不导通,IO直接从VCC输出1;输入0的时候,非门输出1,二极管导通,IO从GND输出0)
闭合和断开时触电存在抖动现象。
需要软件消抖处理或者硬件消抖电路(如下图)
硬件消抖通过RC充放电时间来实现。(成本较高电路较复杂)
一般使用软件消抖,延时10ms
使用独立按键k1控制led1的状态反转,按一下反转一下,程序如下:
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P2^0;//D1
sbit k1=P3^1;//K1
void delay(u16 i)
{
while(i--);
}
void key()
{
if(k1==0)
{
delay(1000);//延时10ms用于消抖
if(k1==0)
{
led=~led;//实现led的状态反转
while(!k1); //只有k1=1的时候即松开的时候退出
}
}
}
void main()
{
while(1)
{
key();
}
}
使用独立按键k1控制led1反转,按下时候灭掉,松开亮起,程序如下:
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P2^0;//D1
sbit k1=P3^1;//K1
void delay(u16 i)
{
while(i--);
}
void key()
{
if(k1==0)
{
delay(1000);//延时10ms用于消抖
if(k1==0)
{
led=~led;//实现led的状态反转
while(!k1);//直到松开,循环停止,进行后边的程序
}
}
if(k1==1) //用于松开时
{
delay(1000);
if(k1==1)
{
led=~led;
while(k1);//直到闭合,循环停止,进行后边的程序
}
}
}
void main()
{
while(1)
{
key();
}
}
使用独立按键控制动态数码管是否显示,松开显示按下熄灭:
#include<reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k1=P3^1;
u8 code smgduanxuan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delay(u16 i)
{
while(i--);
}
void saomiao()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i)
{
case 0:LSA=0;LSB=0;LSC=0;break;
case 1:LSA=1;LSB=0;LSC=0;break;
case 2:LSA=0;LSB=1;LSC=0;break;
case 3:LSA=1;LSB=1;LSC=0;break;
case 4:LSA=0;LSB=0;LSC=1;break;
case 5:LSA=1;LSB=0;LSC=1;break;
case 6:LSA=0;LSB=1;LSC=1;break;
case 7:LSA=1;LSB=1;LSC=1;break;
}
P0=smgduanxuan[i];
delay(100);
P0=0x00;
}
}
void main()
{
while(1)
{
saomiao();
while(!k1);//当k1=0即按下时,循环进行,程序不往下进行,从而数码管熄灭
}
}