本帖最后由 suoma 于 2009-12-31 21:51 编辑
多位LED数码管显示。这个程序我可是研究了很长时间才看懂,打死我也写不出来。可能是自己现在水平太菜,感觉这个程序很经典,有意思。
#include <mega16.h>
#include <delay.h>
flash unsigned char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7E,0x6F};
flash unsigned char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char time[3];
unsigned char dis_buff[6];
unsigned char time_counter;
bit point_on;
void display(void)
{
unsigned char i;
for(i=0;i<=5;i++)
{PORTA=led_7[dis_buff];
if (point_on&&(i==2||i==4)) PORTA |=0x80;
PORTC=position;
delay_ms(2);
PORTC=0xff;
}
}
void time_to_disbuffer(void)
{ unsigned char i,j=0;
for (i=0;i<=2;i++)
{dis_buff[j++]=time%10;
dis_buff[j++]=time/10;
}
}
void main(void)
{ PORTA=0x00;
DDRA=0xFF;
PORTC=0x3F;
DDRC=0x3F;
time[2]=23;time[1]=58;time[0]=55;
time_to_disbuffer();
while(1)
{ display();
if(++time_counter>= 40)
{ time_counter=0;
point_on=~point_on;
if(++time[0]>=60)
{time[0]=0;
if(++time[1]>=60)
{ time[1]=0;
if(++time[2]>=24)time[2]=0;
}
}
time_to_disbuffer();
}
delay_ms(13);
};
} 还是把自己遇到的问题,怎样解决的,拿出来分享一下。
1.if(point_on&&(i==2||i==4)) PORTA|=0x80;这句的意思是让第二个点与第四个点在point_on 的控制下闪烁,看一下家里墙上的万年历你就明白了。
2.程序中point_on,time_counter都没有赋初值,这是因为全局变量默认初值为0.
time_to_disbuffer每秒执行1次。
3.数码管显示的亮度怎么调整呢?让delay控制的时间长一些,因为这样亮的时间长,平均能量就高,动态扫描中,人眼看不到数码管的闪烁,只能看到平均亮度。
4.我发现他竟然用字符型的数组元素存放整数,其实这是可以的,因为基本的数据类型只是定义了一个数据占多大字节,不管什么数据在计算机中都是二进制,字符型可以存放数,只是它占用一个字节,表示的数值范围小,为—128~127,如果加上unsigned为0~255.
5.此程序使用软件延时的缺点是什么呢?一是delay这个函数本身就不精确,二是如果在delay中有中断出现的话,它的延时就变长。三是太占资源,在延时的漫长时间里我们什么也没做。
|