用汇编语言编写一个时钟程序,在微机屏幕上显示当前时间的时、分、秒。

用汇编语言编写一个时钟程序,在微机屏幕上显示当前时间的时、分、秒。,第1张

;

; 带有时间设置和秒显示的数字闹钟

; Date : 20071026 12MHZ晶振

; Create by :星星 缘木求鱼

; P32设置键 P33小时调整键 P35分钟调整键 P37定时输出指示

;

;

; 变量地址分配

;

SwDelay equ 2; 设置按键时去抖动时间

DisplayBuffer equ 30h; 设置显示缓冲区的地址为30h-35h共6个字节

BeepVal equ 38h; 蜂鸣时间长短存储器地址

OneSecondCounter equ 39h; 设置1秒计数器的地址,1秒计数器是用来计数1秒内计时器的中断次数

Hour equ 3ah; 设置小时计数器的地址

Minute equ 3bh; 设置分钟计数器的地址

Second equ 3ch; 设置秒计数器的地址

Year equ 3dh; 设置月日年计数器的地址

Month equ 3eh;

Day equ 3fh;

P1Val equ 40h; 设置数码管位驱动值的地址

ClockMode equ 20h0; 模式(正常走时/闹时)设置寄存器地址,值为0时正常走时,为1时闹时设定

AlarmOnOff equ 20h1; 闹钟开启/关闭标志,为0关闭,为1开启

AlarmTimeOn equ 20h2; 此位为1时表示闹时时间到

DataMode equ 20h3

DispHour equ 21h; 设置小时显示寄存器的地址

DispMinute equ 22h; 设置分钟显示寄存器的地址

DispSecond equ 23h; 设置秒显示寄存器的地址

Dnum equ 24h

AlarmHour equ 2eh; 设置闹时小时计数器的地址

AlarmMinute equ 2fh; 设置闹时分钟计数器的地址

AlarmSetKey bit P32; 闹钟设置键

MinuteKey bit P33; 定义分设置键

HourKey bit P34; 定义小时设置键

DataSetKey bit p35;

RelayOut equ P37; 定义输出引脚

;

; 程序开始

;

org 00h

ajmp Reset ;程序开始

org 0bh ;Timer0中断向量地址

ajmp TimeInt ;跳到中断处理程序

org 0020h

Reset: ;以下为初始化程序,为各个变量赋初值

mov sp,#70h;

setb RelayOut

mov OneSecondCounter,#125

;

mov Hour,#23

mov Minute,#59

mov Second,#30 ;设置上电时时钟显示的初值

;

mov Year,#07

mov Month,#12

mov Day,#27

;

mov AlarmHour,#00

mov AlarmMinute,#00 ;设置上电时闹时时间的初值

;

clr AlarmOnOff ;上点复位后闹时功能处于关闭状态

clr ClockMode ;正常走时模式

clr AlarmTimeOn

setb RelayOut ;清闹时输出

clr DataMode

;

mov 36h,#10

mov 37h,#11

;

;

; Use Timer 0 Mode 1

; 400us interrupt

;

mov tmod,#00000001b

mov th0,#0E3h

mov tl0,#5Dh

mov ie, #82h ;开全局中断

SETB EA

SETB ET0

setb tr0 ;开定时中断

;

; 以下为主程序

;

MainLoop:

jb AlarmSetKey,CheckMinuteKey ;闹时设置键按下了吗?没有则转去检测秒设置键

call Delay

jb AlarmSetKey,CheckMinuteKey ;按下的时间超过500ms吗?

setb ClockMode ;置为闹时设置模式

call AlarmSet

CheckMinuteKey:

jb MinuteKey,CheckHourKey ;分设置键按下了吗?没有则转去检测小时设置键

;如按下调用蜂鸣器发音程序

mov a,Minute

add a,#1; 如果按下则将分钟加一 十进制调整

mov Minute,a;

cjne a,#3ch,NotOver1; 到60分钟了吗?

mov Minute,#0; 到60分钟则将分钟清0

NotOver1: ;以下等待按键释放及防抖动

jnb MinuteKey,$

