搜索
bottom↓
回复: 9

马老师书中的数码管显示器动态显示设计(一)中有些搞不懂

[复制链接]

出0入0汤圆

发表于 2013-10-31 19:55:21 | 显示全部楼层 |阅读模式
#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[i] % 10;
    dis_buff[j++] = time[i] / 10;
  }
}

void display(void)
{
  char i;
  for(i=0;i<=5;i++)
  {
    PORTA = led_7[dis_buff[i]];
    if (point_on && (i==2||i==4)) PORTA |= 0x80;
    PORTC = position[i];
    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);
    }
  }
}
问题1:time_counter为什么要自加到40,在晶振为4MHZ时自加一次时间怎样算啊?
问题2:在void display(void)函数里最后为什么要PORTC =0xff关闭所有数码管,直接更不吗,我删除后的确不行,是什么原因

出0入0汤圆

发表于 2013-10-31 20:11:33 | 显示全部楼层
1、只是粗略的计算,这里是作为冒号闪烁用的,要精确的可用定时器
2、消隐用,没有这句会有重影

出0入0汤圆

 楼主| 发表于 2013-10-31 20:15:56 | 显示全部楼层
little_Monkey 发表于 2013-10-31 20:11
1、只是粗略的计算,这里是作为冒号闪烁用的,要精确的可用定时器
2、消隐用,没有这句会有重影 ...

明白了,谢大湿

出0入0汤圆

发表于 2013-11-12 10:05:53 | 显示全部楼层
kumechacha 发表于 2013-10-31 20:15
明白了,谢大湿

楼主   在void display(void)函数里 if (point_on && (i==2||i==4)) PORTA |= 0x80这一句中 怎么理解,是增加显示数码管里的那个点吗,省去可以吗;   
         变量point_on,time_counter只定义了数据类型,没有定义初值,后面的程序中出现++time_counter,point_on=~point_on,这个怎么理解,难道初值默认为0了吗

出0入0汤圆

 楼主| 发表于 2013-11-12 19:15:23 | 显示全部楼层
624026387 发表于 2013-11-12 10:05
楼主   在void display(void)函数里 if (point_on && (i==2||i==4)) PORTA |= 0x80这一句中 怎么理解,是 ...

if (point_on && (i==2||i==4)) PORTA |= 0x80这句使第三个和第五个数码管的小数点闪烁,区分时分秒的,point_on数据类型是bit只有0和1,是小数点闪烁控制,time_counter是大约1S的计时,软件延时时间是大约的

出0入0汤圆

发表于 2013-11-19 23:36:21 | 显示全部楼层
kumechacha 发表于 2013-11-12 19:15
if (point_on && (i==2||i==4)) PORTA |= 0x80这句使第三个和第五个数码管的小数点闪烁,区分时分秒的, ...

明白就好。
另外,通常情况下,定义变量没有赋初值的化,变量自动会自动初始化为0的(编译器会自动加上相应的初始代码,包含数据区清零)。

出0入0汤圆

发表于 2013-11-19 23:48:31 | 显示全部楼层
624026387 发表于 2013-11-12 10:05
楼主   在void display(void)函数里 if (point_on && (i==2||i==4)) PORTA |= 0x80这一句中 怎么理解,是 ...

对全局变量或者静态变量而言,不赋初值的话,默认为0。对局部非静态变量而言,不赋初值的话,初值为随机的。建议变量定义时就赋初值,避免后面忘记赋初值,从而导致无法预料的错误。

出0入0汤圆

发表于 2013-11-20 00:04:36 | 显示全部楼层
Gallen.Zhang 发表于 2013-11-19 23:48
对全局变量或者静态变量而言,不赋初值的话,默认为0。对局部非静态变量而言,不赋初值的话,初值为随机 ...

补充的好

出0入0汤圆

发表于 2013-11-29 18:34:02 | 显示全部楼层
kumechacha 发表于 2013-11-12 19:15
if (point_on && (i==2||i==4)) PORTA |= 0x80这句使第三个和第五个数码管的小数点闪烁,区分时分秒的, ...

time_counter  这个 时间大约是怎么计算的  4M的晶振 0.25微妙的话  大约也不够1秒呀  ?

出0入0汤圆

发表于 2014-1-1 18:46:19 | 显示全部楼层
扫一个数码管用2ms,6个一共用12ms,再延时13ms,一共25ms,循环40次,正好1s,当然这个1s不是精确的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 06:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表