文档库

最新最全的文档下载
当前位置:文档库 > 数码管显示程序

数码管显示程序

;将P1口的P1.0~P1.5与数码管的输入LED6~LED1相连

;74LS273的O0~O7与LEDA~LEDDp相连,

;片选信号CS273与CS0相连。去掉短路子连接。

NAME T9 ;数码显示实验

PORT EQU 0CFA0H

BUF EQU 23H ;存放计数值

SBF EQU 22H ;存放秒值

MBF EQU 21H ;存放分值

CSEG AT 0000H

LJMP START

CSEG AT 001BH

LJMP CLOCK

CSEG AT 0100H

START: MOV R0,#40H ;40H-45H是显示缓冲区,依次存放MOV A,#00H ;分高位、分低位,0A,0A(横线)

MOV @R0,A ;以及秒高位、秒底位

INC R0

MOV @R0,A

INC R0

MOV A,#0AH

MOV @R0,A

INC R0

MOV @R0,A

INC R0

MOV A,#00H

MOV @R0,A

INC R0

MOV @R0,A

MOV TMOD,#10H ;定时器1初始化为方式1

MOV TH1,#38H ;置时间常数,延时0.1秒

MOV TL1,#00H

MOV BUF,#00H ;置0

MOV SBF,#00H

MOV MBF,#00H

SETB ET1

SETB EA

SETB TR1

DS1: MOV R0,#40H ;置显示缓冲区首址

MOV R2,#01H ;置扫描初值,点亮最左边的LED6

DS2: MOV DPTR,#PORT

MOV A,@R0 ;得到的段显码输出到段数据口

ACALL TABLE

MOVX @DPTR,A

MOV A,R2 ;向位数据口P1输出位显码

CPL A

MOV P1,A

MOV R3,#0FFH ;延时一小段时间

DEL: NOP

DJNZ R3,DEL

INC R0 ;显示缓冲字节加一

CLR C

MOV A,R2

RLC A ;显码右移一位

MOV R2,A ;最末一位是否显示完毕?,如无则

JNZ DS2 ;继续往下显示

MOV R0,#45H

MOV A,SBF ;把秒值分别放于44H,45H中

ACALL GET

DEC R0 ;跳过负责显示"-"的两个字节

DEC R0

MOV A,MBF ;把分值分别放入40H,41H中

ACALL GET

SJMP DS1 ;转DS1从头显示起

TABLE: INC A ;取与数字对应的段码

MOVC A,@A+PC

RET

DB 3FH,06H,5BH,4FH,66H,6DH,7DH, 07H, 7FH,6FH, 40H

GET: MOV R1,A ;把从分或秒字节中取来的值的高ANL A,#0FH ;位屏蔽掉,并送入缓冲区

MOV @R0,A

DEC R0

MOV A,R1 ;把从分或秒字节中取来的值的低

SW AP A ;位屏蔽掉,并送入缓冲区

ANL A,#0FH

MOV @R0,A

DEC R0 ;R0指针下移一位

RET

CLOCK: MOV TL1,#0AFH ;置时间常数

MOV TH1,#3CH

PUSH PSW

PUSH ACC

INC BUF ;计数加一

MOV A,BUF ;计到10否?没有则转到QUIT退出中断

CJNE A,#0AH,QUIT

MOV BUF,#00H ;置初值

MOV A,SBF

INC A ;秒值加一,经十进制调整后放入

DA A ;秒字节

MOV SBF,A

CJNE A,#60H,QUIT ;计到60否?没有则转到QUIT退出中断

MOV SBF,#00H ;是,秒字节清零

MOV A,MBF

INC A ;分值加一,经十进制调整后放入

DA A ;分字节

MOV MBF,A

CJNE A,#60H,QUIT ;分值为60否?不是则退出中断

MOV MBF,#00H ;是,清零

QUIT: POP ACC

POP PSW

RETI ;中断返回

END