
* 标题: 四位数码管计数演示(C51)
* 作者: wentao http://blog.liuwentao.net
http://wentao.programfan.com
* 日期: 2007.3.2
* 软件: Keil C51 V8.02
* 芯片: ATX51
* 说明: 实验板实测通过,数码管为8位共阳
* 声明: 自用存档!另仅供需要的朋友参考,请勿用做不道德转载及商业用途!
**************************************************************************/
#include #define uchar unsigned char void delay_ms(uchar ms); // 延时毫秒@12M,ms最大值255 void display(); // 显示子程序 uchar code dis_code[10] = {0xc0,0xf9,0xa4,0xb0,0x99, //段码表 // 0 1 2 3 4 对应内容 0x92,0x82,0xf8,0x80,0x90}; // 5 6 7 8 9 uchar data dis_0 = 0; // 个位值 uchar data dis_1 = 0; // 十位值 uchar data dis_2 = 0; // 百位值 uchar data dis_3 = 0; // 千位值 void main() { P2 = 0xff; // 关所有数码管 while(1) { display(); // 调用显示子程序 dis_0++; // 个位值加1 if(dis_0 != 10) // 个位未到10则结束此次循环 continue; dis_0 = 0; // 个位到10清零 dis_1++; // 十位值加1(个位到10的进位) if(dis_1 != 10) // 十位未到10则结束此次循环 continue; dis_1 = 0; // 十位到10清零 dis_2++; // 百位值加1(十位到10的进位) if(dis_2 != 10) // 百位未到10则结束此次循环 continue; dis_2 = 0; // 百位到10清零 dis_3++; // 千位值加1(百位到10的进位) if(dis_3 != 10) // 千位未到10则结束此次循环 continue; dis_3 = 0; // 千位到10清零 } } void display() // 显示子程序 { uchar data i = 50; // 用于延长每四位数的显示时间 while(i--) // 直到i减为0 { P0 = dis_code[dis_0]; // 取个位的段码 P2 = 0x7f; // 开个位显示(P2.7口控制个位数码管) delay_ms(1); // 延时1ms使四位数码管动态显示时能看清 P0 = dis_code[dis_1]; // 取十位的段码 P2 = 0xbf; // 开十位显示(P2.6口控制十位数码管) delay_ms(1); // 延时1ms作用同上 P0 = dis_code[dis_2]; // 取百位的段码 P2 = 0xdf; // 开百位显示(P2.5口控制十位数码管) delay_ms(1); // 延时1ms作用同上 P0 = dis_code[dis_3]; // 取千位的段码 P2 = 0xef; // 开千位显示(P2.4口控制十位数码管) delay_ms(1); // 延时1ms作用同上 } } void delay_ms(uchar ms) // 延时毫秒@12M,ms最大值255 { uchar i; while(ms--) for(i = 0; i < 124; i++); } /* 计数部分还可用如下方式实现 dis_0++; // 个位值加1 if(dis_0 == 10) // 个位未到10则结束 { dis_0 = 0; // 个位到10清零 dis_1++; // 十位值加1(个位到10的进位) if(dis_1 == 10) // 十位未到10则结束 { dis_1 = 0; // 十位到10清零 dis_2++; // 百位值加1(十位到10的进位) if(dis_2 == 10) // 百位未到10则结束 { dis_2 = 0; // 百位到10清零 dis_3++; // 千位值加1(百位到10的进位) if(dis_3 == 10) // 千位未到10则结束 dis_3 = 0; // 千位到10清零 } } } */
