由于还没有学习定时器计数器的内容,又想实现数码管动态变化的程序算法。
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--;
}
}