CheckHourKey:

jb HourKey,CheckDataKey;

; 如按下调用蜂鸣器发音程序

mov a,Hour

add a,#1; 如果按下则将小时加1

mov Hour,a

cjne a,#18h,NotOver2

mov Hour,#0; 到24小时则将小时清0

NotOver2: ;以下等待按键释放及防抖动

jnb HourKey,$

CheckDataKey:

jb DataSetKey,CheckAlarm

call Delay

jb DataSetKey,CheckAlarm

setb DataMode

call Dataset

CheckAlarm:

jnb AlarmTimeOn,ToReturn

call AlarmProcess

ToReturn:

ajmp MainLoop

;

; 定时器Timer0中断服务程序(此程序每8ms执行一次)

;

TimeInt:

mov th0,#0E3h; 重新加载定时参数

mov tl0,#5Dh;

push acc

push psw; 保护累加器及程序状态字的内容

setb rs0; 选择工作寄存器组1,

clr rs1; 这样可保护原工作寄存器组(0组)的内容

djnz OneSecondCounter,NotoneSecond; 中断了125次了吗?即够1秒了吗?

mov OneSecondCounter,#125; 如够1秒则重新设置"OneSecondCounter"计数器

call Clock ; 调用将时钟内容加1秒的子程序

call Daynum

call ConvertoBuffer ; 调用将时钟内容转换到显示缓冲区子程序

NotoneSecond:

call ScanDisplay ; 调用扫描显示子程序

pop psw

pop acc ; 恢复累加器及程序状态字的内容

reti ; 中断返回

;

; 扫描显示子程序

;

ScanDisplay:

MOV R1,#DisplayBuffer ;指向显示数据首址

MOV R5,#0FEH ;扫描控制字初值

PLAY:

MOV A,R5 ;扫描字放入A

MOV P2,A ;从P2口输出

MOV A,@R1 ;取显示数据到A

MOV DPTR,#TAB ;取段码表地址

MOVC A,@A+DPTR ;查显示数据对应段码

MOV P1,A ;段码放入P1口

LCALL Delay

INC R1 ;指向下一地址

MOV A,R5 ;扫描控制字放入A

JNB ACC7,ENDOUT ;扫到第六位时结束

RL A ;A中数据循环左移

MOV R5,A ;放回R5内

AJMP PLAY ;跳回PLAY循环

ENDOUT: MOV P2,#0FFH ;一次显示结束,P2口复位

MOV P1,#00H ;P1口复位

RET ;子程序返回

TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H,39h

;共阴段码表 "0""1""2" "3""4""5""6""7" "8""9""-""c"

;

; 时钟内容加1秒的子程序

;

Clock:

mov a,Second; 将原秒值送入a

add a,#1; 加1秒

mov Second,a

cjne a,#3cH,NotOverFlow; 够60秒了吗?

mov Second,#0; 够了则将秒值清0

;

mov a,Minute

add a,#1

mov Minute,a; 分钟加1

cjne a,#3cH,NotOverFlow; 够60分了吗?

mov Minute,#0; 够了则将分值清0

;

mov a,Hour

add a,#1

mov Hour,a; 小时加1

cjne a,#18H,NotOverFlow; 够24小时吗?

mov Hour,#0; 够了则将小时值清0

;

mov a,Day

add a,#1

mov Day,a

cjne a,Dnum,NotAlarm

mov Day,#1

;

mov a,Month

add a,#1

mov Month,a

cjne a,#13,NotAlarm

mov Month,#1

;

mov a,Year

add a,#1

mov Year,a

cjne a,#11,NotAlarm

mov Year,#0

NotOverFlow:

jnb AlarmOnOff,NotAlarm; 闹钟开启了吗?如没有开启则无需理会是否到闹时时间

mov a,Second

jnz NotAlarm; 秒为零吗?

mov a,Minute

cjne a,AlarmMinute,NotAlarm; 时间分钟值和闹时设置分钟值相等吗?

mov a,Hour

cjne a,AlarmHour,NotAlarm; 时间小时值和闹时设置小时值相等吗?

