单片机新手,入门前的感悟第七篇。··转

[复制链接]
1546|4
手机看帖
扫描二维码
随时随地手机跟帖
suoma|  楼主 | 2009-12-28 23:11 | 显示全部楼层 |阅读模式
本帖最后由 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中有中断出现的话,它的延时就变长。三是太占资源,在延时的漫长时间里我们什么也没做。
Karlshen| | 2009-12-29 21:19 | 显示全部楼层
怎么还有斜体?

使用特权

评论回复
huamunv| | 2009-12-29 23:18 | 显示全部楼层
楼主修改下更好看些

使用特权

评论回复
linhai2009| | 2009-12-30 00:04 | 显示全部楼层
是啊,都是斜体的,看起来老变扭了

使用特权

评论回复
suoma|  楼主 | 2009-12-31 21:49 | 显示全部楼层
马上就改,不好意思啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

714

帖子

5

粉丝