打印
[AVR单片机]

初学AVR,请教大湿一个数码管动态显示器设计的问题

[复制链接]
1050|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kumechacha|  楼主 | 2013-10-31 20:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题1:time_counter为什么要自加到40,在晶振为4MHZ时自加一次时间怎样算啊?
问题2:在void display(void)函数里最后为什么要PORTC =0xff关闭所有数码管,直接更新数据不行吗,我删除后的确不行,是什么原因
#include <mega16.h>
#include <delay.h>
char time[3];
char dis_buff[6];
flash char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7F,0x6F};
bit point_on;
flash char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
char time_counter;

void time_to_disbuffer(void)
{
  char i,j=0;
  for(i=0;i<2;i++)   
  {
    dis_buff[j++] = time % 10;
    dis_buff[j++] = time / 10;
  }
}

void display(void)
{
  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 main()
{
  PORTA=0x00;     //初始化POTA
  DDRA=0xFF;      
  PORTC=0x3F;     //0011 1111
  DDRC=0x3F;       //0011 1111,PORT0-PORT5输入

  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);
    }
  }
}

相关帖子

沙发
qin552011373| | 2013-11-1 13:42 | 只看该作者
你先算算定时器的频率是多少吧

使用特权

评论回复
板凳
yuer28| | 2013-11-14 11:39 | 只看该作者
程序很难看,提个关于点LED的建议:
1. 采用timer中断,定时(如60HZ)去刷新LED;
2. 点亮时间采用一个延时的变量,可以作为亮度调节;
——简单地说就是刷新频率不变,占空比可变。如果思采用静态扫描方式的同学跳过

使用特权

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

本版积分规则

2

主题

2

帖子

0

粉丝