小弟新手上路,第一次写程序,先请各位海涵,里面肯定有很多繁琐的地方和缺陷,只是能够演示实验的基本要求了,希望大家看完之后能够多给点意见,给小弟指出一个方向,如何更好的编写程序代码,能够适应现在工程开发设计思想。小弟不胜感激~
实验要求:
总体需求:根据设定的时间、时间范围为1-999分钟,使用3位数码管显示
具体要求:使用3个健,分别为开始修改键s1、光标移位键s2、修改数字键s3
按键含义:开始修改键s1:单次按键进入修改状态,偶次按键退出修改状态并开始倒计时,倒计时设定的数字值每分钟减一并显示,倒计时计时到零时,蜂鸣器响10秒钟后停止。
光标移位键s2:在修改状态下,按s2键光标依次在数码管移动,该位数码管0.5秒闪烁。在此闪烁位置,每按修改数字键s3一次,该位置上的数字加1,当数字为9时加一数字变为0.
数字修改键 s3: 见上s2键说明。
手动复位键 s6: 复位电路使用专用的复位芯片。
电源使用:使用外接未稳压电源。要求使用7805做电源电压稳压。
电路板设计要求:电路板尺寸为10cm*10cm
程序:
#include <reg52.h>
#include <ABSACC.H>
#define uint unsigned int
#define uchar unsigned char
bit t10msflag=0;
bit onceflag=1;
bit keysuccflag=0;
bit shanshuoflag=0;
bit modeflag=0;
bit baojingflag=0;
sbit P1_1=P1^1;
bit jianyiflag=0;
bit tingflag=0;
bit startflag=0;
uchar keystate=0;
uchar keyvalue=0;
uchar key_cou=0;
uchar keytime=0x23;
uchar guangbiaosel=0;
uint changedata=0;
uchar key1=0xf8;
uchar key2=0xf4;
uchar key3=0xec;
uchar key4=0xdc;
uchar key5=0xbc;
uchar key6=0x7c;
uchar s100=0;
uchar s10=0;
uchar s1=0;
uchar code disppos[3]={0xfb,0xfd,0xfe};
uchar xdata dispbuffer[3]={0xf9,0xa4,0xb0};
uchar code shuzhi[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void keyscan();
void keycheck();
void dec_disp();
void change_dec_disp();
void msDelay(uint delay);
void t1_timer() interrupt 3 using 1
{static uchar x=0;
static uint m=0;
static uint n=0;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
t10msflag=1;
if(++x>=50)
{shanshuoflag=~shanshuoflag;
x=0;}
if(baojingflag)
{if(++m>=1000)
{tingflag=1;
m=0;}
}
if(startflag)
{if(++n>=6000)
{jianyiflag=1;
n=0;
startflag=0;}
}
}
void main()
{P1_1=1;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TMOD=0x10;
TR1=1;
EA=1;
ET1=1;
while(1)
{if(t10msflag)
{t10msflag=0;
onceflag=~onceflag;}
if(onceflag)
{dec_disp();
}
if(t10msflag)
{t10msflag=0;
onceflag=~onceflag;
keyscan();
}
if(keysuccflag)
{keysuccflag=0;
keycheck();
}
if(baojingflag)
{P1_1=0;
if(tingflag)
{P1_1=1;
baojingflag=0;}
}
}
}
void keyscan()
{uchar x;
P1=P1|0xfc;
x=P1&0xfc;
if(x==0xfc)keystate=0;
switch(keystate)
{case 0:keyvalue=x;
keystate=1;
break;
case 1:if(x==keyvalue)keystate=2;
else keystate=0;
break;
case 2:if(x==keyvalue)
{++key_cou;
if(key_cou==keytime)
{keysuccflag=1;
key_cou=0;
}
}
else keystate=0;
break;
}
}
void keycheck()
{
if(keyvalue==key1)
{modeflag=~modeflag;
if(modeflag==0)
{dispbuffer[0]=shuzhi[s100];
dispbuffer[1]=shuzhi[s10];
dispbuffer[2]=shuzhi[s1];
startflag=1;
}
}
if(keyvalue==key2)
{if(++guangbiaosel>=4)guangbiaosel=1;
}
if(keyvalue==key3)
{switch(guangbiaosel)
{case 1:if(++s100>=10)s100=0;
break;
case 2:if(++s10>=10)s10=0;
break;
case 3:if(++s1>=10)s1=0;
break;
}
}
if(keyvalue==key4)
{}
if(keyvalue==key5)
{}
if(keyvalue==key6)
{}
}
void dec_disp()
{if(modeflag)
{if(shanshuoflag)
{switch(guangbiaosel)
{case 0:{dispbuffer[0]=0xff;
dispbuffer[1]=0xff;
dispbuffer[2]=0xff;
}break;
case 1:{dispbuffer[0]=0xff;
dispbuffer[1]=shuzhi[s10];
dispbuffer[2]=shuzhi[s1];
}break;
case 2:{dispbuffer[0]=shuzhi[s100];
dispbuffer[1]=0xff;
dispbuffer[2]=shuzhi[s1];
}break;
case 3:{dispbuffer[0]=shuzhi[s100];
dispbuffer[1]=shuzhi[s10];
dispbuffer[2]=0xff;
}break;
}
}
else {dispbuffer[0]=shuzhi[s100];
dispbuffer[1]=shuzhi[s10];
dispbuffer[2]=shuzhi[s1];}
}
if(jianyiflag)
{jianyiflag=0;
change_dec_disp();}
XBYTE[0xc800]=disppos[0];
XBYTE[0xcb00]=dispbuffer[0];
msDelay(6);
XBYTE[0xc800]=disppos[1];
XBYTE[0xcb00]=dispbuffer[1];
msDelay(6);
XBYTE[0xc800]=disppos[2];
XBYTE[0xcb00]=dispbuffer[2];
msDelay(6);
}
void change_dec_disp(void)
{changedata=s100*100+s10*10+s1;
if(changedata>0)
{changedata=changedata-1;
if(changedata==0){baojingflag=1;}
s100=changedata/100;
s10=changedata%100;
s10=s10/10;
s1=(changedata%100)%10;
dispbuffer[0]=shuzhi[s100];
dispbuffer[1]=shuzhi[s10];
dispbuffer[2]=shuzhi[s1];
}
}
void msDelay(uint delay)
{static uint i;
for(;delay>0;delay--)
{for(i=0;i<125;i++)
{;}
}
}
人的上半生:要不犹豫;人的下半生:要不后悔;
活在当下,把握每次的机会~~
哈哈,回想起当年读大学了,好遥远的事情了,10年就过去了。