单片机的独立键盘可以靠它的按下,松开来控制流水灯的打开或熄灭,也可以用来调节液晶显示屏的数字,但它的按下操作中,可能会有断断续续的连接和断开,中间就要用到消抖的操作,具体代码如下:
#include <reg52.h>
#include <intrins.h>#define uchar unsigned char
#define uint unsigned int
sbit we = P2^7;
sbit du = P2^6;
sbit S4 = P3^2;
sbit S5 = P3^3;
uchar ledflow = 0x7f;
uchar counter,time_counter;
uchar code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
void display(uchar i)
{
uchar shi,ge;
shi = i / 10; //求模
ge = i % 10; //求余
P0 = 0xff;//在位选打开之前把所有的数码管都关闭
we = 1;
P0 = 0xbf; //1011 1111点亮第七位数码管
we = 0;
du = 1;
P0 = leddata[shi];
du = 0;
delay(1);
P0 = 0xff;//在位选打开之前把所有的数码管都关闭
we = 1;
P0 = 0x7f;//0111 1111点亮第八位数码管
we = 0;
du = 1;
P0 = leddata[ge];
du = 0;
delay(1);
}
void main()
{
while(1)
{
display(time_counter);
if(S4 == 0)
{
delay(5);//软件消抖
if(S4 == 0)
{
time_counter++;
while( !S4 );//松手检测
}
}
if(S5 == 0)
{
delay(5);//软件消抖
if(S5 == 0 && time_counter != 0)
{
time_counter--;
while( !S5 );//松手检测
}
}
}
}