4049|6

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

各位大哥帮帮忙....问些小问题~ [复制链接]

这是一个七段数码管显示的程序(共阴极),有些地方不太明白,烦各位说一下

#include
#include
#include
#include
#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);                        //显示函数

/*Ö÷º¯Êý*/

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);     //送字型码
   DIGPORT=digbit;                   //??程序运行时为1,即Ue为1(高电平)
                                    //那此时不是所有的数码管都不亮的吗?

  if(digbit<0x08)                   //不太明白这段代码的作用
       digbit=digbit*2;              
   else
       digbit=0x01;
}

万分感谢!!!

最新回复

http://dpjfans.5d6d.com   上去看看吧  详情 回复 发表于 2007-5-25 21:53
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

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


程序使用定时动态扫描的方式显示,先熟悉工作原理,再集合硬件接线来读程序吧!
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
定时到了才执行这个函数,是根据主函数中的定时设定的时间的吗?那中断函数中的定时时间设定又起到什么作用呢?

void time0_int(void) interrupt 1 //中断入口地址,是什么样的概念啊?不好意思,我太菜了
{
   TH0=(time0_tmp/256);          //?这里只是设置TH0,TL0.具体定时的时间是怎么算的呢?
   TL0=(time0_tmp%256);        
   display();
}
在void display(void)函数中.digbit 的值是为1是吗?
                          每次调用这个函数时,digbit的值都会变对吗?
DIGPORT=digbit;  //??程序运行时为1,即Ue为1(高电平),那此时不是所有的数码管都不亮的?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

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

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
1.  因为七段数码管显示是共阴极,所以高电平时是亮不是不亮 ,可是我书上看到这样一段话:
    共阴极7段数码管,设共阴极电平为Ue,每字段上所加电平分别为Ua,Ub,Uc,Ud,Ue,Uf,Ug,Uh.设某字段的电平为Ui,当Ue为高电平时,Ui为任何电平该段二极管都不发光,当Ue为低电平时,若Ui为高电平,则该段发光,若Ui为低电平,则该段不发光
2.还有一个是已经设定了TH0,TL0值,定时的时间是怎么算出来的呢?
3.在void display(void)函数中.第一次执行时digbit 的值是为1是吗?每次调用这个函数   
   时,digbit的值都会变对吗?
4.断入口地址,是什么样的概念啊?不好意思,我太菜了                        

谢谢各位啦....
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
各位大佬..帮帮我吧~~~
我刚开始学这个啊~~
-_-
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

7
 
http://dpjfans.5d6d.com  
上去看看吧
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表