这样行不行?
还不行我也没办法了,你确定原理图正确吗?连线乱七八糟的。
程序代码:
还不行我也没办法了,你确定原理图正确吗?连线乱七八糟的。
程序代码:#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
//=======================================================================
void sendbyte(uint Num);
void delay( int ms);
//=======================================================================
unsigned char code LED_table[]={ //使用附带“51单片机工具箱”可以很容易编码
0x3f, //"0"
0x06, //"1"
0x5b, //"2" AAAA
0x4f, //"3" F B
0x66, //"4" F B
0x6d, //"5" GGGG
0x7d, //"6" E C
0x07, //"7" E C
0x7f, //"8" DDDD H
0x6f, //"9"
0x00, //black
0x80 //dot
};
#define black 10 // 空白
#define dot 11 // 小数点
// 定义通信端口
//===========================================================================
sbit COM3=P1^0;
sbit COM2=P1^6; //对应口线由硬件确定
sbit COM1=P1^5;
sbit COM0=P1^4;
//===========================================================================
sbit k1=P1^1;//定义加加
sbit k2=P3^4;//定义减减
sbit k3=P3^5;//定义设置
sbit k4=P1^2;//定义设置
sbit k5=P1^3;//定义清零
sbit CLK=P3^0;//164模拟时钟端
sbit DAT=P3^1;//164模拟数据端
uint z = 0;
void delay(uint t)//延时函数
{
uint x,y;
for(x=t;x>0;x--)
for(y=120;y>0;y--);
}
void sendbyte(uint b)//传送显示字节函数
{
uchar num,c;
COM0 = COM1 =COM2 = COM3 = 1; //熄灭数码管
COM0 = 0;
num=LED_table[b%10];//个位
for(c=0;c<8;c++)//依次传送8位
{
CLK=0;
DAT=num&0x01;
CLK=1;
num>>=1;
}
COM0 = 1;
COM1 = 0;
num=LED_table[b%100/10];//十位
for(c=0;c<8;c++)//依次传送8位
{
CLK=0;
DAT=num&0x01;
CLK=1;
num>>=1;
}
COM1 = 1;
COM2 = 0;
num=LED_table[b%1000/100] | 0x20;//百位,加上小数点
for(c=0;c<8;c++)//依次传送8位
{
CLK=0;
DAT=num&0x01;
CLK=1;
num>>=1;
}
COM2 = 1;
COM3 = 0;
num=LED_table[b/1000];//千位
for(c=0;c<8;c++)//依次传送8位
{
CLK=0;
DAT=num&0x01;
CLK=1;
num>>=1;
}
COM3 = 1;
}
void key()
{
if(k1==0)
{
delay(3);
if(k1==0)
{
//TR0=0;
z++;
if(z==10000)
z=0;
//sendbyte(z);
}
while(!k1);//放开按钮
}
if(k2==0)
{
delay(3);
if(k2==0)
{
//TR0=1;
z--;
if(z<0)
z=0;
//sendbyte(z);
}
while(!k2);//放开按钮
}
if(k5==0)
{
delay(3);
if(k5==0)
{
//TR0=1;
z=0;
//sendbyte(z);
}
while(!k5);//放开按钮
}
sendbyte(z);
delay(10);
}
void main()
{
TMOD=0X01;//定时器0定时方式1
TH0=0XD8;//晶振12MHZ,定时10ms
TL0=0XF0;
EA=1;
ET0=1;
TR0=1;
COM0 = COM1 =COM2 = COM3 = 0; //点亮数码管
sendbyte(0);
while(1)
key();
}
void time()interrupt 1//定时器中断
{
uint count;
TH0=0XD8;
TL0=0XF0;
count++;
if(count==100)//10毫秒X100=1秒
{
count=0;
#if 1 //计时功能,不用
z++;
if(z==10000)
{
z=0;
}
sendbyte(z);//刷新显示
#endif
}
}
[此贴子已经被作者于2017-4-26 10:45编辑过]



