用汇编语言编写一个时钟程序,能显示时分秒的,还要有秒表就是计时器的功能,

用汇编语言编写一个时钟程序,能显示时分秒的,还要有秒表就是计时器的功能,,第1张

STACK1 SEGMENT STACK

DW 200 DUP ()

STACK1 ENDS

DATA SEGMENT

SPACE DB 1000 DUP (' ')

PATTERN DB 6 DUP (' '),0C9H,26 DUP (0CDH),0BBH,6 DUP (' ')

DB 6 DUP (' '),0BAH,26 DUP (20H),0BAH,6 DUP (' ')

DB 6 DUP (' '),0C8H,26 DUP (0CDH),0BCH,6 DUP (' ')

DBUFFER DB 8 DUP (':'),12 DUP (' ')

DBUFFER1 DB 20 DUP (' ')

STR1 DB 0DH,0AH, 'PLEASE INPUT DATE(D) OR TIME(T) OR QUIT(Q): $'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK1

START: MOV AX,0001H ;设置显示方式为4025彩色文本方式

INT 10H

MOV AX,DATA

MOV DS,AX

MOV ES,AX

MOV BP,OFFSET SPACE

MOV DX,0B00H

MOV CX,1000

MOV BX,0040H

MOV AX,1300H

INT 10H

MOV BP,OFFSET PATTERN ;显示矩形条

MOV DX,0B00H

MOV CX,120

MOV BX,004EH

MOV AX,1301H

INT 10H

LEA DX,STR1 ;显示提示信息

MOV AH,9

INT 21H

MOV AH,1 ;从键盘输入单个字符

INT 21H

CMP AL,44H ;AL='D'?

JNE A

CALL DATE ;显示系统日期

A: CMP AL,54H ;AL='T'?

JNE B

CALL TIME ;显示系统时间

B: CMP AL,51H ;AL='Q'?

JNE START

MOV AH,4CH ;返回dos状态

INT 21H

DATE PROC NEAR ;显示日期子程序

dis:MOV AH,2AH ;取日期

INT 21H

MOV SI,0

MOV AX,CX

MOV BX,100

DIV BL

MOV BL,AH

CALL BCDASC1 ;日期数值转换成相应的ASCII码字符

MOV AL,BL

CALL BCDASC1

INC SI

MOV AL,DH

CALL BCDASC1

INC SI

MOV AL,DL

CALL BCDASC1

MOV BP,OFFSET DBUFFER1

MOV DX,0C0DH

MOV CX,20

MOV BX,004EH

MOV AX,1301H

INT 10H

MOV AH,02H ;设置光标位置

MOV DX,0300H

MOV BH,0

INT 10H

MOV BX,0018H

REPEA: MOV CX,0FFFFH ;延时

REPEAT:LOOP REPEAT

DEC BX

JNZ REPEA

MOV AH,01H ;读键盘缓冲区字符到AL寄存器

INT 16H

JE dis

JMP START

MOV AX,4C00H

INT 21H

RET

DATE ENDP

TIME PROC NEAR ;显示时间子程序

DISPLAY1:MOV SI,0

MOV BX,100

DIV BL

MOV AH,2CH ;取时间

INT 21H

MOV AL,CH

CALL BCDASC ;将时间数值转换成ASCII码字符

INC SI

MOV AL,CL

CALL BCDASC

INC SI

MOV AL,DH

CALL BCDASC

MOV BP,OFFSET DBUFFER

MOV DX,0C0DH

MOV CX,20

MOV BX,004EH

MOV AX,1301H

INT 10H

MOV AH,02H

MOV DX,0300H

MOV BH,0

INT 10H

MOV BX,0018H

RE: MOV CX,0FFFFH

REA: LOOP REA

DEC BX

JNZ RE

MOV AH,01H

INT 16H

JE DISPLAY1

JMP START

MOV AX,4C00H

INT 21H

RET

TIME ENDP

BCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序

PUSH BX

CBW

MOV BL,10

DIV BL

ADD AL,'0'

MOV DBUFFER[SI],AL

INC SI

ADD AH,'0'

MOV DBUFFER[SI],AH

INC SI

POP BX

RET

BCDASC ENDP

BCDASC1 PROC NEAR ;日期数值转换成ASCII码字符子程序

PUSH BX

CBW

MOV BL,10

DIV BL

ADD AL,'0'

MOV DBUFFER1[SI],AL

INC SI

ADD AH,'0'

MOV DBUFFER1[SI],AH

INC SI

POP BX

RET

BCDASC1 ENDP

CODE ENDS

END START

cursor equ 45H

attrib equ 2fh

code segment

assume cs:code,ds:code

start:

jmp go

oldcur dw

