测试按键不是很灵有时候按了,有时候要按两次! 如何消除抖动!
#include <reg52.h>
#include <intrins.h>
//SPI 接口
sbit CLK = P3^6; //串行时钟
sbit IN_PL = P1^6; //把数据加载到锁存器中
sbit IN_Dat = P1^7; //数据通过P1.7脚移进单片机内处理
sbit RELAY = P1^4; //继电器
unsigned char bdata Key;
sbit K0=Key^0; //位定义
sbit K1=Key^1; //位定义
sbit K2=Key^2; //位定义
sbit K3=Key^3; //位定义
sbit K4=Key^4; //位定义
sbit K5=Key^5; //位定义
sbit K6=Key^6; //位定义
sbit K7=Key^7; //位定义
bit M0 ,K0J; //位定义
unsigned long HC165_Init(void)
{
unsigned char i;
unsigned int indata;
IN_PL=0; //上升沿
_nop_(); //短暂延时 产生一定宽度的脉冲
IN_PL=1; //将外部信号全部读入锁存器中
_nop_();
indata=0; //保存数据的变量清0
for(i=0; i<8; i++)
{
indata=indata<<1; //左移一位
if(IN_Dat==1)
indata=indata+1; //如果IN_Dat检测到高电平 保存数据的变量加1
CLK=0; //时钟置0
_nop_(); //上升沿
CLK=1; //时钟置1
}
return(~indata); //将保存数据的变量取反后返回
}
main()
{
while(1)
{
unsigned long Input=HC165_Init(); //调用165驱动程序
Key=Input&0xff; //将数据传给位变量
RELAY = 1;
P2 = 0xff; //清除
if(K0&K0J)
M0=~M0; //实现脉冲输入 大家仔细体会
K0J=~K0;
if(M0==0x7f) {RELAY = 0;}
}
}