#include <reg51.h>
/********定义按键引脚********/
sbit key_One = P2^3;
sbit key_Two = P2^2;
sbit key_Three = P2^1;
sbit key_Four = P2^0;
unsigned char code num[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9数字的8421编码
unsigned char code wei[] = {0x7f,0xbf,0xdf,0xef}; //数码管位选编码
char number = 0; //要显示的数字
unsigned char key_Buff; //按键键值缓冲值
/********函数声明********/
void delay(int z);
void display(int x);
char key_Scan();
void main()
{
while(1)
{
key_Buff = key_Scan(); //将按键值存入缓冲区
switch(key_Buff) //判断缓冲区的值
{
case 0: break;
case 1: number++; //按键1按下,number自加一并将按键
if(number >= 255)
number = 255; //number值大于255不再自加
key_Buff = 0; //按键值缓冲区清零,防止下次按键未按下还再次进入
break;
case 2: number--;
if(number <= 0)
number = 0;
key_Buff = 0;
break;
case 3: break;
case 4: break;
}
display(number); //数码管显示
}
}
/***************************************/
/**函数名: delay(z)
/**函数功能: 粗略延时
/**输入参数: z表示要延时的毫秒数
/**示例: delay(300) //粗略延时300毫秒
/***************************************/
void delay(int z)
{
int x,y;
for(x=z; x>0; x--)
for(y=110; y>0; y--);
}
/***************************************/
/**函数名: display()
/**函数功能: 数码管显示函数
/**输入参数: x:要显示的数
/**示例: display(1234); //显示1234
/***************************************/
void display(int x)
{
unsigned char ge, shi, bai, qian;
/*************************/
/**提取x的个十百千位
/**‘/’为取模运算
/**‘%’为求余运算
/*************************/
qian = x/1000 %10;
bai = x/100 %10;
shi = x/10 %10;
ge = x/1 %10;
P0 = ~num[qian]; //显示千位
P2 = wei[0]; //第0个数码管显示
delay(2); //延时2毫秒
P0 = ~num[bai]; //显示百位
P2 = wei[1];
delay(2);
P0 = ~num[shi]; //显示十位
P2 = wei[2];
delay(2);
P0 = ~num[ge]; //显示个位
P2 = wei[3];
delay(2);
P0 = 0xff; //数码管消隐
}
/***************************************/
/**函数名: key_Scan()
/**函数功能: 按键扫描函数
/**输入参数: 无
/**返回参数: 按键的键值
/**示例: key_Buff = key_Scan();
/***************************************/
char key_Scan()
{
char key_Value = 0; //按键键值,用于返回键值使用
P2 = 0x0f; //将按键引脚电平拉高
if(key_One == 0) //检测按键1是否被按下
{
delay(10); //延时消抖
while(key_One == 0) //按键1确定被按下
{
key_Value = 1; //按键键值置1
display(number); //调用显示函数,防止按键一直被按下时数码管不显示
}
}
if(key_Two == 0) //按键2的检测
{
delay(10);
while(key_Two == 0)
{
key_Value = 2;
display(number);
}
}
if(key_Three == 0)
{
delay(10);
while(key_Three == 0)
{
key_Value = 3;
display(number);
}
}
if(key_Four == 0)
{
delay(10);
while(key_Four == 0)
{
key_Value = 4;
display(number);
}
}
return key_Value; //返回键值
}
|