OLD1C DW 2 DUP()

NEWINT1C:

PUSHF

CALL DWORD PTR CS:OLD1C

push ax

PUSH BX

PUSH CX

PUSH DX

XOR BH,BH

MOV AH,3

INT 10H

MOV CS:OLDCUR,DX

MOV AH,2

xor bh,bh

MOV DX,CURSOR

INT 10H

MOV AH,2 ;读取系统时钟

INT 1AH

PUSH DX

PUSH CX

POP BX

PUSH BX

CALL SHOWBYTE

CALL SHOWCOLON

POP BX

XCHG BH,BL

CALL SHOWBYTE

CALL SHOWCOLON

POP BX

CALL SHOWBYTE

MOV DX,CS:OLDCUR

MOV AH,2

XOR BH,BH

INT 10H

POP DX

POP CX

POP BX

POP AX

IRET

SHOWBYTE PROC NEAR

PUSH BX

MOV CL,4

MOV AL,BH

SHR AL,CL

ADD AL,30H

CALL SHOW

CALL CURMOVE

POP BX

MOV AL,BH

AND AL,0FH

ADD AL,30H

CALL SHOW

CALL CURMOVE

RET

SHOWBYTE ENDP

SHOWCOLON PROC NEAR

MOV AL,':'

CALL SHOW

CALL CURMOVE

RET

SHOWCOLON ENDP

CURMOVE PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

MOV AH,3

MOV BH,0

INT 10H

INC DL

MOV AH,2

INT 10H

POP DX

POP CX

POP BX

POP AX

RET

CURMOVE ENDP

SHOW PROC NEAR

PUSH AX

PUSH BX

PUSH CX

MOV AH,09H

MOV BX,attrib

MOV CX,1

INT 10H

POP CX

POP BX

POP AX

RET

SHOW ENDP

GO:

PUSH CS

POP DS

MOV AX,351CH ;取中断向量

INT 21H

MOV OLD1C,BX;保存原中断向量

MOV BX,ES

MOV OLD1C+2,BX

MOV DX,OFFSET NEWINT1C ;置新的中断向量

MOV AX,251CH

INT 21H

MOV DX,OFFSET GO

SUB DX,OFFSET START

MOV CL,4

SHR DX,CL

ADD DX,11H

MOV AX,3100H ;结束并驻留

INT 21H

CODE ENDS

END START

#include<reg51h>

#include "intrinsh"

#include "absacch"

#define uchar unsigned char

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0xff};//0-9

unsigned char sec=0,min=0,scanled;

unsigned char key=0,mode,time; 

unsigned char disdat[4];

void dischg()

{

disdat[3]=sec%10;

disdat[2]=sec/10;

disdat[1]=min;

disdat[0]=10;

}

void ext0() interrupt 0

{

key++;

key%=3;

}

void t0isr() interrupt 1 //秒计时

{

TH0=0x3c;

TL0=0xb0;

time++;

if(time==20)

{

time=0;

sec++;

if(sec>59)

{

sec=0;

min++;

if(min>9)min=0;

}

}

dischg();

}

void t1isr() interrupt 3 //显示

{

TH1=0xec;

TL1=0x78;

P0=0xff;

switch(scanled)

{

case 1:

P2=0x02;

P0=~(ledtab[disdat[1]]|0x80);

break;

case 2:

P2=0x04;

P0=~ledtab[disdat[2]];

break;

case 3:

P2=0x08;

P0=~ledtab[disdat[3]];

break;

default:break;

}

scanled++;

scanled%=4;

}

main()

{

TMOD=0x11;

TH0=0x3c;

TL0=0xb0;

TH1=0xec;

TL1=0x78;

TR1=1;

TR0=0;

ET0=1;

ET1=1;

EX0=1;

IT0=1;

EA=1;

scanled=0;

time=0;

mode=1;

dischg();

while(1)

{

switch(key)

{

case 0:TR0=0;break;

case 1:TR0=1;break;

case 2:sec=0;min=0;break;

}

}

}

;name: ELECTRONIC CLOCK

data segment

mess1 db ' ASM ASSIGNMENT ',0ah,0dh

db ' ',0ah,0dh

db ' ELECTRONIC CLOCK ',0ah,0dh

db ' ',0ah,0dh

db ' ',0ah,0dh

db ' Press C or c to correct the time ',0ah,0dh

db ' ',0ah,0dh

db ' Press ESC button to exit ',0ah,0dh,'$'

tn db 'Please input the new time (hh:mm:ss):',0dh,0ah,'$'

mess2 db 'Time is:',0ah,0dh,'$'

t_buff db 40 ;在数据段开一段时间显示缓冲区

db

db 40 dup ()

