/********************************************************************************** * 标题: 试验数码管上显示数字( 单片机直接实现位选 共阴极) * * * * 连接方法:P0与J12 用8PIN排线连接 P1与JP16 用排线连接 * *********************************************************************************** * * * 请学员认真消化本例程,用573锁存器控制和单片机脚直接位选控制(非译码器控制)数码管 * ***********************************************************************************/ #include <reg51.h> void delay(unsigned int i); //函数声名 char DelayCNT;//定义变量 //此表为 LED 的字模, 共阴数码管 0-9 - unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制 //此表为8个数码管位选控制, 共阴数码管 1-8个 - unsigned char code dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; //位选控制 查表的方法控制 /************主函数**********************/ main() { unsigned int i,LedNumVal=1 ; //变量定义 unsigned int LedOut[10]; //变量定义 DelayCNT=0; while(1) { if(++DelayCNT>=20) //控制数字变化速度 { DelayCNT=0; //20个扫描周期清零一次 ++LedNumVal; //每隔20个扫描周期加一次 } LedOut[0]=Disp_Tab[LedNumVal%10000/1000]; LedOut[1]=Disp_Tab[LedNumVal%1000/100]|0x80; LedOut[2]=Disp_Tab[LedNumVal%100/10]; LedOut[3]=Disp_Tab[LedNumVal%10]; LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位 LedOut[5]=Disp_Tab[LedNumVal%1000/100]|0x80; //百位带小数点 LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位 LedOut[7]=Disp_Tab[LedNumVal%10]; //个位 for( i=0; i<8; i++) { P0 = LedOut[i]; P1 = dispbit[i]; //使用查表法进行位选 /* switch(i) //使用switch 语句控制位选 { case 0:P1 = 0x7F; break; case 1:P1 = 0xbF; break; case 2:P1 = 0xdF; break; case 3:P1 = 0xeF; break; case 4:P1 = 0xf7; break; case 5:P1 = 0xfb; break; case 6:P1 = 0xfd; break; case 7:P1 = 0xfe; break; } */ delay(150); //扫描间隔时间 太长会数码管会有闪烁感 } } } /*******************延时函数**********************************************/ void delay(unsigned int i) { char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); }