#include<reg51.h>
#define GPIO_DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit P26=P2^6;
sbit P27=P2^7;
sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
//unsigned char DisplayData[8];
//用来存放要显示的8位数的值
void DigDisplay(); //动态显示函数
void Delay10ms( ); //延时10ms
void delayms(unsigned char xms);
unsigned char keyscanf(); //unsigned char keyscanf();
unsigned char time[4]={2,0,1,6};
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main(void)
{ static unsigned char st=0;
// unsigned char key;
unsigned int i;
P26=1;
P27=1;
while(1)
{
DigDisplay();
if(KEY2==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(KEY2==0)
{
for(;KEY2==0;)
P26=0;
if(time[st]<9)//if(time[0]<9&time[1]<9&time[2]<9&time[3]<9)
time[st]++;
else time[st]=0;
while((i<50)&&( KEY1=1)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
// key2
if(KEY1==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(KEY1==0)
{
for(;KEY1==0;)
P26=0;
if(time[st]!=0)
time[st]--;
else time[st]=9;
while((i<50)&&( KEY1=1)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
// key3
if(KEY3==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(KEY3==0)
{
for(;KEY3==0;)
P26=0;
if(st>=0&&st<=2)
st++;
else st=0;
while((i<50)&&( KEY1=1)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
// key4
if(KEY4==0) //检测按键K1是否按下
{
Delay10ms(); //消除抖动
if(KEY4==0)
{
for(;KEY4==0;)
P26=0;
if(st!=0)
st--;
else st=3;
while((i<50)&&( KEY1=1)) //检测按键是否松开
{
Delay10ms();
i++;
}
i=0;
}
}
}
}
/*******************************************************************************
* 函 数 名 : DigDisplay
* 函数功能 : 使用数码管显示
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<4;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=1;LSB=1;LSC=0; break;//显示第0位
case(1):
LSA=0;LSB=1;LSC=0; break;//显示第1位
case(2):
LSA=1;LSB=0;LSC=0; break;//显示第2位
case(3):
LSA=0;LSB=0;LSC=0; break;//显示第3位
}
GPIO_DIG=DIG_CODE[time];//发送段码
j=10; //扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
/*******************************************************************************
* 函 数 名 : keyscanf
* 函数功能 : 扫描按键
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
unsigned char keyscanf() /// unsigned char keyscanf()
{
if(KEY1&KEY2&KEY3&KEY4)
{
delayms(10);
if(KEY1&KEY2&KEY3&KEY4)
{
if(!KEY1)
{ P26=0;
return(1);}
else if(!KEY2)
{ P27=0;
return(2);}
else if(!KEY3)
{ while(!KEY3)
return(3);}
else if(!KEY4)
{ while(!KEY4)
return(4);}
}
}
return (0);
}
/*******************************************************************************
* 函 数 名 : delayms
* 函数功能 : 延迟
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void delayms(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void Delay10ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
|