org 0000h ;主程序起始地址 ljmp start ;跳至主程序 org 000bh ;TIME0中断起始地址 ljmp tim0 ;跳至time0中断子程序tim0 org 030h ; mov 30h,0 ;30地址清0 ;时钟程序 start: mov sp,#70h ;设置堆栈在70h mov 28h,#00 ;显示寄存器初值为00 mov 2ah,#12h ;“时”寄存器初值为12h mov 2bh,#00 ;"分"寄存器初值为00h mov 2ch,#00 ;"秒"寄存器初值为00h mov tmod,#00000001b ;设time0为mode1 mov th0,#high(65536-4000) ;计时中断为4000微秒 mov tl0,#low(65536-4000) mov ie,#10000010b ;time0中断使能 mov r4,#250 ;中断250次 setb tr0 ;启动time0 loop: jb p0.0,n2 ;p0.0(秒)按了?不是则跳至n2检查p0.1 acall delay ;消除抖动 mov a,2ch ;将秒寄存器的值载入a add a,#01 ;a的内容加1 da a ;做十进制调整 mov 2ch,a ;将a的值存入秒寄存器 cjne a,#60h,n1 ;是否等于60秒?不是则跳值n1 mov 2ch,#00 ;是则清除秒寄存器的值为00 n1: jnb p0.0,$ ;p0.0(秒)放开了? acall delay ;消除抖动 n2: jb p0.1,n4 ;p0.1(分)按下了吗?不是则跳至n4检查p0.2 acall delay ; 消除抖动 mov a,2bh ;将分寄存器的值载入a add a,#01 ;a的内容加1 da a ;做十近位调整 mov 2bh,a ;将a的值存入分寄存器 cjne a,#60h,n3 ;是否等于60分?不是则跳至n3 mov 2bh,#00 ;是则清除分寄存器的值为00 n3: jnb p0.1,$ ;p0.1(分)放开了? acall delay ; 消除抖动 n4: jb p0.2,loop ; p0.2(时)按下了吗?不是则跳值loop acall delay ;消除抖动 mov a,2ah ;将时寄存器的值载入a add a,#01 ;a的内容加1 da a ;作十近位调整 mov 2ah,a ;将a得值存入时寄存器 cjne a,#24h,n5 ;是否等于24?不是则跳至n5 mov 2ah,#00 ;是则清除时寄存器的值为00 n5: jnb p0.2,$ ;p0.2(时)放开了? acall delay ;消除抖动 jmp loop tim0: mov th0,#high (65536-4000) ;重设计时4000微秒 mov tl0,#low (65536-4000) push acc ;将a的值暂存于堆栈 push psw ;将psw的值暂存于堆栈 djnz r4,x2 ;计时1秒 mov r4,#250 acall clock ;调用计时子程序clock acall disp ;调用显示子程序 x2: acall scan ;调用扫描子程序 pop psw ;至堆栈取回psw的值 pop acc ;至堆栈取回acc的值 reti scan: mov r0,#28h ;(28h)为扫描指针 inc @r0 ;扫描指针加1 cjne @r0,#6,x3 ;扫描完6个显示器?不是跳值x3 mov @r0,#0 ;是则扫描指针为0 x3: mov a,@r0 ;扫描指针载入a add a,#20h ;a加常数20h(显示寄存器地址)=个时间显示区地址 mov r1,a ;存入r1=各时间显示地址 mov a,@r0 ;扫描指针存入a swap a ;将a高低4位交换(p1高4位为扫描值,低4位为显示数据值) orl a,@r1 ;扫描值+显示值 mov p1,a ;输出至p1 ret clock: mov a,2ch ;(2ch)为秒寄存器 add a,#1 ;加1秒 da a ;作十进位调整 mov 2ch,a ;存入秒寄存器 cjne a,#60h,x4 ;是否超过60秒?不是则跳至x4 mov 2ch,#00 ;是则清除为00 mov a,2bh ;(2bh)为分寄存器 add a,#1 ;加1分 da a ;作十近位调整 mov 2bh,a ;存入分寄存器 cjne a,#60h,x4 ;是否超过60分?不是则跳至x4 mov 2bh,#00 ;是则清除为00 mov a,2ah ;(2ah)为时寄存器 add a,#1 ;加1时 da a ;作十进制调整 mov 2ah,a;存入时寄存器 cjne a,#24h,x4 ;是否超过24时?不是则跳至x4 mov 2ah,#00 ;是则清除为00 x4: ret disp: mov r1,#20h ;(20h)为显示寄存器,r1=20h mov a,2ch ;将秒寄存器的内容存入a mov b,#10h ;设b累加器的值为10h div ab ;a÷b商(十位数)存入a,余数(个位数)存入b mov @r1,b ;将b的内容存入(20h) inc r1 ;r1=21h mov @r1,a ;将a的内容存入(21h) inc r1 ;r1=22h mov a,2bh ;将a的内容存入(21h) mov b,#10h ;设b累加器的值为10 div ab ;a÷b,商(十位数)存入a,余数(个位数)存入b mov @r1,b ;将b的内容存入(22h) inc r1 ;r1=23h mov @r1,a ;将a的内容存入(23h) inc r1 ;r1=24h mov a,2ah ;将时寄存器的内容存入a mov b,#10h ;设b累加器的值为10h div ab ;a÷b商(十位数)存入a,余数(个位数)存入b mov @r1,b ;将b的内容存入(24h) inc r1 ;r1=25h mov @r1,a ;将a的内容存入(25h) ret ljmp inter1 org 001bh ljmp inser ;1KHZ程序 inter1: mov tmod,#00h mov th1,#0f0h mov tl1,#0ch setb ea setb et1 loop1: setb tr1 here: sjmp here inser: mov th1,#0f0h mov tl1,#0ch cpl P3.3 inc 30h int2: push acc ;记数产生2HZ push psw cjne a,#255,inser t_l1: cpl p3.2 mov 30h,#0 pop psw pop acc reti ;acall disp1 ;acall loop2 ;显示报警地点程序 clr p3.1;启动ls244 disp1: setb p2.7 clr p0.3 mov p2,#4fh lcall delay mov p2,#0ffh setb p0.3 clr p0.4 mov p2,#13h lcall delay mov p2,#0ffh setb p0.4 clr p0.5 mov p2,#0dh lcall delay mov p2,#0ffh setb p0.5 clr p0.6 mov p2,#01h lcall delay mov p2,#0ffh setb p0.6 clr p0.7 mov p2,#0fh lcall delay mov p2,#0ffh setb p0.7 clr p2.7 mov p2,#50h lcall delay mov p2,#0ffh ajmp disp1 ;按键消除警报 loop2: jb p1.7,inter1 acall delay clr et1 ret delay: mov r7,#2 ;5毫秒 d1: mov r6,#25 d2: djnz r6,d2 djnz r7,d1 ret end