;
; 带有时间设置和秒显示的数字闹钟
; 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、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)