#include<reg52.h>
#include <intrins.h>
sbit p10=P1^0; //数码管控制端
sbit p11=P1^1;
sbit p12=P1^2;
sbit p13=P1^3;
sbit p20=P2^0; //按键控制端
sbit p21=P2^1;
sbit p22=P2^2;
sbit p27=P2^7;
bit GoFlag;
#define uchar unsigned char
uchar a=2,b=2,c=2,d=2,num,e,f,g,h;
int n;
uchar shu[10][7]={ {0xfb,0x7b,0x3b,0x1b,0x0b,0x0b,0x03},
{0xbf,0xbf,0x9f,0x9f,0x9f,0x9f,0x9f},
{0x7f,0x3f,0x3d,0x35,0x25,0x25,0x25},
{0x7f,0x3f,0x3d,0x1d,0x0d,0x0d,0x0d},
{0xfb,0xfb,0xf9,0xf9,0xb9,0xb9,0x99},
{0xfb,0xf9,0xd9,0xc9,0x49,0x49,0x49},
{0x7f,0x7b,0x73,0x63,0x43,0x41,0x41},
{0x7f,0x3f,0x1f,0x1f,0x1f,0x1f,0x1f},
{0xfb,0x7b,0x3b,0x39,0x31,0x21,0x01},
{0xfd,0xf9,0x79,0x39,0x19,0x09,0x09} };//数码管显示
uchar shu_[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//0到9
uchar ge_[]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08};//个位显示
//////////////////////////////////////////////////
/*延时程序*/
void delay(uchar i) //i*1ms的时间
{
uchar b;
while(i--)
{
for(b=124;b>0;b--) ; //1ms延时
// for(a=4;a>0;a--);
}
}
////////////////////////////////////////////////
void LED ()
{
p27=0;
delay(125);
p27=1;
}
//////////////////////////////////////////////////
/*一笔一划写出4个数字*/
void bihuaxianshi()
{
uchar j,i;
while(1)
{
for(j=0;j<7;j++)
for(i=0;i<50;i++)
{
P1=0x08; //第一位
P3=shu[a][j];
delay(5);
}
for(j=0;j<7;j++)
for(i=0;i<50;i++)
{
P1=0x04; //第二位
P3=shu
[j];
delay(5);
P1=0x08; //第一位
P3=shu[a][6];
delay(5);
}
for(j=0;j<7;j++)
for(i=0;i<35;i++)
{
P1=0x02; //第三位
P3=shu[c][j];
delay(5);
P1=0x04; //第二位
P3=shu[6];
delay(5);
P1=0x08; //第一位
P3=shu[a][6];
delay(5);
}
for(j=0;j<7;j++)
for(i=0;i<25;i++)
{
P1=0x01; //第四位
P3=shu[d][j];
delay(5);
P1=0x02; //第三位
P3=shu[c][6];
delay(5);
P1=0x04; //第二位
P3=shu[6];
delay(5);
P1=0x08; //第一位
P3=shu[a][6];
delay(5);
}
while(1) //稳定显示
{
P1=0x01; //第四位
P3=shu[d][6];
delay(5);
P1=0x02; //第三位
P3=shu[c][6];
delay(5);
P1=0x04; //第二位
P3=shu[6];
delay(5);
P1=0x08; //第一位
P3=shu[a][6];
delay(5);
}
}
}
/////////////////////////////////////////////
void Init_Timer1(void)
{
TMOD |= 0x10; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH1=0xee; //重新赋值 5ms
TL1=0x79;
EA=1; //总中断打开
ET1=1; //定时器中断打开
TR1=1; //定时器开关打开
}
//////////////////////////////////////////
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0 = 0xec; //给定初值,赋值 5ms
TL0 = 0x78;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/////////////////////////////////////////////////
void Timer1_isr(void) interrupt 3 // 定时器中断子程序
{
num++;
TH1=0xee; //重新赋值 5ms
TL1=0x79;
}
/////////////////////////////////////////////////
void daojishu() //数字以一秒为间隔计数
{
uchar w=n;
while(w)
{
P1=0x00;
p10=1;
P3=shu_[w%10];
delay(5);
P1=0x00;
p11=1;
P3=shu_[w/10];
delay(5);
if(num>=200) //200*5ms=1s
{
num=0;
w--;
LED();
}
}
do
{
P1=0x00;
p10=1;
P3=shu_[w%10];
delay(5);
P1=0x00;
p11=1;
P3=shu_[w/10];
delay(5);
if(num>=200) //200*5ms=1s
{
num=0;
w++;
LED();
}
}while(n>=w);
}
////////////////////////////////////////////////
void jiajian() //按键控制单个数码管的加减
{
int i=c;
uchar j;
uchar num=0;
p11=1;
P3=shu_;
while(1)
{
if(p20==0) //切换键 ,如果检测到低电平,说明按键按下
{
delay(10); //延时去抖
if(p20==0) //再次确认按键是否按下,没有按下则退出
{
while(p20==0)
{
delay(10);
if(++num>200) num=201;
}
if(num<200&&num>0)
{
if(j%2==0)
{ c=i; i=d; p11=0; p10=1;P3=shu_;} //先保存后赋值
if(j%2==1)
{ d=i; i=c; p10=0; p11=1;P3=shu_;}
j++;
LED();
}
}
}
if(num==201) //跳出加减控制状态
{
if(j%2==0)
{ c=i; } //先保存i的值
if(j%2==1)
{ d=i; }
while(num--)
{
P1=0x01; //第四位
P3=shu_[d];
delay(5);
P1=0x02; //第三位
P3=shu_[c];
delay(5);
}
n=c*10+d;
break;
}
if(p21==0) //判断加程序
{
delay(10);
if(p21==0)
{
while(p21==0)
{
num++;
delay(10);
if(num ==200)
{
while(p21==0)
{
i++;
if(i>9)
i=0;
P3=shu_;
delay(50);
LED();
}
num=0;
}
}
if(num<200&&num>0)
{
i++;
if(i>9) i=0;
P3=shu_;
LED();
}
num=0;
}
}
if(p22==0) //判断减程序
{
delay(10);
if(p22==0)
{
while(p22==0)
{
delay(10);
num++;
if(num==200)
{
num=0;
while(p22==0)
{
i--;
if(i<0)
i=9;
P3=shu_;
delay(50);
LED();
}
num=0;
}
}
if(num<200&&num>0)
{
i--;
if(i<0) i=9;
P3=shu_;
LED();
num=0;
}
}
}
}
}
/////////////////////////////////////////////////
// 定时器中断子程序
void Timer0_isr(void) interrupt 1
{
unsigned char num;
TH0 = 0x0Ec; //重新赋值 5ms
TL0 = 0x78;
if(GoFlag)
{
num++;
if(num==2)
{
num=0;
d++;
if (d==10)//10毫秒进1
{
d=0;
c++;//分秒加1
if(c==10)//10分秒进1
{
c=0;
b++;//秒加1
if(b==10)//10秒进1
{
b=0;
a++;
if(a>9) {a=0,b=0,c=0,d=0;}
}
}
}
}
}
}
////////////////////////////////////
// 按键执行相应操作
void dakaiguanbi()
{
GoFlag=!GoFlag; //利用外部中断打开和关闭定时标志 用于开始和停止计时
return;
}
/////////////////////////////////////////////////
void main() //主函数
{
EA=1;
EX0=1;
while(1)
{ Init_Timer1(); //定时器初始化
P2=0xff;
P1=0x00;
jiajian(); //按键控制单个数码管的加减
daojishu(); //数字以一秒为间隔计数
bihuaxianshi(); //一笔一划显示出当前数值
num=0,e=0,f=0,g=0,h=0;
Init_Timer0();
while(1)
{
P1=0x01; //第四位
P3=shu_[h];
delay(15);
P1=0x02; //第三位
P3=shu_[g];
delay(15);
P1=0x04; //第二位
P3=ge_[f];
delay(15);
P1=0x08; //第一位
P3=shu_[e];
delay(15);
if(p22==0)
{
delay(10);
dakaiguanbi();
}
if(p20==0&&GoFlag==0) {e=0;f=0;g=0;h=0;} //利用按键控制清零,停止时才可以清零
}
}
此帖出自小平头技术问答
一周热门 更多>