首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

帮帮忙.问些小疑点

2012-03-28 
各位大哥帮帮忙....问些小问题~这是一个七段数码管显示的程序(共阴极),有些地方不太明白,烦各位说一下#inc

各位大哥帮帮忙....问些小问题~
这是一个七段数码管显示的程序(共阴极),有些地方不太明白,烦各位说一下

#include   <reg51.h>
#include   <stdio.h>
#include   <math.h>
#include   <absacc.h>
#define   DIGPORT       XBYTE[0x0200]                         /*定义字位口*/
#define   WORDPORT     XBYTE[0x0100]                         /*定义字型口*/
#define   fosc   11.0592                                               /*晶振频率*/
#define   time0   2000                                                   /*定时2000us*/
#define   uchar   unsigned   char  

uchar   digbit;                                                             //字位
uchar   wordbuf[4];                                                     //字型码缓冲区

uchar   idata   time0_tmp;                                           //临时变量,用于计算定时

uchar   getcode(uchar   i);                                         //根据共阴极字型码表获取字型码
void   display(void);                                                 //显示函数

/*&Ouml;÷&ordm;&macr;&Ecirc;&yacute;*/

void   main()
{
      DIGPORT=0;                                                     //关闭显示(不是为高电平才不亮的吗?)

      TMOD=0x01;                                                     //T0工作方式1

      /*2ms定时设置*/
      time0_tmp=65535-time0*fosc/12;
      TH0=(time0_tmp/256);                                        
      TL0=(time0_tmp%256);

      TR0=1;                                                                     //定时器0为运行状态
      ET0=1;       //??(这里设为允许中断后就去执行中断函数吗?)   定时器0中断允许
      EA=1;                                                                       //所有中断允许



      digbit=0x01;       //从第一位数码管开始.??不太明白.第一位具体是哪位a段?

      wordbuf[3]=4;                
      wordbuf[2]=3;
      wordbuf[1]=2;
      wordbuf[0]=1;

      while(1);
}

/*定时器0中断服务子程序,定时动态扫描*/

void   time0_int(void)   interrupt   1     //?这个关键字跟后面的值的作用是什么啊?
{
      TH0=(time0_tmp/256);//?这里只是设置TH0,TL0.具体定时的时间是怎么算的呢?
      TL0=(time0_tmp%256);
      display();
}

/*根据表获取字型码*/

uchar   getcode(uchar   i)
{
      uchar   p;
      switch(i)
      {
            case   0:       p=0x3f;   break;
    case   1:       p=0x06;   break;
    case   2:       p=0x5B;   break;
    case   3:       p=0x4F;   break;
    case   4:       p=0x66;   break;
    case   5:       p=0x6D;   break;
    case   6:       p=0x7D;   break;
    case   7:       p=0x07;   break;
    case   8:       p=0x7F;   break;
    case   9:       p=0x67;   break;
    case   10:     p=0x77;   break;
            case   11:     p=0x7C;   break;
      case   12:     p=0x39;   break;
    case   13:     p=0x5E;   break;
    case   14:     p=0x79;   break;
      case   15:     p=0x71;   break;
      default:                     break;
      }
      return   (p);
}

/*显示函数*/

void   display(void)
{
      uchar   i;
      switch(digbit)                                         //这个值是为1吗?    
      {
            case   1:     i=0;         break;
    case   2:     i=1;         break;
      case   4:     i=2;         break;
    case   8:     i=3;         break;  
    default   :                 break;  
      }
      DIGPORT=0;                                                 //关闭显示
      WORDPORT=getcode(wordbuf[i]);           //送字型码
      DIGPORT=digbit;                                       //??程序运行时为1,即Ue为1(高电平)


                                                                        //那此时不是所有的数码管都不亮的吗?
 
    if(digbit <0x08)                                       //不太明白这段代码的作用  
              digbit=digbit*2;                            
      else
              digbit=0x01;
}

万分感谢!!!

[解决办法]
ET0=1; //??(这里设为允许中断后就去执行中断函数吗?) 定时器0中断允许
这里只是打开定时器0中断,需要定时到了才去执行中断函数!
void time0_int(void) interrupt 1 //?这个关键字跟后面的值的作用是什么啊?
interrupt n n表示中断矢量,即表示该段程序放在中断入口地址处,入口地址=8×n+3


程序使用定时动态扫描的方式显示,先熟悉工作原理,再集合硬件接线来读程序吧!
[解决办法]
1.DIGPORT=digbit; //??程序运行时为1,即Ue为1(高电平),那此时不是所有的数码管都不亮的?
答:因为七段数码管显示是共阴极,所以高电平时是亮不是不亮.
2.定时到了才执行这个函数,是根据主函数中的定时设定的时间的吗?那中断函数中的定时时间设定又起到什么作用呢?
答:是根据主函数设定的时间,时间一到就中断响应;由于定时器工作在方式1不是方式2(自动生装载),所以中断函数里要重新设定时初值,这样每次中断完了还能重新定时.
3.if(digbit <0x08) //不太明白这段代码的作用
digbit=digbit*2;
else
digbit=0x01;
因为乘2相当于左移一位,所以里相当于把LED逐次点亮,产生跑马灯的效果.

热点排行