/************************************************************************/
/* 带加减的四位数码管计数器 */
/************************************************************************/
//如果数码管位数多一点, if 就可能会冗余文件太长了
#include
#define uchar unsigned char
#define uint unsigned int
#define duan P0 //数码管段输出
sbit jia=P1^0; //按键加
sbit jan=P1^1; //按键减
sbit qin=P1^2; //按键清零
sbit gw=P2^2; //数码管个位
sbit sw=P2^3; //数码管十位
sbit bw=P2^4; //数码管百位
sbit qw=P2^5; //数码管千位
char aa,bb,cc,dd;
uchar code tab[]={ 0xEB,/*0*/
0x21,/*1*/
0xD3,/*2*/
0x73,/*3*/
0x39,/*4*/
0x7A,/*5*/
0xFA,/*6*/
0x23,/*7*/
0xFB,/*8*/
0x7B,/*9*/
};
/*延时函数*/
void delay(uint z)
{
uint x;
for(x=z;x>0;x--);
}
/*显示函数*/
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
duan=tab[qian];
gw=0;
delay(100);
gw=1;
duan=tab[bai];
sw=0;
delay(100);
sw=1;
duan=tab[shi];
bw=0;
delay(100);
bw=1;
duan=tab[ge];
qw=0;
delay(100);
qw=1;
}
/* 按键和计算函数*/
void key()
{
if(jia==0) //这是加的程序
{
delay(100);
if(jia==0)
{
while(!jia)display(aa,bb,cc,dd);
aa++;
if(aa==10) //这个开始if 了
{
aa=0;
bb++;
if(bb==10)
{
bb=0;
cc++;
if(cc==10)
{cc=0;
dd++;
if(dd==10)
dd=0;
}
}
}
}
}
if(jan==0) //这是减程序
{
delay(100);
if(jan==0) //这也 if 了
{
while(!jan)display(aa,bb,cc,dd);
aa--;
if(aa==-1)
{
aa=9;
bb--;
if(bb==-1)
{
bb=9;
cc--;
if(cc==-1)
{
cc=9;
dd--;
if(dd==-1)
dd=9;
}
}
}
}
}
if(qin==0)
{
delay(100);
if(qin==0)
{
while(!qin)display(aa,bb,cc,dd);
aa=0;
bb=0;
cc=0;
dd=0;
}
}
}
/*主函数*/
void main()
{
 
2=0xff;
while(1)
{
key();
display(aa,bb,cc,dd);
}
}
//如果要是写一个八位数的话,if 语句就嵌套更深了,请问有什么方法能简单一点,我用switch case 没有写出来
[此贴子已经被作者于2008-9-5 9:34:50编辑过]