求高手帮忙写一汇编程序

要求很简单:采用汇编语言设计一个运行于计算机的时钟模拟显示软件,在出现的提示信息中输入大写字母“D”,可显示系统当前日期;输入大写字母“T”,可显示系统当前时间。按Q退出程序。
只是有一点要求就是要显示出模拟时钟,日期可以是数字的,但时钟必须是模拟的(就是要有时针,分针和秒针)。先给五分,写好可生成exe文件的给2000分,说到做到。写好后可发至邮箱645900504@qq.com

用Atmel89C51和Maxim7219实现一个8位LED显示时钟。编译通过了,DIGIT是显示缓存器,用来接收BUF,SBF,MBF,HBF表示的秒,分,时数据,计时器采用中断实现。
程序如下:

ORG 0000H
AJMP MAIN
ORG 000BH
AJMP CLOCK
ORG 001BH

MAIN: MOV TMOD,#01H ;定时器方式1
MOV TL0,#0B0H ;定时器低位初值
MOV TH0,#3CH ;定时器高位初值
MOV IE,#82H ;允许中断
MOV BUF,#00H ;BUF是0.1秒计时单元,清0
MOV SBF,#00H
MOV MBF,#00H
MOV HBF,#00H ;初始化
MOV LED3,#01H ;显示横线
MOV LED8,#00H ;最后一个LED灭
SETB TR0 ;启动计时器T0
LOOP: MOV R0,#DIGIT6 ;向显示缓冲区放数
MOV A,SBF ;从秒计数缓冲区取数
ACALL PTDS ;向显示缓冲区放秒数
ACALL PTDS
MOV A,MBF ;从分计数缓冲区取数
ACALL PTDS ;向显示缓冲区放分数
ACALL PTDS
MOV R0,#DIGIT1 ;空一格显示横线
MOV A,HBF ;从时计数缓冲区取数
ACALL PTDS ;向显示缓冲区放时数
ACALL PTDS
ACALL DISPLAY ;显示子程序
AJMP LOOP

;向显示缓冲区放数字子程序PTDS,入口参数A:
PTDS: MOV R1,A ;暂存
ACALL PTDS1 ;低4位放入缓冲区
MOV A,R1 ;取出原来的数
SWAP A ;高4位和低4位交换
RET

PTDS1: ANL A,#0FH ;取低4位
MOV @R0,A ;放入显示缓冲区
DEC R0 ;显示缓冲区地址指针减1
RET
;显示子程序DISPLAY
DISPLAY: CLR SPICLK
MOV R0, #0
MOV R1, #DISPLAY_TEST
ACALL TRT
MOV R0, #02H
MOV R1, #INTENSITY
ACALL TRT
MOV R0, #07H
MOV R1, #SCAN_LIMIT
ACALL TRT
MOV R0, #0FFH
MOV R1, #DECODE_MODE
ACALL TRT
MOV R0, #01H
MOV R1, #SHUTDOWN
ACALL TRT
LED_COM:
MOV R0, #LED1
MOV R1, #DIGIT0
MOV R5, #08H
LEDCOM:
PUSH 00H
MOV A,@R0
MOV R0, A
ACALL TRT
POP 00H
INC R0
INC R1
DJNZ R5, LEDCOM
RET
TRT:
CLR SPILOAD
MOV R2, #08H
MOV A, R1

T_1: CLR SPICLK
RLC A
MOV DISIN, C
ACALL T88
SETB SPICLK
ACALL T88
DJNZ R2, T_1
ACALL T88
MOV R2, #08H
MOV A, R0

T_2: CLR SPICLK
T2T: ACALL T88
RLC A
MOV DISIN, C
ACALL T88
SETB SPICLK
DJNZ R2, T_2
SETB SPILOAD
ACALL T88
RET
T88:
MOV INT_R1, #02H
TSM0: MOV INT_R0, #01H
TSM1: DJNZ INT_R0, TSM1
DJNZ INT_R1, TSM0
RET
DISCHANGE:
MOV R0, #LED1
MOV R1, #08H
AGAIN: MOV DPTR, #TAB
MOV A,@R0
MOVC A,@A+DPTR
MOV @R0, A
INC R0
DJNZ R1, AGAIN
RET

TAB: DB 7EH,30H,6DH,79H,33H,5BH,5FH,70H,7FH,7BH
;0 ;1 ;2 ;3 ;4 ;5 ;6 ;7 ;8 ;9
DB 77H,1FH,4EH,3DH,4FH,47H,37H,0EH,67H,73H
;A ;B ;C ;D ;E ;F ;H ;L ;P ;Q
DB 3EH, 01H, 76H, 00H
;U ;- ;N ;灭
;中断服务子程序
CLOCK: MOV TH0,#3CH ;重装定时器高位初始值
MOV TL0,#0B7H ;重装定时器低位初始值
PUSH PSW ;保护状态字
PUSH ACC ;保护累加器
SETB RS0 ;转至工作寄存器1区
INC BUF ;0.1秒单元BUF加1
MOV A,BUF ;0.1秒单元内容送A
CJNE A,#0AH,DONE ;不等于10返回
MOV BUF,#00H ;等于10则0.1秒单元清0
MOV A,SBF ;取秒值
INC A ;秒单元内容加1
DA A ;十进制调整
MOV SBF,A ;送回秒单元
CJNE A,#60H,DONE ;不等于60返回
MOV SBF,#00H ;等于60,进位,秒单元清0
MOV A,MBF ;取分值
INC A ;分单元内容加1
DA A ;十进制调整
MOV MBF,A ;送回分单元
CJNE A,#60H,DONE ;不等于60返回
MOV MBF,#00H ;等于60,进位,分单元清0
MOV A,HBF ;取出小时值
INC A ;小时单元内容加1
DA A ;十进制调整
MOV HBF,A ;送回小时单元
CJNE A,#24H,DONE ;不等于24返回
MOV HBF,#00H ;等于24则小时单元清0
DONE: POP ACC
POP PSW
RETI

;**********显示寄存器定义******************
SPICLK EQU P1.4
SPILOAD EQU P1.5
DISIN EQU P1.6
LED1 EQU 50H
LED2 EQU 51H
LED3 EQU 52H
LED4 EQU 53H
LED5 EQU 54H
LED6 EQU 55H
LED7 EQU 56H
LED8 EQU 57H
INT_R1 EQU 58H
INT_R0 EQU 59H
BUF EQU 61H
SBF EQU 62H
MBF EQU 63H
HBF EQU 64H
DIGIT0 EQU 81H
DIGIT1 EQU 82H
DIGIT2 EQU 83H
DIGIT3 EQU 84H
DIGIT4 EQU 85H
DIGIT5 EQU 86H
DIGIT6 EQU 87H
DIGIT7 EQU 88H
DECODE_MODE EQU 89H
INTENSITY EQU 8AH
SCAN_LIMIT EQU 8BH
SHUTDOWN EQU 8CH
FLASH_CON EQU 8DH
SLEEP_STATE EQU 8EH
DISPLAY_TEST EQU 8FH

END
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-01-09
留下气味。
相似回答
大家正在搜