![]() ![]() ![]() ![]() ![]() ![]() 再来一张。。。。。。。 ![]() 今日烧友为贴正名,谢之,为名副其实,补C 码一段。 段选P2口gfabced-dp.{0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0,0x7f} 位选:p1.2-p1.7. #include<reg52.h> sbit SEG1=P2^7; //小数点显示 sbit SEG2=P1^2; //段时十位 sbit SEG3=P1^3; //时个 sbit SEG4=P1^4; //分十 sbit SEG5=P1^5; //分个 sbit SEG6=P1^6; //秒十 sbit SEG7=P1^7; //秒个 unsigned char code num[]={0x81,0xe7,0x92,0xa2,0xe4,0xa8,0x88,0xe3,0x80,0xa0,0x7f}; int s=0,m=0,h=0; //定义三个全局变量s,m,h,用于存放秒分时的数值 void timer(void) interrupt 1 using 1{ int i; if(i==19) //若i=20,则是1秒,我的如果是20的话会稍慢,所以改为19 { s++; //秒数自加1 i=0; //对i清零 } if(s==60) //如果到了60秒,则对秒数清零,并同时分加一 { m++; s=0; } if(m==60) //如果到了60分,则对分数清零,并同时时数加一 { h++; //时数自加1 m=0; //对分清零 } if(h==24) //如果到了24q时,则对时数清零 { h=0; //对时清零 } i++; //每中断一次,i的值加1 TH0=(65536-52800)/256; //再给定时器赋初始值 TL0=(65536-52800)%256; } void init(void)//定时器初始函数,对定时器初始化 { EA=1; //允许所有的中断请求 TMOD=0x01; //设定时器0的工作模式为方式1 即16位定时器 ET0=1; //允许定时器0的中断请求 TH0=(65536-52800)/256; //定时时间为50ms,初始值要根据具体情况微调 TL0=(65536-52800)%256; TR0=1; //打开定时器0,开始定时 } void main() { unsigned int i; //定义一个变量,用于数码管延时 init(); //调用定时器初始化函数,对定时器进行初始化 while(1) //死循环,让数码管不断显示 { //下面是只让时十位显示,其他的关闭 i=100; //赋值给变量 SEG2=0; //三极管导通,只让该位显示,其他段关闭 P2=num[h/10]; //分离出时的十位,让数码管显示 while(i--); //延时一下,让眼睛视觉残留 SEG2=1; //关闭该位 //下面是只让钟个位显示 ,其他的关闭 i=100; //重新赋值给变量 SEG3=0; //三极管导通,只让该位显示,其他段关闭 P2=num[h%10]; //分离出时的个位,让数码管显示 SEG1=0; //在该位显示小数点 while(i--); //延时一下,让眼睛视觉残留 SEG3=1; //关闭该位 SEG1=1; //下面是只让分十位显示 ,其他的关闭 i=100; //赋值给变量 SEG4=0; //三极管导通,只让该位显示,其他段关闭 P2=num[m/10]; //分离出分的十位,让数码管显示 while(i--); //延时一下,让眼睛视觉残留 SEG4=1; //关闭该位 //下面是只让分个位显示 ,其他的关闭 i=100; //重新赋值给变量 SEG5=0; //三极管导通,只让该位显示,其他段关闭 P2=num[m%10]; //分离出分的个位,让数码管的显示 SEG1=0; //在该位显示小数点 while(i--); //延时一下,让眼睛视觉残留 SEG5=1; //关闭该位 SEG1=1; //下面是只让秒十位显示 ,其他的关闭 i=100; //赋值给变量 SEG6=0; //三极管导通,只让秒十位显示,其他段关闭 P2=num[s/10]; //分离出秒的十位,让数码管的显示 while(i--); //延时一下,让眼睛视觉残留 SEG6=1; //关闭该位 //下面是只让秒个位显示 ,其他的关闭 i=100; //重新赋值给变量 SEG7=0; //三极管导通,只让秒个位显示,其他段关闭 P2=num[s%10]; //分离出秒的个位,让数码管显示 while(i--); //延时一下,让眼睛视觉残留 SEG7=1; //关闭该位 } } (责任编辑:admin) |