帖子已经改过了,重新拷一下
编译通过了,
现在的结果是这样显示
十位,百位和千位隐隐约约有笔画在闪动
按K1,K2或者K5的时候这样显示
放开按键恢复个位显示
#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; //熄灭数码管 COM3 = 0; num=LED_table[b%10];//个位 for(c=0;c<8;c++)//依次传送8位 { CLK=0; DAT=num&0x01; CLK=1; num>>=1; } COM3 = 1; delay(30); COM2 = 0; num=LED_table[b%100/10];//十位 for(c=0;c<8;c++)//依次传送8位 { CLK=0; DAT=num&0x01; CLK=1; num>>=1; } COM2 = 1; delay(30); COM1 = 0; num=LED_table[b%1000/100] | 0x20;//百位,加上小数点 for(c=0;c<8;c++)//依次传送8位 { CLK=0; DAT=num&0x01; CLK=1; num>>=1; } COM1 = 1; delay(30); COM0 = 0; num=LED_table[b/1000];//千位 for(c=0;c<8;c++)//依次传送8位 { CLK=0; DAT=num&0x01; CLK=1; num>>=1; } COM0 = 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 0 //计时功能,不用 z++; if(z==10000) { z=0; } sendbyte(z);//刷新显示 #endif } }