setb AlarmTimeOn; 到了闹时时间则将“闹时时间到”标志设为1

NotAlarm:

ret

;

; 将时钟内容或闹时设置值转换到显示缓冲区子程序

;

ConvertoBuffer:

mov r1,#DisplayBuffer

jnb dataMode,TimeDisp

mov a,Day

mov DispSecond,a

mov a,Month

mov DispMinute,a

mov a,Year

mov DispHour,a

ajmp Convert

TimeDisp: jb ClockMode,DispAlarmSet; 判断时钟模式,以决定是显示实时时间还是闹时时间

mov a,Second;

mov DispSecond,a;

mov a,Minute;

mov Dispminute,a;

mov a,Hour;

mov DispHour,a; 显示实时时间

;

ajmp Convert

DispAlarmSet:

jb AlarmOnOff,AlarmOn

mov DispSecond,#00h

ajmp Next

AlarmOn:

mov DispSecond,#11; 显示闹时时间及显示闹钟状态:显示“00”表示关闭闹钟,

Next: ;“11”表示开启闹钟

mov a,AlarmMinute;

mov Dispminute,a;

mov a,AlarmHour;

mov DispHour,a;

;

Convert:

mov a,DispSecond; 取秒值

mov b,#10

div ab

mov @r1,b;

inc r1; 缓冲寄存器的地址加1

mov @r1,a; 将秒值的十位值存入缓冲区

;

inc r1

mov a,DispMinute

mov b,#10

div ab

mov @r1,b;

inc r1; 缓冲寄存器的地址加1

mov @r1,a; 将秒值的十位值存入缓冲区

;

inc r1

mov a,DispHour

mov b,#10

div ab

mov @r1,b;

inc r1; 缓冲寄存器的地址加1

mov @r1,a; 将秒值的十位值存入缓冲区

ret;

;

;天数判断,平年,闰年

;

Daynum: mov a,Month

mov dptr,#TABL

movc a,@a+dptr

mov Dnum,a

mov a,Year

mov b,#4

div ab

mov a,b

cjne a,#0,BB

mov a,Month

cjne a,#2,BB

inc Dnum

BB: RET

TABL: DB 31,32,29,32,31,32,31,32,32,31,32,31,32

;

; 闹时设置子程序

;

AlarmSet:

jnb AlarmSetKey,$

call Delay; 等待“AlarmSetKey”键释放

CheckArmMinuteKey: ;

jb MinuteKey,CheckArmHourKey; 分设置键按下了吗?没有则转去检测小时设置键

setb AlarmOnOff

mov 37h,#0

mov a,AlarmMinute

add a,#1; 如果按下则将分钟加1 十进制调整

mov AlarmMinute,a;

cjne a,#3ch,ArmNotOver1; 到60分钟了吗?

mov AlarmMinute,#0; 到60分钟则将分钟清0

ArmNotOver1: ;以下等待按键释放及防抖动

jnb MinuteKey,$

CheckArmHourKey:

jb HourKey,AlarmSetEnd; 小时设置键按下了吗?没有则返回反复检测

setb AlarmOnOff

mov a,AlarmHour

add a,#1; 如果按下则将小时加1

mov AlarmHour,a

cjne a,#18h,ArmNotOver2

mov AlarmHour,#0; 到24小时则将小时清0

ArmNotOver2: ;以下等待按键释放及防抖动

jnb HourKey,$

AlarmSetEnd:

jb AlarmSetKey,AlarmSet; 设置完毕了吗?

jnb AlarmSetKey,$;

clr ClockMode; 从设置模式转为走时模式

ret

;

; 日期调整

;

DataSet:

jnb DataSetKey,$

call Delay

CheckDataYearKey:

jb HourKey,CheckDataMonthKey

mov a,Year

add a,#1

mov Year,a

cjne a,#11,DataNotOver1

mov Year,#0

DataNotOver1:

jnb HourKey,$

CheckDataMonthKey:

jb MinuteKey,CheckDataDayKey

mov a,Month

add a,#1

mov Month,a

cjne a,#13,DataNotOver2

mov Month,#1

DataNotOver2:

jnb MinuteKey,$

CheckDataDayKey:

jb AlarmSetKey,DataSetEnd

mov a,day

add a,#1

mov Day ,a

cjne a,Dnum,DataNotOver3

mov Day,#1

DataNotOver3:

jnb AlarmSetKey,$

DataSetEnd:

jb DataSetKey,DataSet

jnb DataSetKey,$

clr DataMode

ret

;

; 闹时服务子程序

;

AlarmProcess:

clr RelayOut;

jb AlarmSetKey,AlarmReturn; 停止闹时键(即闹时设置键)按下了吗?

clr AlarmOnOff

jnb AlarmSetKey,$;

setb RelayOut; 如停止闹时键按下则停止闹时

clr AlarmTimeOn;

mov 37h,#11

mov AlarmMinute,#00

mov AlarmHour,#00

AlarmReturn:

ret

;

; 延时子程序

;

Delay:

mov r6,#2

Del:

mov r7,#124

djnz r7,$

djnz r6,Del

ret

DL1s: mov r3,#4

dd: call Delay

djnz r3,dd

ret

end

附录1:晶振为12M的音乐频率表

音符 频率(Hz) 简谱码(T值)

低1DO 262 63628 TH0=F7H TL0=24H

#1DO# 277 63731 TH0=F8H TL0=F3H

低2RE 294 63835 TH0=F9H TL0=5BH

#2RE# 311 63928 TH0=F9H TL0=B8H

低3M 330 64021 TH0=FAH TL0=15H

低4FA 349 64103 TH0=FAH TL0=67H

#4FA# 370 64185 TH0=FAH TL0=B9H

低5SO 392 64260 TH0=FBH TL0=04H

#5SO# 415 64331 TH0=FBH TL0=4BH

低6LA 440 64400 TH0=FBH TL0=90H

#6 466 64463 TH0=FBH TL0=CFH

低7SI 494 64524 TH0=FCH TL0=0CH

中1DO 523 64580 TH0=FCH TL0=44H

#1DO# 554 64633 TH0=FCH TL0=79H

中2RE 587 64684 TH0=FCH TL0=ACH

#2RE# 622 64732 TH0=FCH TL0=DCH

中3M 659 64777 TH0=FDH TL0=09H

中4FA 698 64820 TH0=FDH TL0=34H

#4FA# 740 64860 TH0=FDH TL0=5CH

中5SO 784 64898 TH0=FDH TL0=82H

#5SO# 831 64934 TH0=FDH TL0=A6H

中6LA 880 64968 TH0=FDH TL0=C8H

#6 932 64994 TH0=FDH TL0=E2H

中7SI 988 65030 TH0=FEH TL0=06H

高1DO 1046 65058 TH0=FEH TL0=22H

#1DO# 1109 65085 TH0=FEH TL0=3DH

高2RE 1175 65110 TH0=FEH TL0=56H

#2RE# 1245 65134 TH0=FEH TL0=6EH

高3M 1318 65157 TH0=FEH TL0=85H

高4FA 1397 65178 TH0=FEH TL0=9AH

#4FA# 1480 65198 TH0=FEH TL0=AEH

高5SO 1568 65217 TH0=FEH TL0=C1H

#5SO# 1661 65235 TH0=FEH TL0=D3H

高6LA 1760 65252 TH0=FEH TL0=E4H

#6 1865 65268 TH0=FEH TL0=F4H

高7SI 1967 65283 TH0=FFH TL0=03H

休止符用TH0=FFH ,TL0=FFH表示

附录2:LCD相关资料

两行液晶显示的地址:(均为十六位计数)

0 1 2 3 4 5 6 7 8 9 A B C D E F

40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F

命令格式要求,设置地址指针的时候第8位为1,后边为地址,即AC0~AC6,就是对应上表的地址。

附录3:实验程序:

RS BIT P20 ;定义液晶显示端口标号

RW BIT P21

E BIT P22

;

T0TH EQU 24H ;T0两个暂存变量

T0TL EQU 23H

ORG 0000H

LJMP INITION

ORG 000BH

LJMP T0INT

ORG 0100H

;

;液晶初始化

INITION:

MOV SP,#70H

MOV P0,#01H ;清屏

CALL ENABLE

MOV P0,#38H ;8位,2行显示

CALL ENABLE

MOV P0,#0CH ;屏显on,关光标

CALL ENABLE

MOV P0,#06H ;计数地址加1,自动右移

CALL ENABLE

;

;开机提示

;

MOV P0,#80H

CALL ENABLE

MOV DPTR,#TABLE0 ;写数据的第一行

CALL WRITE1

MOV P0,#00010000B ;光标左移两位

CALL ENABLE

MOV P0,#00010000B

CALL ENABLE

CALL DEL0

LJMP MAIN

;写指令

ENABLE:

CLR RS

CLR RW

SETB E

CALL DEL0

CLR E

RET

;写数据

WRITE1:

MOV R1,#00H ;查表程序,从表头到表尾

A1:

MOV A,R1

MOVC A,@A+DPTR

CALL WRITE2

INC R1

CJNE A,#00H,A1 ;未到字符串末尾继续

RET

WRITE2:

MOV P0,A ;直接将数据写入液晶屏

SETB RS

CLR RW

SETB E

CALL DEL0

CLR E

RET

DEL0:MOV R4,#020H

C0:MOV R5,#020H

C1: DJNZ R5,C1

DJNZ R4,C0

RET

;

TABLE0:DB 'WELCOM HERE',00H

;内存初始化

INITIAL:

MOV R3,#08H

MOV R0,#30H

M1:

MOV @R0,#00H

INC R0

DJNZ R3,M1

RET

;选择按键播放八个音调

MAIN: MOV SP,#80H ;初始化堆栈

MOV TMOD,#11H ;定时器0工作方式0,定时器1工作方式0

SETB EA

SETB ET0 ;计数器0允许

SETB ET1 ;计数器1允许

START: SETB P37 ;关蜂鸣器

CLR TR0 ;定时器不允许

SCAN: ;键盘扫描

MOV A,P1

CJNE A,#0FFH,SU_KEY ;判断键盘按下,跳到SU_KEY,若未按,继续扫描

NOP

LJMP SCAN

SU_KEY:

SU_KEY1:

JB P10,SU_KEY2 ;如果不是第1个键按下,转

MOV DPH,#0FCH

MOV DPL,#44H

SJMP PLAY

SU_KEY2:

JB P11,SU_KEY3 ;如果不是第2个键按下,转

MOV DPH,#0FCH

MOV DPL,#0ACH

SJMP PLAY

SU_KEY3:

JB P12,SU_KEY4 ;如果不是第3个键按下,转

MOV DPH,#0FDH

MOV DPL,#09H

SJMP PLAY

SU_KEY4:

JB P13,SU_KEY5 ;如果不是第4个键按下,转

MOV DPH,#0FDH

MOV DPL,#34H

SJMP PLAY

SU_KEY5:

JB P14,SU_KEY6 ;如果不是第5个键按下,转

MOV DPH,#0FDH

MOV DPL,#82H

SJMP PLAY

SU_KEY6:

JB P15,SU_KEY7 ;如果不是第6个键按下,转

MOV DPH,#0FDH

MOV DPL,#0C8H

SJMP PLAY

SU_KEY7:

JB P16,SU_KEY8 ;如果不是第7个键按下,转

MOV DPH,#0FEH

MOV DPL,#06H

SJMP PLAY

SU_KEY8:

JB P17,KEY1 ;如果不是第8个键按下,转

MOV DPH,#0FEH

MOV DPL,#22H

SJMP PLAY

PLAY:

MOV T0TH,DPH ;存高位字符

MOV T0TL,DPL ;存低位字符

MOV TH0,T0TH

MOV TL0,T0TL

SETB TR0 ;启动定时器0

MOV R2,#01B ;1/4拍

DJNZ R2,PLAY

LCALL DELAY

SJMP JUDGE

JUDGE:

JB P24,START ;按键未按下,则继续扫描,否则,开始放音乐

;选择按键播放音乐

KEY1:

JB P25,KEY2 ;第一个键(P25)按下,放音音乐1

MOV R2,#00H

LCALL MODD ;歌曲号显示

MOV DPTR,#MU_TAB1

AJMP MUSIC

KEY2:

JB P26,KEY3 ;第二个键(P26)按下,放音乐2

MOV R2,#01H

LCALL MODD ;歌曲号显示

MOV DPTR,#MU_TAB2

AJMP MUSIC

KEY3:

JB P27, NEXT_2 ;第三个键(P27)按下,放音乐3

MOV R2,#02H

LCALL MODD ;歌曲号显示

MOV DPTR,#MU_TAB3

AJMP MUSIC

NEXT_2: LJMP START ;返回

MUSIC:

MOV TMOD,#01H

MOV IE,#82H ;允许T0中断

MOV R7,#00H

LOOP:

CLR A

MOVC A,@A+DPTR ;查表取代码

MOV R1,A ;定时器高八位存R1

INC DPTR

PUSH DPH ;保护现场

PUSH DPL

GECI1:

JB P25,GECI2 ;第一个键(P25)按下,显示歌词1

MOV DPTR,#GE1

AJMP GECI

GECI2:

JB P26,GECI3 ;第二个键(P26)按下,显示歌词2

MOV DPTR,#GE2

AJMP GECI

GECI3:

JB P27, TIAOCHU ;第三个键(P27)按下,显示歌词3

MOV DPTR,#GE3

AJMP GECI

TIAOCHU:LJMP START

GECI:

LCALL QINGCHU

MOV P0,#0C0H ;显示的位置

CALL ENABLE

XIANSHI1: MOV A,R7 ;查表取音乐汉语拼音显示

MOVC A,@A+DPTR

CALL WRITE2

INC R7

CJNE A,#00H,XIANSHI1

MOV P0,#00010000B ;将光标左移一位

CALL ENABLE

MOV P0,#00010000B ;将光标左移一位

CALL ENABLE

POP DPL

POP DPH

CLR A

MOVC A,@A+DPTR

MOV R0,A ;定时器低八位存R0

ORL A,R1

JZ NEXT0 ;相或结果全0为休止符

MOV A,R0

ANL A,R1

CJNE A,#0FFH,NEXT ;相与结果为0FFH表示乐曲结束

MOV P0,#01H ;清屏

CALL ENABLE

LJMP INITION ;从头开始演奏

NEXT: MOV T0TH,R1 ;装定时初值

MOV TH0,T0TH

MOV T0TL,R0

MOV TL0,T0TL

SETB TR0 ;启动定时器

SJMP NEXT1

NEXT0: CLR TR0 ;关闭定时器

NEXT1: CLR A

INC DPTR

MOVC A,@A+DPTR ;查延时常数

MOV R2,A

LOOP1:

ACALL D200

DJNZ R2,LOOP1 ;控制延时次数

INC DPTR

AJMP LOOP

D200: MOV R3,#81H ;延时程序

D200B: MOV A,#0FFH

D200A: DEC A

JNZ D200A

DEC R3

CJNE R3,#00H,D200B

RET

QINGCHU:MOV A,#00100000B

MOV P0,#0C0H ;将第二行的第一位置0

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第二位置0

MOV P0,#0C1H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第三位置0

MOV P0,#0C2H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第四位置0

MOV P0,#0C3H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第五位置0

MOV P0,#0C4H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第六位置0

MOV P0,#0C5H

LCALL ENABLE

LCALL WRITE2

MOV A,#00100000B ;将第二行的第七位置0

MOV P0,#0C6H

LCALL ENABLE

LCALL WRITE2 ;将第二行的第三位置0

;以上等价程序如下

;GECI:MOV R3,#00H ;控制循环次数

;QINGCHU:

;MOV A,#00100000B ;置空格

;PUSH A

;MOV R4,#0C0H ;地址

;MOV A,R4

;MOV P0,A

;POP A

;INC R4

;DEC R3 ;控制循环次数

;CJNE R3,#00H,QINGCHU ;计满十次则执行转移

;

;定时器0中断子程序,定时音乐

;

T0INT: ;中断服务子程序

MOV TH0,T0TH

MOV TL0,T0TL

CPL P37 ;反相输出,演示音乐

RETI

;

;显示

;

MODD:

MOV P0,#8EH

LCALL ENABLE

MOV A,R2

MOV DPTR,#TABLE2

MOVC A,@A+DPTR

LCALL WRITE2

RET

TABLE2:DB 31H,32H,33H

GE1: db 'xin',00h,'nian',00h,'hao',00h,'ya',00h,'xin',00h,'nian',00h,'hao',00h,'ya',00h

db 'zhu',00h,'fu',00h,'da',00h,'jia',00h,'xin',00h,'nian',00h,'hao',00h

GE2: DB 'liang',00H,'zhi',00H,'lao',00H,'hu',00H,'liang',00H,'zhi',00H,'lao',00H,'hu',00H,'pao',00H,'de',00H,'kuai',00H

DB 'pao',00H,'de',00H,'kuai',00H,'yi',00H,'zhi',00H,'mei',00H,'you',00H,'yan',00H,'jing',00H,'yi',00H,'zhi',00H

DB 'mei',00H,'you',00H,'er',00h,'duo',00h,'zhen',00h,'qi',00h,'guai',00h,'zhen',00h,'qi',00h,'guai',00h

GE3: DB 'wo',00h,'ai',00h,'bei',00h,'jing',00h,'tian',00h,'an',00h,'men',00h,'tian',00h,'an',00h

;延时子程序

DELAY:MOV 30H,#100 ;延长时间等待,键盘消抖

D1:MOV R5,#200

D2:DJNZ R5,D2

DJNZ 30H,D1

RET

;新年好

MU_TAB1: DB 0FEH,25H,04H,0FEH,25H,04H

DB 0FEH,25H,06H,0FDH,80H,06H

DB 0FEH,84H,04H,0FEH,84H,04H

DB 0FEH,84H,06H,0FEH,25H,06H

DB 0FEH,25H,04H,0FEH,84H,04H

DB 0FEH,0C0H,04H,0FEH,84H,04H

DB 0FEH,98H,04H,0FEH,84H,04H

DB 0FEH,57H,06H

DB 0FFH,0FFH

;两只老虎

MU_TAB2: DB 0FCH,44H,06H,0FCH,0ACH,06H,0FDH,09H,06H,0FCH,44H,06H

DB 0FCH,44H,06H,0FCH,0ACH,06H,0FDH,09H,06H,0FCH,44H,06H

DB 0FDH,09H,06H,0FDH,34H,06H,0FDH,0A6H,06H

DB 0FDH,09H,06H,0FDH,34H,06H,0FDH,0A6H,06H

DB 0FBH,04H,04H,0FDH,0C8H,04H,0FBH,04H,04H,0FDH,34H,04H

DB 0FDH,09H,04H,0FCH,44H,04H,0FBH,04H,04H,0FDH,0C8H,04H

DB 0FBH,04H,04H,0FDH,34H,04H,0FDH,09H,04H,0FCH,44H,04H

DB 0FCH,44H,06H,0FDH,0A6H,06H,0FCH,44H,06H

DB 0FCH,44H,06H,0FDH,0A6H,06H,0FCH,44H,06H

DB 0FFH,0FFH

;我爱北京天安门

MU_TAB3: DB 0FDH,82H,06H,0FEH,22H,04H,0FDH,82H,04H,0FDH,34H,04H

DB 0FDH,09H,04H,0FCH,0ACH,04H,0FCH,44H,06H

DB 0FFH,0FFH,0FFH,0FFH

END

以上就是关于用汇编语言编写一个时钟程序,在微机屏幕上显示当前时间的时、分、秒。全部的内容,包括:用汇编语言编写一个时钟程序,在微机屏幕上显示当前时间的时、分、秒。、微机原理实验箱的电子琴设计,利用8254,8255、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9407579.html

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

发表评论

登录后才能评论

评论列表(0条)

保存