附录3:源程序
;说明:
;R0指向30,31,32的地址指针,初始值为30 全局
;R1函数toram的入口,指向20的地址指针 全局
;R2定时一秒的常数 全局
;R3接受按键 全局
;R4报警标志位 全局 r3,r4是函数toram用到的寄存器 局部
;R5计时器状态标志 全局 r5=00 计时器go r5=11 计时器stop
;R6修改状态标志 全局 r6=00 按键无效 r6=ff 进入修改状态,
;R7函数toram的入口,全局 一个压缩BCD码
;20H开始的8个数据单元存放时间的BCD码
;30H,31H,32H依次存放小时,分,秒的压缩BCD码
Z8279 EQU 0FF82H
D8279 EQU 0FF80H
LEDMOD EQU 10H
LEDFEQ EQU 38H
LEDCLS EQU 0D1H
LEDWRO EQU 90H
KEY1 EQU 28H ;修改状态改变
KEY2 EQU 29H ;修改位置改变
KEY3 EQU 2AH ;数值改变
ORG 0000H
AJMP START
ORG 000BH
AJMP T0INT
ORG 0040H
START:
MOV SP,#60H
MOV R1,#20H
MOV R2,#08H
MOV A,#00H
MOV 30H,#07H
MOV 31H,#56H
MOV 32H,#30H
MOV DPTR,#Z8279
MOV A,#LEDCLS
MOVX @DPTR,A
LCALL DELAY
MOV A,#LEDMOD
MOVX @DPTR,A
MOV A,#LEDFEQ
MOVX @DPTR,A
LOOP22:
MOV @R1,A
INC R1
DJNZ R2,LOOP22
LCALL INIT8279
;------------------------初始化
CLR P1.0
CLR P1.1
MOV R6,#00H
MOV R0,#30H
MOV R2,#14H
mov R5,#00h
MOV R4,#00H ;清标志位 -报警
MOV R7,#00H
MOV 22H,#00H
MOV 25H,#00H
CLR TF0
MOV TMOD,#01H
MOV TH0,#4BH
MOV TL0,#0FCH
MOV IE,#82H
SETB TR0
;---------------------修改时间
MODIFY:
MOV DPTR,#Z8279
MOVX A,@DPTR
ANL A,#0FH
JZ KEY_OUT ;没有按键 跳出
MOV A,#40H
MOVX @DPTR,A
MOV DPTR,#D8279
MOVX A,@DPTR ;A接受按键
MOV R3,A
CJNE R3,#KEY1,POSITION ;判断按键是不是key1, 不是跳转
CJNE R6,#00H,PRESS_SEC ;第一次按key1进入修改状态,(显示闪烁),时间不停
MOV R6,#0FFH ;置标志位
SJMP KEY_OUT ;跳出
PRESS_SEC:
MOV R6,#00H ;第二次按key1跳出修改状态 (不闪烁)
CJNE R5,#00H,MODIFY_OK ;如果计时停止,恢复计时
SJMP KEY_OUT
MODIFY_OK:
SETB TR0 ;启动定时器
SJMP KEY_OUT
POSITION:
CJNE R3,#KEY2,VALUE ;判断是否为key2,不是跳转
CJNE R6,#0FFH,KEY_OUT ;若未进入修改状态,跳转
INC R0 ;若进入修改状态,则移位
CJNE R0,#33H,JJJ
MOV R0,#30H
JJJ:
SJMP KEY_OUT
VALUE:
CJNE R3,#KEY3,KEY_OUT ;判断是否为key3,不是跳出
CJNE R6,#0FFH,KEY_OUT ;判断是否进入修改状态,没有-跳出
CLR TR0 ;若已进入,停止计时,准备修改
MOV R5,#11H ;标记置位,表明计时停止
CJNE R0,#32H,WWW
MOV @R0,#00H
SJMP KEY_OUT
WWW:
MOV A,@R0 ;在相应的位置加一
ADD A,#01H
DA A
MOV @R0,A
MOV A,R0
CJNE A,#30H,SIXTY ;如果不是小时,加到60,
CJNE @R0,#24H,KEY_OUT ;是小时,加到24
MOV @R0,#00H
SJMP KEY_OUT
SIXTY:
CJNE @R0,#60H,KEY_OUT
MOV @R0,#00H
SJMP KEY_OUT
KEY_OUT:
CJNE R6,#0FFH,NODIS ;如果已进入修改状态,进入闪烁显示状态
LCALL FLASHON
NODIS:
LCALL SIREN ;调用报警程序
AJMP MODIFY ;循环
;------------------------子程序-------------------------
FLASHON:
CJNE R0,#30H,JUMP31 ;如果指针指向小时,则小时位闪烁
MOV R1,#26H
MOV A,@R0
MOV R7,A
LCALL TORAM ;将小时的BCD码送到26H,27H
MOV DPTR,#Z8279 ;闪烁
MOV A,#86H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#Z8279
MOV A,#87H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,#00H
MOVX @DPTR,A
LCALL DELAY
MOV DPTR,#Z8279 ;将小时的值显示出来
MOV A,#86H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,26H
MOVX @DPTR,A
MOV DPTR,#Z8279 ;将小时的值显示出来
MOV A,#87H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,27H
MOVX @DPTR,A
LCALL DELAY
RET ;显示完毕,跳出
JUMP31:
CJNE R0,#31H,JUMP32 ;如果指针指向 分,则分钟的位置闪烁
MOV R1,#23H
MOV A,@R0
MOV R7,A
LCALL TORAM
MOV DPTR,#Z8279
MOV A,#83H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#Z8279
MOV A,#84H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,#00H
MOVX @DPTR,A
LCALL DELAY
MOV DPTR,#Z8279
MOV A,#83H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,23H
MOVX @DPTR,A
MOV DPTR,#Z8279
MOV A,#84H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,24H
MOVX @DPTR,A
LCALL DELAY
RET
JUMP32:
CJNE R0,#32H,QIUT ;如果指针指向秒,则秒位闪烁
MOV R1,#20H
MOV A,@R0
MOV R7,A
LCALL TORAM
MOV DPTR,#Z8279
MOV A,#80H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#Z8279
MOV A,#81H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,#00H
MOVX @DPTR,A
LCALL DELAY
MOV DPTR,#Z8279
MOV A,#80H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,20H
MOVX @DPTR,A
MOV DPTR,#Z8279
MOV A,#81H
MOVX @DPTR,A
MOV DPTR,#D8279
MOV A,21H
MOVX @DPTR,A
LCALL DELAY
QIUT: RET
SIREN:
PUSH ACC
MOV A,#00H ;读取时间t1,与现在时间比较,
MOV DPTR,#TIMETABLE ;若相等,置报警位,输出报警信号
MOVC A,@A+DPTR ;不等,跳转---比较表中的下一个时间
CJNE A,30H,NEXT1
MOV A,#01H
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,31H,NEXT1
MOV A,#02H
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,32H,NEXT1
MOV R4,#0FFH
SETB P1.0 ;灯1亮2s,灯2灭
POP ACC
RET
NEXT1: ;读取时间t2,与现在时间比较
MOV A,#03H ;若相等,置报警位,输出报警信号
MOV DPTR,#TIMETABLE ;不等,跳转---比较表中的下一个时间
MOVC A,@A+DPTR
CJNE A,30H,NEXT2
MOV A,#04H
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,31H,NEXT2
MOV A,#05H
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,32H,NEXT2
MOV R4,#0FFH
SETB P1.0 ;灯1亮2s,灯2亮
SETB P1.1
POP ACC
RET
NEXT2: ;;读取时间t3,与现在时间比较
MOV A,#06H
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,30H,NEXT3
MOV A,#07H
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,31H,NEXT3
MOV A,#08H
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,32H,NEXT3
MOV R4,#0FFH
SETB P1.0 ;灯1亮2s,灯2灭
CLR P1.1
POP ACC
RET
NEXT3: ;读取时间t4,与现在时间比较
MOV A,#09H ;若相等,置报警位,输出报警信号
MOV DPTR,#TIMETABLE ;不等,跳转---比较表中的下一个时间
MOVC A,@A+DPTR
CJNE A,30H,NEXT4
MOV A,#0AH
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,31H,NEXT4
MOV A,#0BH
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,32H,NEXT4
MOV R4,#0FFH
SETB P1.0 ;灯1亮2s,灯2亮
SETB P1.1
POP ACC
RET
NEXT4: ;;读取时间t3,与现在时间比较
MOV A,#0CH
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,30H,NEXT5
MOV A,#0DH
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,31H,NEXT5
MOV A,#0EH
MOV DPTR,#TIMETABLE
MOVC A,@A+DPTR
CJNE A,32H,NEXT5
MOV R4,#0FFH
SETB P1.0
CLR P1.1 ;灯1亮2s,灯2灭
NEXT5:
POP ACC
RET
INIT8279:
PUSH ACC
PUSH R2
PUSH R1
MOV R1,#20H
MOV R2,#08H
MOV DPTR,#Z8279
MOV A,#LEDWRO
MOVX @DPTR,A
MOV DPTR,#D8279
LOOP33: MOV A,@R1
MOVX @DPTR,A
INC R1
DJNZ R2,LOOP33
POP R1
POP R2
POP ACC
RET
DELAY: PUSH 00H
PUSH 01H
MOV R0,#00H
DELAY1:MOV R1,#00H
DJNZ R1,$
DJNZ R0,DELAY1
POP 01H
POP 00H
RET
TORAM: PUSH ACC
PUSH R3
PUSH R4
MOV A,R7
MOV R3,A
MOV R4,A
MOV A,#0FH
ANL A,R3
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV @R1,A
INC R1
MOV A,#0F0H
ANL A,R4
SWAP A
MOV DPTR,#LEDSEG
MOVC A,@A+DPTR
MOV @R1,A
POP R4
POP R3
POP ACC
RET
;---------------------------------中断服务程序----------
T0INT:
MOV TH0,#4BH
MOV TL0,#0FCH
DJNZ R2,LOOP4
MOV R2,#14H
MOV A,32H ;加一
ADD A,#01H
DA A
MOV 32H,A
CJNE A,#60H,TRANS
MOV 32H,#00H
MOV A,31H
ADD A,#01H
DA A
MOV 31H,A
CJNE A,#60H,TRANS
MOV 31H,#00H
MOV A,30H
ADD A,#01H
DA A
MOV 30H,A
CJNE A,#24H,TRANS
MOV 30H,#00H
TRANS: ;拆分送入20H开始的数据段
MOV R1,#20H
MOV R7,32H
LCALL TORAM
MOV R1,#23H
MOV R7,31H
LCALL TORAM
MOV R1,#26H
MOV R7,30H
LCALL TORAM
;CJNE R6,#00H,LOOP4
LCALL INIT8279 ;显示
CJNE R4,#00H,PPP ;如果无报警,灯灭
CLR P1.0
SJMP LOOP4
PPP: INC R4 ;有报警,r4加一,计时
LOOP4: RETI
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H
TIMETABLE: DB 08H,00H,00H
DB 11H,30H,00H
DB 12H,30H,00H
DB 17H,00H,00H
DB 17H,10H,00H
END
|