PUSH ACC ;ACC入栈

PUSH PSW ;PSW入栈

MOV A,DISPBUFF ;取第一个待显示数

MOV DPTR,#DISPTAB ;字形表首地址

MOVC A,@A+DPTR ;取字形码

MOV P0,A ;将字形码送P0位(段口)

CLR FIRST ;开第一位显示器位口

LCALL DELAY ;延时1毫秒

SETB FIRST ;关闭第一位显示器(开始准备第二位的数据)

MOV A,DISPBUFF+1 ;取显示缓冲区的第二位

MOV DPTR,#DISPTAB

MOVC A,@A+DPTR

MOV P0,A ;将第二个字形码送P0口

CLR SECOND ;开第二位显示器

LCALL DELAY ;延时

SETB SECOND ;关第二位显示

POP PSW

POP ACC

RET

DELAY: ;延时1毫秒

PUSH PSW

SETB RS0

MOV R7,#50

D1: MOV R6,#10

D2: DJNZ R6,$

DJNZ R7,D1

POP PSW

RET

DISPTAB:DB 28H,7EH,0a4H,64H,72H,61H,21H,7CH,20H,60H

END

从上面的单片机例程中能看出,动态扫描显示必须由CPU持续地调用显示程序,才能保证持续持续的显示。

上面的这个程序能实现数字的显示,但不太实用,为什么呢?这里仅是显示两个数字,并没有做其他的工作,因此,两个数码管轮流显示1毫秒,没有问题,实际的工作中,当然不可能只显示两个数字,还是要做其他的事情的,这样在二次调用显示程序之间的时间间隔就不一不定了,如果时间间隔比较长,就会使显示不连续。而实际工作中是很难保证所有工作都能在很短时间内完成的。况且这个显示程序也有点“浪费”,每个数码管显示都要占用1个毫秒的时间,这在很多合是不允许的,怎么办呢?我们能借助于 定时器 ,定时时间一到,产生中断,点亮一个数码管,然后马上返回,这个数码管就会一直亮到下一次定时时间到,而不用调用延时程序了,这段时间能留给主程序干其他的事。到下一次定时时间到则显示下一个数码管,这样就很少浪费了。

Counter EQU 59H ; 计数器 ,显示程序通过它得知现正显示哪个数码管

FIRST EQU P2.7 ;第一位数码管的位控制

SECOND EQU P2.6 ;第二位数码管的位控制

DISPBUFF EQU 5AH ;显示缓冲区为5AH和5BH

ORG 0000H

AJMP START

ORG 000BH ;定时器T0的入口

AJMP DISP ;显示程序

ORG 30H

START:

MOV SP,#5FH ;设置堆栈

MOV P1,#0FFH

MOV P0,#0FFH

MOV P2,#0FFH ;初始化,所显示器,LED灭

MOV TMOD,#00000001B ;定时器T0工作于模式1(16位定时/计数模式)

MOV TH0,#HIGH(65536- 2000 )

MOV TL0,#LOW(65536-2000)

SETB TR0

SETB EA

SETB ET0

MOV Counter,#0 ;计数器初始化

MOV DISPBUFF,#0 ;第一位始终显示0

MOV A,#0

LOOP:

MOV DISPBUFF+1,A ;第二位轮流显示0-9

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查