hor db

min db

sec db

fg db 0

data ends

stack segment

db 100 dup()

stack ends

code segment

assume cs:code,ss:stack,ds:data ;确定各个逻辑段的类型

start:

call clear ;调用清屏子程序

display: ;时间显示部分

mov ax,data

mov ds,ax

mov bx,offset t_buff ;送t_buff的偏移地址到BX

mov ah,2ch ;调用DOS时间调用功能,功能号:2cH,小时,分钟,秒数分别保存在CH,CL,DH中

int 21h

mov al,ch ;小时数设定

mov ah,0

call bctd ;调用进制转换子程序

push ax

and al,0f0h ;选取al高四位

mov cl,4 ;设置右循环的次数

rol al,cl ;右循环

or al,30h ;加30h得到ACSII码

mov [bx],al ;将得到的结果送到t_buff缓冲区

inc bx ;BX自加1,指针指向下一个缓冲区的下一个地址

pop ax

and al,0fh ;选取低四位

or al,30h

mov [bx],al ;将转换后的低四位值送入缓冲区的第二个地址

inc bx

;----------------------------------------------------------

mov al,':' ;显示分隔符号

mov [bx],al

inc bx

;-------------------------------------------------------

mov ah,2ch

int 21h

mov al,cl ;分钟数设定

mov ah,0

call bctd

push ax

and al,0f0h

mov cl,4

rol al,cl

or al,30h

mov [bx],al

inc bx

pop ax

and al,0fh

or al,30h

mov [bx],al

inc bx

;-------------------------------------------------------------------------

mov al,':' ;显示分隔符号

mov [bx],al

inc bx

;-------------------------------------------------------------------------

mov ah,2ch ;秒设定

int 21h

mov al,dh

mov ah,0

call bctd

push ax

and al,0f0h

mov cl,4

rol al,cl

or al,30h

mov [bx],al

inc bx

pop ax

and al,0fh

or al,30h

mov [bx],al

inc bx

;----------------------------------------------------------------------

mov al,'$' ;将字符串的结束位送至显示缓冲区的最后一位

mov [bx],al

;------------------------------------------------------------------------

push bx ;置光标位置 ,AH=2,BH=0,DH跟DL分别为行号与列号,并入栈保护BX

mov ah,2

mov bh,0

mov dh,17

mov dl,41

int 10h

pop bx

lea dx,t_buff ;送t_buff偏移地址到DX,并调用DOS显示功能,功能号为9

mov ah,9

int 21h

push bx ;置光标位置

mov ah,2

mov bh,0

mov dh,0

mov dl,0

int 10h

pop bx

lea dx,mess1

mov ah,9

int 21h

push bx ;置光标位置

mov ah,2

mov bh,0

mov dh,17

mov dl,21

int 10h

pop bx

lea dx,mess2

mov ah,9

int 21h

;-----------------------------

call delay1

mov ah,1 ;调用键盘I/O中断功能号1,获取键值到AL

int 16h

cmp al,'c' ;是c键,转到时间修改程序

je Cor

cmp al,'C' ;是C键,转到时间修改程序

je Cor

cmp al,1bh

jz quit ;是ESC键,退出程序

jmp display

quit:

mov ah,4ch ;程序终止功能号

int 21h

ret

Cor: call correct ;调用时间修改子程序

;-------------------------------

bctd proc near ;二进制转BCD码子程序

;AX输入参数

;AX输出参数,存放调整过的BCD码

mov dx,ax

mov ax,0

mov cx,16 ;设循环次数

bctd1:

clc ;清进位标志C

rcl dx,1 ;通过进位的循环右移

adc al,al ;带进位加法

daa ;加法的十进制调整

xchg al,ah ;交换高、低八位

adc al,al

daa

xchg al,ah

loop bctd1 ;循环次数保存在CX里

ret

bctd endp

;-------------------------------------------

clear proc near

push ax ;入栈保护现场

push bx

push cx

push dx

mov ax,0600h ;ah=06(滚动)al=00(全屏空白)

mov bh,3eh ;设置背景颜色(2)和前景颜色(e)

sub cx,cx

mov dx,5f5fh

int 10h

pop dx ;出栈恢复现场

pop cx

pop bx

pop ax

ret

clear endp

;-----------------------------------------

delay1 PROC ;精确延迟时间子程序

MOV DX,04ffh ;循环次数

up: XOR CX,CX

a: NOP

LOOP a

DEC DX

JNZ up

RET

delay1 ENDP

;----------------------------

correct proc ;时间修改子程序

call input ;调用键盘输入子程序输入数据

mov ch,hor

mov cl,min

mov dh,sec

and dl,0h

mov ah,2dh

int 21h

