由于还没有学习定时器计数器的内容,又想实现数码管动态变化的程序算法。
51开发板电路原理图如下:
Proteus 仿真如下
开发板实际照片如下:
#include <REGX51.H> #include <intrins.h> /*位选*/ void weixvan(unsigned int position){ switch (position){ case 1:P2_4=0;P2_3=0;P2_2=0;break; case 2:P2_4=0;P2_3=0;P2_2=1;break; case 3:P2_4=0;P2_3=1;P2_2=0;break; case 4:P2_4=0;P2_3=1;P2_2=1;break; case 5:P2_4=1;P2_3=0;P2_2=0;break; case 6:P2_4=1;P2_3=0;P2_2=1;break; case 7:P2_4=1;P2_3=1;P2_2=0;break; case 8:P2_4=1;P2_3=1;P2_2=1;break; } } /*段选*/ void duanxvan(char value){ switch(value){ case '0': P0=0x3F; break; //数值0 case '1': P0=0x06; break; //数值1 case '2': P0=0x5B; break; //数值2 case '3': P0=0x4F; break; //数值3 case '4': P0=0x66; break; //数值4 case '5': P0=0x6D; break; //数值5 case '6': P0=0x7D; break; //数值6 case '7': P0=0x07; break; //数值7 case '8': P0=0x7F; break; //数值8 case '9': P0=0x6F; break; //数值9 case'a': case 'A': P0=0x77; break; //数值a 两个case兼容大小写 case'b': case 'B': P0=0x7C; break; //数值b case'c': case 'C': P0=0x39; break; //数值c case'd': case 'D': P0=0x5E; break; //数值d case'e': case 'E': P0=0x79; break; //数值e case'f': case 'F': P0=0x71; break; //数值f case '-': P0=0x40; break; //数值- case '.': P0=0x80; break; //数值. case ' ': P0=0x00; break; //无显示 } } /*延时函数, 用于暂停扫描*/ void Delay(unsigned int ms) { while(ms--){ unsigned char i, j; _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } } /*把位选和段选封装在一个函数中,并且完成消影*/ void Display(char *d){ int i; for(i=0;i<8;i++){ weixvan(1+i);duanxvan(*d++);Delay(1);P0=0x00; } } void main (){ char display[8]="99999999"; char *p=&display[7]; int i,j; while(1){ for(i=0;i<10;i++){ for(j=0;j<80;j++){ Display(display); } *p=*p-1; if(*p=='0') break; } p--; } }