个位大侠参考一下程序编写有那些需要改进的地方以及编程方法!总感觉编写的不够专业!
/********************************************************
利用中断编写的简易电子钟
********************************************************/
//作者:xxq
//日期:2011年6月17日
//功能:启动显示12—00—00时间开始走,按下第一下DL1调整小时(按DL2加,按DL4减),
// 按第二下DL1调整分钟(按DL3加,按DL4减)
//利用定时器0;12Mhz晶振
#include<reg51.h>
#define uint unsigined int
#define uchar unsigined char
sbit DL1=P1^4; // 功能切换键
sbit DL2=P1^5; // 时加
sbit DL3=P1^6; // 分加
sbit DL4=P1^7; // 减
char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
//数字0————————————————————9
char chunshu[8]={0x00,0x00, 0x00, 0x00,0x00, 0x00, 0x00,0x00};
char s, f, m,b;
char weishu[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff}; //数码管位数显示
/*******************数码管显示函数***************************************/
int shaomaio()
{
int a,c,d,i;
{
chunshu[1]=m/10; //显示秒
chunshu[0]=m%10;
chunshu[4]=f/10; //显示分
chunshu[3]=f%10;
chunshu[7]=s/10; //显示时
chunshu[6]=s%10;
for(i=0;i<2;i++) //第1 第2 位 显示秒
{
P0=table[chunshu[i]];
P2=weishu[i];
for(a=0;a<60;a++);
}
P0=0xbf; //第3位显示“—”
P2=0xfa;
for(a=0;a<20;a++);
for(c=3;c<5;c++) //第4 第5位 显示分
{
P0=table[chunshu[c]];
P2=weishu[c];
for(a=0;a<60;a++);
}
P0=0xbf; //第6位显示“—”
P2=0xfd;
for(a=0;a<20;a++);
for(d=6;d<8;d++) //第7 第8 位 显示时
{
P0=table[chunshu[d]];
P2=weishu[d];
for(a=0;a<50;a++);
}
}
}
/*********************主函数**********************************/
main()
{
int a,c=0;
P1=0xff;
s=12; //时
f=0; //分
m=0; //秒
b=0;
TMOD=0x01;//定时器0工作在模式0;
TH0=(65536-50000)/256; //定时50毫秒
TL0=(65536-50000)%256;
EA=1; //打开总中断
ET0=1; //打开内部中断0
TR0=1;
while(1)
{
/******************开始走动*************************************/
shaomaio(); //扫描数码管
if(b==20)//b=20时刚好一秒
{
b=0;
m=m+1; //秒每次加1
if(m>59)
{
shaomaio(); //扫描数码管
m=0;
f=f+1;
if(f>59)
{
shaomaio(); //扫描数码管
f=0;
s=s+1;
if(s==24)
{
s=0;
f=0;
m=0;
}
}
}
}
/*********************功能切换**********************************/
if(DL1==0) //检测按键是否按下
{
for(a=0;a<38;a++) //按键去抖
{
shaomaio(); //扫描数码管
}
if(DL1==0) //再次检测按键是否按下
{
c=c+1;
if(c>2)
{
c=0;
EA=1;//开中断秒开始走动
//TH0=(65536-50000)/256;
//TL0=(65536-50000)%256;
}
}
}
/*********************时设置**********************************/
if(c==1)
{
EA=0; //关闭中断停止秒走动
if(DL2==0) //检测按键是否按下
{
for(a=0;a<38;a++) //按键去抖
{
shaomaio(); //扫描数码管
}
if(DL2==0) //再次检测按键是否按下
{
s=s+1;
if(s==24) s=0;
}
}
if(DL4==0&&c==1)
{
for(a=0;a<38;a++) //按键去抖
{
shaomaio(); //扫描数码管
}
if(DL4==0)
{
s=s-1;
if(s<0) s=0;
}
}
}
/*********************分设置**********************************/
if(c==2)
{ EA=0; //关闭中断停止秒走动
if(DL3==0) //检测按键是否按下
{
for(a=0;a<38;a++) //按键去抖
{
shaomaio(); //扫描数码管
}
if(DL3==0) //再次检测按键是否按下
{
f=f+1;
if(f>59) f=0;
}
}
if(DL4==0&&c==2)
{
for(a=0;a<38;a++) //按键去抖
{
shaomaio(); //扫描数码管
}
if(DL4==0)
{
f=f-1;
if(f<0) f=0;
}
}
}
/*******************************************************/
}
}
/***************中断函数****************************************/
void zhong_duan() interrupt 1
{
//shaomaio(); //扫描数码管
TH0=(65536-50000)/256;//高8位
TL0=(65536-50000)%256;//低8位
b=b+1; //记录中断次,数每次中断50ms
}