程序会在最后的部分:
敲重点:
1、注意标志位利用,采用设置标志位使得按键能够在松开时,数码管瞬间变化。
if(flag == 0&&key0 ==0)
{
flag = 1;
}
if(flag ==1&&key0 == 1)
//标志位使得按键松开时数码管变化
{
num++;
flag =0;
}
2、按键的使用是指在按键按下时产生一个低电位的信号,单片机接受这种信号,来实现响应的功能
3、截图没有复位和和晶振部分,但在实际连接过程中必不可少,因为在proteus中它默认就给了51芯片复位以及晶振的部分。
#include<reg51.h>
sbit key0 = P1^0;
unsigned char s[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned int num = 0,flag = 0;
void delay(unsigned int n)
{
unsigned int i = 0,j = 0;
for(i = 0;i<n;i++)
{
for(j = 0;j<120;j++);
}
}
void key ()
{
/*if(key0 == 0)
{
delay(200);
if(key0 == 0)
{
num++; //此种方法在按键持续按住时,数码管会一直发生变化
}
}*/
if(flag == 0&&key0 ==0)
{
flag = 1;
}
if(flag ==1&&key0 == 1)
//标志位使得按键松开时数码管变化
{
num++;
flag =0;
}
}
void seg()
{
P2 =s[num];
if (num == 10)
{
num = 0;
}
}
void main()
{
while(1)
{
key();
seg();
}
}
矩阵按键:采用横和列来确定矩阵中开关的具体位置。
程序如下:
#include<reg51.h>
unsigned char s[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned int num = 99;
void delay(unsigned int n)
{
unsigned int i = 0,j = 0;
for(i = 0;i<n;i++)
{
for(j = 0;j<120;j++);
}
}
void key_scan()
{
unsigned
int temp , temp0 = 0,temp1 = 0;
P1
= 0xf0;
if(P1
!= 0xf0)
{
delay(20);
temp0
= P1;
P1 = 0x0f;
if(P1
!= 0x0f)
{
delay(20);
temp1
= P1;
}
}
temp
= temp0+temp1;
if(temp
== 0xee )//仅仅设置了前四个按键分别控制0、1、2、3
{
num
= 0;
}
if(temp
== 0xde )
{
num
= 1;
}
if(temp
== 0xBe )
{
num
= 2;
}
if(temp
== 0x7e )
{
num
= 3;
}
}
void display()
{
P2
= s[num];
}
void main()
{
while(1)
{
key_scan();
display();
}
}