/*********************************
标题:基于普中51单片机的按键流水灯
作者:Guanglei Bie
邮箱:bglei@foxmail.com
*********************************/
#include<reg52.h>
#include<intrins.h>
unsigned char flag=0;
sbit kk=P1^3; //第一列按键
unsigned char kbuff=0xFF; //连续八位状态检查缓存区
bit ksta=1; //按键稳定状态
bit backup=1; //上一个按键稳定状态
void main()
{
unsigned char temp; //P2口的小名
unsigned char LH=0; //按键按下次数,0~13一循环
unsigned char YS=0; //判断是否走到头
temp=0xfe; //右边第一个小灯亮
P1=0x7F; //选中第一行按键
TMOD=0x01; //定时器方式1
TH0=0xFC; //16位定时器0xFC67到1ms溢出
TL0=0x67;
TR0=1; //开定时器0
EA=1; //中断使能(总开关打开)
ET0=1; //定时器0的中断打开
while(1)
{
P2=temp;
if(backup!=ksta) //判断上一状态是否与目前状态一致
{
if(backup==0) //此处判断上升沿(松开按键才变化),也可以判断下降沿
{
LH++; //按键按下次数,0~13一循环
if(LH>=14)
{
LH=0;
}
YS=(LH-1)/7; //根据0和1,判断往左还是往右
if(YS==0)
{
temp=_crol_(temp,1);
}
else
{
temp=_cror_(temp,1);
}
}
backup=ksta; //状态值暂存
}
}
}
void InterruptTime0() interrupt 1
{
TH0=0xFC;
TL0=0x67;
kbuff=(kbuff<<1)|kk; //读取连续八位按键状态值
if(kbuff==0x00) //连续00000000
{
ksta=0;
}
else if(kbuff==0xFF) //连续11111111
{
ksta=1;
}
}
51单片机:按键流水灯