jmp start

ret

correct endp

;----------------------------------

input proc ;键盘输入子程序

push ax ;入栈保护数据

push bx

push cx

push dx

pushf

mov dx,offset tn ;显示修改时间的格式提示

mov ah,09h

int 21h

mov dx,offset t_buff ;数据缓冲区的数据输入

mov ah,0ah

int 21h

and dx,0h

lea bx,t_buff

inc bx

inc bx

mov dh,[bx]

sub dh,30h

inc bx

mov dl,[bx]

sub dl,30h

mov cl,10

mov al,dh

mul cl

add al,dl

mov ch,al

mov hor,al

inc bx

inc bx

mov dh,[bx]

sub dh,30h

inc bx

mov dl,[bx]

sub dl,30h

mov cl,10

mov al,dh

mul cl

add al,dl

mov cl,al

mov min,al

inc bx

inc bx

mov dh,[bx]

sub dh,30h

inc bx

mov dl,[bx]

sub dl,30h

mov cl,10

mov al,dh

mul cl

add al,dl

mov dh,al

mov sec,al

popf ;出栈恢复数据

pop dx

pop cx

pop bx

pop ax

ret

input endp

;----------------------------

code ends

end start

电路原理图已画好

实现你描述的全部功能

Keil uVision3编译通过,C语言编写,有详细注释

实机调试通过

留个邮箱发给你

----------------------------

邮件已发

ORG 0000H

JMP BEGIN

ORG 000BH

LJMP T0INT

ORG 001BH

LJMP T1INT

LEDD EQU 30H

LEDC EQU 36H

SECC EQU 37H

TCNT EQU 3AH

ORG 0030H

;---------------------------------------

TABLE: ; 共阴极数码管显示代码表

DB 3FH,06H,5BH,4FH,66H ;12345

DB 6DH,7DH,07H,7FH, ;6789

;---------------------------------------

DELAY:

MOV R6,#25

DLY01:

MOV R7,#100

DJNZ R7,$

DJNZ R6,DLY01

RET

;---------------------------------------

BEGIN:

MOV SP,#5FH

MOV TMOD,#11H

MOV TH0,#3CH

MOV TL0,#0B0H

MOV TH1,#0F4H

MOV TL1,#48H

MOV LEDC,#6

MOV R0,#LEDD

CLR A

INIT:

MOV @R0,A

INC R0

DJNZ LEDC,INIT

SETB ET1

SETB TR1

MOV P2,#0

MOV TCNT,#0

MOV SECC,#0

SETB ET0

SETB EA

MOV SECC,#59

LCALL DISSEC

SETB TR0

SETB TR1

LOOP:

SJMP $

;---------------------------------------

T1INT:

PUSH ACC

CLR TR1

MOV TH1,#0F4H

MOV TL1,#48H

SETB TR1

MOV DPTR,#TABLE

MOV R0,#LEDD

MOV A,LEDC

T1INT0:

JNZ T1INT1

MOV P2,#01H

MOV A,@R0

MOVC A,@A+DPTR

CPL A

MOV P1,A

SJMP T1INTD

T1INT1:

MOV P2,#02H

INC R0

MOV A,@R0

MOVC A,@A+DPTR

CPL A

MOV P1,A

T1INTD:

INC LEDC

MOV A,LEDC

CJNE A,#2,T1INT6

T1INT6:

JC T1INTE

MOV LEDC,#0

T1INTE:

POP ACC

RETI

;---------------------------------------

HBCD:

MOV B,#10

DIV AB

SWAP A

ORL A,B

RET

;---------------------------------------

T0INT:

PUSH ACC

CLR TR0

MOV TH0,#3CH

MOV TL0,#0B0H

SETB TR0

INC TCNT

MOV A,TCNT

CJNE A,#20,T0INT1

T0INT1:

JC T0INTE

MOV TCNT,#0

MOV A,SECC

DEC A

MOV SECC,A

JNZ T0INT2

MOV SECC,#59

T0INT2:

LCALL DISSEC

T0INTE:

POP ACC

RETI

;---------------------------------------

DISSEC:

MOV A,SECC

LCALL HBCD

PUSH ACC

ANL A,#0FH

MOV 30H,A

POP ACC

SWAP A

ANL A,#0FH

MOV 31H,A

RET

;---------------------------------------

END

以上就是关于用汇编语言编写一个时钟程序,能显示时分秒的,还要有秒表就是计时器的功能,全部的内容,包括:用汇编语言编写一个时钟程序,能显示时分秒的,还要有秒表就是计时器的功能,、求51单片机秒表汇编程序,有三个键的,分别作用为开始,停止,清零、汇编语言电子时钟的课程设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9697369.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存