按你的要求,写了下,仿真通过
/****************************************************************************
P0口接数码管,
*****************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar led_tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //共阴数码管段码 0-9
uchar led_num; //LED计数值
uchar num_L,num_H; //LED计数值高低位分离
uint key_cont; //按键消抖计数
bit key_lock; //按键自锁标志
sbit P20=P2^0; //数码管 个位
sbit P21=P2^1; // 数码管 十位
sbit key = P3^0; //按键
//////////////////////////////////
void delayms(uint ms)
{
uint i,j;
for(j = 0; j < ms; j--)
for(i = 0;i < 120; i++);
}
//////////////////////////////
void display()
{
if(led_num<10)
{
P20=0;
P21=1;
P0=led_tab[led_num];
delayms(10);
}
else
{
num_L=led_num%10;
num_H=led_num/10;
P20=1;
P0=led_tab[num_H];
P21=0;
delayms(5);
P21=1;
P0=led_tab[num_L];
P20=0;
delayms(5);
}
}
////////////////////////////
void keyscan()
{
if(key) //按键没按下
{
key_cont = 0;
key_lock = 0;
}
else if(key_lock == 0) //短按
{
key_cont++;
if(key_cont>100)
{
key_lock = 0;
}
key_lock = 1;
led_num++;
if(led_num>100)
led_num=0;
}
else if(key_cont<1000) //长按
{
key_cont++;
if(key_cont==1000)
{
key_cont=900; //这里调节长按连加的速度
led_num+=10;
if(led_num>100)
led_num=0;
}
}
}
///////////////////////////
void main(void)
{
led_num=21;
while(1)
{
display();
keyscan();
}
}
|