共2条
1/1 1 跳转至页
我的数字钟程序,请指点其中优差(我是初学者)
问
这个数字钟是用数码管显示,用二个键来控制时间的设置.
但是不知道其优差,请高手指点交流.
还有我想呼吁网上的朋友们把真的程序(没有错误,可以应用的)
贴上来,这样更有利于交流.
程序如下:#include<reg52.h>
#include<intrins.h>
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};
unsigned char led[6];
unsigned int k,m,w;
unsigned char i,j,flash_wei=0xff;
struct time{
unsigned char sec;
unsigned char min;
unsigned char hour;
};
struct time clock;
sbit P26=P2^6;
sbit P27=P2^7;
bit flash=1;
bit keypress=0;
bit en_fresh=0;
fresh_led()
{led[0]=clock.sec%10;
led[1]=clock.sec/10;
led[2]=clock.min%10;
led[3]=clock.min/10;
led[4]=clock.hour%10;
led[5]=clock.hour/10;
en_fresh=0;
}
void display() //显示函数
{
if((flash_wei==j)&&(!flash))
P1=seg[10];
else
P1=seg[led[j]];
P3=_crol_(P3,1);
if(++j==7)
{
j=0;P3=0x7F;
}
}
void initial_clock()
{
TR0=0;
TH0=0x06;
TL0=0x06;
TR0=1;
}
unsigned char key_hit()
{if((!P26)||(!P27))
{keypress=1;
while(w<200);
keypress=0;
if(!P26)
{while(!P26);
return(1);}
else if(!P27)
{while(!P27);
return(2);}
else
return(0);
}
else
return(0);
}
key1()
{
if(flash_wei==0xff)
flash_wei=0;
else
{if(++flash_wei==6)
flash_wei=0xff;
}
}
key2()
{unsigned char f;
switch(flash_wei)
{case 0:f=led[0];
if(++f==10)
f=0;
clock.sec=led[1]*10+f;
break;
case 1:f=led[1];
if(++f==6)
f=0;
clock.sec=led[0]+f*10;
break;
case 2:f=led[2];
if(++f==10)
f=0;
clock.min=led[3]*10+f;
break;
case 3:f=led[3];
if(++f==6)
f=0;
clock.min=led[2]+f*10;
break;
case 4:f=led[4];
f++;
if((led[5]==2)&&(f==4))
f=0;
if(f==10)
f=0;
clock.hour=led[5]*10+f;
break;
case 5:f=led[5];
f++;
if((led[4]>=4)&&(f==2))
f=0;
if(f==3)
f=0;
clock.hour=f*10+led[4];
break;
}
}
void timer0_isr(void) interrupt 1
{
if(keypress)
w++;
if(++i==12)
{
i=0;
display();
}
if(flash_wei==0xff)
{
if(++k==4000)
{en_fresh=1;
k=0;
{if(++clock.sec==60)
{clock.sec=0;
if(++clock.min==60)
{clock.min=0;
if(++clock.hour==24)
clock.hour=0;
}
}
}
}
}
else
{k=0;
if(++m==1000)
{m=0;flash=~flash;}
}
}
void main()
{unsigned char z;
initial_clock();
TMOD=0x02;
EA=1;
ET0=1;
P3=0x7F;
while(1)
{if(en_fresh)
fresh_led();
z=key_hit();
switch(z)
{
case 0:;break;
case 1:key1();break;
case 2:key2();fresh_led();break;
}
}
}
答 1: 你的程序注释太少,看起来太累发原理图和源程序给我吧,我的邮箱:daniel_wind@163.com,只能在晚上才能看到邮件.
但是不知道其优差,请高手指点交流.
还有我想呼吁网上的朋友们把真的程序(没有错误,可以应用的)
贴上来,这样更有利于交流.
程序如下:#include<reg52.h>
#include<intrins.h>
unsigned char code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98,0xff};
unsigned char led[6];
unsigned int k,m,w;
unsigned char i,j,flash_wei=0xff;
struct time{
unsigned char sec;
unsigned char min;
unsigned char hour;
};
struct time clock;
sbit P26=P2^6;
sbit P27=P2^7;
bit flash=1;
bit keypress=0;
bit en_fresh=0;
fresh_led()
{led[0]=clock.sec%10;
led[1]=clock.sec/10;
led[2]=clock.min%10;
led[3]=clock.min/10;
led[4]=clock.hour%10;
led[5]=clock.hour/10;
en_fresh=0;
}
void display() //显示函数
{
if((flash_wei==j)&&(!flash))
P1=seg[10];
else
P1=seg[led[j]];
P3=_crol_(P3,1);
if(++j==7)
{
j=0;P3=0x7F;
}
}
void initial_clock()
{
TR0=0;
TH0=0x06;
TL0=0x06;
TR0=1;
}
unsigned char key_hit()
{if((!P26)||(!P27))
{keypress=1;
while(w<200);
keypress=0;
if(!P26)
{while(!P26);
return(1);}
else if(!P27)
{while(!P27);
return(2);}
else
return(0);
}
else
return(0);
}
key1()
{
if(flash_wei==0xff)
flash_wei=0;
else
{if(++flash_wei==6)
flash_wei=0xff;
}
}
key2()
{unsigned char f;
switch(flash_wei)
{case 0:f=led[0];
if(++f==10)
f=0;
clock.sec=led[1]*10+f;
break;
case 1:f=led[1];
if(++f==6)
f=0;
clock.sec=led[0]+f*10;
break;
case 2:f=led[2];
if(++f==10)
f=0;
clock.min=led[3]*10+f;
break;
case 3:f=led[3];
if(++f==6)
f=0;
clock.min=led[2]+f*10;
break;
case 4:f=led[4];
f++;
if((led[5]==2)&&(f==4))
f=0;
if(f==10)
f=0;
clock.hour=led[5]*10+f;
break;
case 5:f=led[5];
f++;
if((led[4]>=4)&&(f==2))
f=0;
if(f==3)
f=0;
clock.hour=f*10+led[4];
break;
}
}
void timer0_isr(void) interrupt 1
{
if(keypress)
w++;
if(++i==12)
{
i=0;
display();
}
if(flash_wei==0xff)
{
if(++k==4000)
{en_fresh=1;
k=0;
{if(++clock.sec==60)
{clock.sec=0;
if(++clock.min==60)
{clock.min=0;
if(++clock.hour==24)
clock.hour=0;
}
}
}
}
}
else
{k=0;
if(++m==1000)
{m=0;flash=~flash;}
}
}
void main()
{unsigned char z;
initial_clock();
TMOD=0x02;
EA=1;
ET0=1;
P3=0x7F;
while(1)
{if(en_fresh)
fresh_led();
z=key_hit();
switch(z)
{
case 0:;break;
case 1:key1();break;
case 2:key2();fresh_led();break;
}
}
}
答 1: 你的程序注释太少,看起来太累发原理图和源程序给我吧,我的邮箱:daniel_wind@163.com,只能在晚上才能看到邮件.
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |