动态显示的基本原理
多个数码管显示数字的时候,实际上是轮流点亮数码管(一个时刻内只有一个数码管是亮的)利用人眼的视觉暂留现象(也叫余晖效应)就可以做到看起来是所有数码管都同时亮了,这就是动态显示,也叫作动态扫描
例如:有两个数码管,要显示“12”这个数字,先让高位的位选三极管导通,然后控制段选让其显示“1”,延时一定时间后再让低位的位选三极管导通,然后控制端选让其显示“2”把这个流程以一定的速度循环运行就可以让数码管显示出“12”由于交替速度非常快,人眼识别到的就是“12”这两位数字同时亮了。
6个数码管组合正计时[从0到999999再从0开始]
- #include <reg52.h>
- unsigned char code LedChar[] =
- {
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99,
- 0x92, 0x82, 0xF8, 0x80, 0x90
- };
- unsigned char code LedIndex[] =
- {
- 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED
- };
- void main(void)
- {
- unsigned int cnt = 0;//设置循环次数为0
- unsigned int sec = 0;//经过时间,单位为s
- int i = 0;//数码管序号
- int iP0 = 0, iP1 = 0, iP2 = 0, iP3 = 0, iP4 = 0, iP5 = 0;
- TMOD = 1;//设置定时器0为模式1
-
- TH0 = 0xF7;
- TL0 = 0x00;//设置定时器0的初始值为0xF700,溢出一次0.0025s
- TR0 = 1;//启动定时器0
- P1 = LedIndex[0];
- P0 = LedChar[sec];
- while (1)
- {
- if (1 == TF0)//溢出
- {
- TH0 = 0xF7;
- TL0 = 0x00;
- TF0 = 0;//初始化定时器0
- cnt++;//循环次数+1
- if (400 == cnt)//1s
- {
- sec++;
- cnt = 0;
- if (1000000 == sec)
- sec = 0;
-
- iP0 = sec % 10;
- iP1 = sec / 10 % 10;
- iP2 = sec / 100 % 10;
- iP3 = sec / 1000 % 10;
- iP4 = sec / 10000 % 10;
- iP5 = sec / 100000 % 10;
- }
- switch (i)
- {
- case 0:
- if (sec >= 0)
- {
- P1 = LedIndex[i];
- P0 = LedChar[iP0];
- }
- i++;
- break;
- case 1:
- if (sec > 9)
- {
- P1 = LedIndex[i];
- P0 = LedChar[iP1];
- }
- i++;
- break;
- case 2:
- if (sec > 99)
- {
- P1 = LedIndex[i];
- P0 = LedChar[iP2];
- }
- i++;
- break;
- case 3:
- if (sec > 999)
- {
- P1 = LedIndex[i];
- P0 = LedChar[iP3];
- }
- i++;
- break;
- case 4:
- if (sec > 9999)
- {
- P1 = LedIndex[i];
- P0 = LedChar[iP4];
- }
- i++;
- break;
- case 5:
- if (sec > 99999)
- {
- P1 = LedIndex[i];
- P0 = LedChar[iP5];
- }
- i = 0;
- break;
- }
- }
-
- }
- }
复制代码 来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |