×
单片机 > 单片机程序设计 > 详情

单片机学习之九:多位数码动态显示

发布时间:2020-06-19 发布时间:
|
一、 试验现象

   8个数码管显示多位数9876.5432

 

二、 试验目的
     掌握多位数码动态显示的原理和编程方法
     掌握查表指令movc的用法

 

三、 试验任务分析
     通过试验四的分析我们知道,各个数码管的段码都是p0口的输出,也就是说,各个数码管输入的段码都是一样的。那么怎样让8个数码管显示不同的数字呢?
     我们大家都知道电影的原理,它播放的实际上是一个个独立的画面,只不过由于我们视觉上的暂留作用,使得我们感觉画面是连续的。
     多位数码显示也可以采用这个原理,我们先只让最低位显示2,经过一段延时,再只让次低位显示3,如此类推。只要我们的延时时间足够短,就能够使得数码的显示看起来非常的稳定清楚。试验证明这个延时采用1~5ms即可,过程如下图所示。
               

 

 

       在本例中,由于我们需要反复的把不同的段码送到P0,把位码送到P2,因此把这两个过程编制成两个子程序,然后反复调用,这样一方面使得程序简化,另一方面使得程序的可读性增强。
      在这两个子程序中,由于我们要依次输出不同的段码和位码,如果逐次给P0或者P2赋值,一方面程序的复杂程度增加,另外一方面会使得程序的灵活性降低。设想一下,如果我们要改变显示的数字,那么程序改动起来多么麻烦。
      所以我们采用如下的办法,以P0口输出段码为例:我们可以把要显示的段码放在一个表格中,然后每次从这个表格里面取数,送到P0口即可。这样,如果要改变显示的数字,只需要改变表格里面的数就可以拉。
     下面就是按照这个思路编写的程序。

 

四、试验程序
      org 0000h
      clr p1.5
      
main:  mov r7,#0ffh
      mov r6,#0ffh
loop:  lcall play1        ;调用显示段码子程序,具体含义见注释(1)
      lcall play2            ;调用显示位码子程序
      lcall delay             ;调用1ms延时程序
      cjne a,#80h,loop   ;判断是否显示到最左边的数
      ljmp main      

 

play1: mov a,r7         ;查表求段码子程序,详细解释可参考注释
      inc a
      mov r7,a
      mov dptr,#table1   
      movc a,@a+dptr  
      mov p0,a      
      ret

 

play2: mov a,r6        ;查表求位码子程序
      inc a
      mov r6,a
      mov dptr,#table2
      movc a,@a+dptr
      mov p2,a      
      ret
 
table1:  db 52h,62h,0e1h,64h      ;存放段码
       db 04h,0eah,40h,60h  

 

table2:  db 01h,02h,04h,08h        ;存放位码

 

        
delay:  mov r4,#02h       ;延时1ms子程序
del2:   mov r3,#0ffh
del3:   djnz r3,del3
       djnz r4,del2
       ret
       end    
     
五、注释:
1、首先看看(1)语句,根据上面的分析我们知道,它的意思是调用把段码送到P0口的子程序play1。

 

2、分析play1子程序,根据上面的分析我们可以大致知道,它是通过查表的方法,来求的段码的。
      那么表格在哪里?大家看到标号为table1的语句没有?它就是存放段码的表格。它把从最低位到最高位的段码依次的放在这个表格里面。
      在这里,db也是一个伪指令,它的意思是把后面的数字或者字符(用ASCII代码)存入从标号开始的连续单元里面。也就是说标号table1对应的地址单元里面存的是52h,table+1对应的地址单元里面存的是62h。

 

     假设table1对应的地址单元是0029h,那么0029h单元里面存放的是52h,002A单元里面存放的是62h,如下图所示。那么,怎样从表格中取得我们要的数呢?步骤如下:

                           

 

 

(1) 首先给a赋值(a)=00h。
(2) 然后获得table1的地址,如0029h,存入dptr寄存器,即(dptr)=0029h
(3) 接下来把a的内容和dptr的内容相加相加,即00h+0029h=0029h,这就是表格里面第一个数的地址啦。
(4) 然后把a中的数加1,即(a)=01h
(5) 重复上面的第三步,就可以找到表格中的第二个数62h的地址啦。Play1子程序就是按照这样的方法编写的,大家参照有关的教材自己分析吧。

 

3、play2子程序是给p2口送位码的子程序,方法和play1一样,这里就不再赘述了。同理,table2表格中存放的就是每个数码管的位码了。

 

六、课后练习:
1、学习该程序中出现的理论知识
2、编写一个程序,让1个数码管计数,从0到9。一秒种变化一次

关键字:单片机  多位数码  动态显示

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
如何为单片机选择合适的负载电容