共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 跳转至页
回复
| 有奖活动 | |
|---|---|
| 这个春节你犒赏自己什么了?分享你的故事,有奖征集 | |
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3XX】Standby RAM的初始化流程被打赏¥18元 | |
| Gravity:中英文语音合成模块V2.0及其串口控制被打赏¥24元 | |
| 全彩色度变化图的绘制被打赏¥27元 | |
| 【FreeRtos】FreeRtos任务栈的生长方向管理方式被打赏¥20元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】LVGL添加输入设备:EC11旋转编码器被打赏¥39元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】RA8D1部署FreeRTOS+LVGL被打赏¥33元 | |
| 空气质量检测器设计与实现被打赏¥24元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】LWIP进行UDP、TCP、HTTP、MQTT功能联合测试被打赏¥41元 | |
| 【瑞萨RA8D1 LVGL/LWIP评测】RA8D1部署FreeRTOS+LWIP被打赏¥36元 | |
| RTOS怎么选?让我来给你答案!被打赏¥15元 | |
我要赚赏金
