guoyulong 发表于 2010-6-6 10:25:19

动态数码管的问题

马老师书的183页的程序数码管只显示后两位。
/*********************************************
File name                        : demo_6_5.c
Chip type         : ATmega16
Program type      : Application
Clock frequency   : 4.000000 MHz
Memory model      : Small
External SRAM size: 0
Data Stack size   : 256
*********************************************/

#include <mega16.h>
#include <delay.h>

flash unsigned char led_7={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
flash unsigned char position={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char time;                                        // 时、分、秒计数
unsigned char dis_buff;                                // 显示缓冲区,存放要显示的6个字符的段码值
unsigned char time_counter;                                // 1秒计数器
bit point_on;                                        // 秒显示标志

void display(void)                                // 扫描显示函数,执行时间12ms
{
        unsigned char i;   
        for(i=0;i<=5;i++)
        {
                PORTA = led_7];
                if (point_on && ( i==2 || i==4 )) PORTA |= 0x80;        // (1)
                PORTC = position;
               delay_ms(2);                                                                        // (2)
       //        PORTC = 0xff;                                                                        // (3)
        }
}

void time_to_disbuffer(void)                        // 时间值送显示缓冲区函数
{
        unsigned char i,j=0;
        for (i=0;i<=2;i++)
        {
                dis_buff = time % 10;
                dis_buff = time / 10;
        }
}

void main(void)
{
    PORTA=0x00;                // PORTA初始化
    DDRA=0xFF;
    PORTC=0x3F;                // PORTC初始化
    DDRC=0x3F;

    time = 23; time = 58; time = 55;        // 时间初值23:58:55
    time_to_disbuffer();

    while (1)
    {
          display();                                                // 显示扫描,执行时间12ms
          if (++time_counter >= 40)
          {
                  time_counter = 0;                                // (4)
                  point_on = ~point_on;                        // (5)
                  if (++time >= 60)
                  {
                          time = 0;
                          if (++time >= 60)
                          {
                                  time = 0;
                                  if (++time >= 24) time = 0;
                          }
                  }
                  time_to_disbuffer();
          }
      delay_ms(13);                                        // 延时13ms,可进行其它处理(6)
    };
}
数码管怎么就显示后两位呀,也没找出错误,大家帮帮忙。
还有就是要是把PC口也全输出0,怎么不行呢。
顺便介绍一下缓冲程序,理解不了,谢谢。

machao 发表于 2010-6-23 21:47:36

熔丝位配置不对。书需要认真的学习,不是抄一段代码就能解决问题的。

keiwin 发表于 2010-9-24 21:50:26

请教个关于这段代码的问题,也就是书中185页思考与实践中的第八个问题,为什么要显示缓冲区啊??想不明白。
页: [1]
查看完整版本: 动态数码管的问题