1、51 系列单片机_数码管控制源文件此程序使用 单片机 89SC52/ 1、 此程序实现数码管的静态显示,在数码管的最低位循环显示 09 这 10 个数#includeunsigned char code BitSet8 = 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f; /用于设置(低电平位选)数码管的位选信号,从低到高对应 8 个数码管unsigned char code NumberCode16 = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,
2、0x39, 0x5e, 0x79, 0x71,; /用于设置(共阴极)数码管的段选信号,从 0f 共 16 个数值void delay_ms(unsigned int n) /软件延时函数,延时 n 毫秒unsigned int i, j;for(i=n;i0;i-)for(j=110;j0;j-);void main()int num, i;while(1)num = 3;while(num0)/此循环用于实现 09 这 10 个数码在数码管的最低位循环显示P2 = BitSet7; /选中数码管的最低位,用于显示for(i=0; i0)/此循环用于实现 0f 这 16 个数码在数码管的所有
3、位循环显示P2 = 0; /同时选中数码管的所有位,用于显示for(i=0; iunsigned char code BitSet28 = 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe; /用于设置(低电平位选)数码管的位选信号,从低到高对应 8 个数码管unsigned char code NumberCode16 = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,; /用于设置(共阴极)数码管的段选信
4、号,从 0f 共 16 个数值void delay_ms(unsigned int n) /软件延时函数,延时 n 毫秒unsigned int i, j;for(i=n;i0;i-)for(j=110;j0;j-);void main()int i;while(1)for(i=0; ivoid delay_ms(unsigned int n) /软件延时函数,延时 n 毫秒unsigned int i, j;for(i=n;i0;i-)for(j=110;j0;j-);void display(int num,int rep) /控制数码管按位输出显示数值 num,显示时间为 2*rep 毫
5、秒 char BitSet8 = 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe; /用于设置(低电平位选)数码管的位选信号,从低到高对应 8 个数码管char NumberCode16 = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,; /用于设置(共阴极)数码管的段选信号,从 0f 共 16 个数值int n, r = rep, i;while(r- 0)n = num;i = 0;while(n=0
6、)P0 = 0xff; /关闭数码管当前位的显示,共阳极关闭显示段选信号P2 = BitSeti; /选中数码管对应的位P0 = NumberCoden%10; /向数码管的对应位中送入该位数值对应的段选信号delay_ms(2); /每一位延时显示 2msP2 = 0xff; /关闭所有位选i+; /位标记n=n/10; /取数值 n 的商if(n=0) break; /当取得的商为 0 时退出 while 循环void LeftDisplay(int num,int rep) /控制数码管按位输出显示数值 num,并且靠左显示,显示时间为 2*rep 毫秒char BitSet8 = 0x
7、7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe; /用于设置(低电平位选)数码管的位选信号,从低到高对应 8 个数码管char NumberCode16 = 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71,; /用于设置(共阴极)数码管的段选信号,从 0f 共 16 个数值int n = num, r = rep, i, j = 0;/计算数值 n 的位数if(n=0)j=1;elsewhile(n0)n=n/1
8、0; /取数值 n 的商j+;while(r- 0)n = num;i = 0;while(n=0)P0 = 0xff; /关闭数码管当前位的显示,共阳极关闭显示段选信号P2 = BitSeti+8-j; /选中数码管对应的位P0 = NumberCoden%10; /向数码管的对应位中送入该位数值对应的段选信号delay_ms(2); /每一位延时显示 2msP2 = 0xff; /关闭所有位选i+; /位标记n=n/10; /取数值 n 的商if(n=0) break; /当取得的商为 0 时退出 while 循环/*void LeftDisplay(int num) /用数码管按位输出显
9、示数值 num,并且靠左显示int n = num, i = 0, j = 0;/计算数值 n 的位数if(n=0)j=1;elsewhile(n0)n=n/10; /取数值 n 的商j+;n = num; /得到数值 n 的位数后,恢复其值进行后续操作if(n=0) /当要输出 0 时P0 = 0xff; /关闭数码管当前位的显示,共阳极关闭显示段选信号P2 = BitSet27; /选中数码管最高位P0 = NumberCode0; /向数码管的最低位送入 0 对应的段选信号delay_ms(5); /延时 2msP2 = 0xff; /关闭所有位选elsewhile(n0)P0 = 0x
10、ff; /关闭数码管当前位的显示,共阳极关闭显示段选信号P2 = BitSet2i+8-j; /选中数码管对应的位P0 = NumberCoden%10; /向数码管的对应位中送入该位数值对应的段选信号delay_ms(5); /延时 2msP2 = 0xff; /关闭所有位选i+; /位标记n=n/10; /取数值 n 的商*/void main()int num=0;while(1)if(num12) display(num, 400); /用数码管输出显示 num 0.8 秒else LeftDisplay(num, 400); /用数码管靠左输出显示 num0.8 秒num+;if(num=101) num=0;