资源描述
;山东科技大学 信电 通信07-1 lfj 作品
方案一:
方案二:
采用方案二。
模块图
; ------------------------- 按键说明 -------------------------
;--------------------------1键——进入可调状态 -------------------------
; -------------------------2键——结束返回 -------------------------
; -------------------------3键——秒加1/日加1 -------------------------
; -------------------------4键——分加1/月加1 -------------------------
; -------------------------5键——显示24小时制/时加1/年加1-------------------------
; -------------------------6键——显示12小时制 -------------------------
; -------------------------7键——可调时间 -------------------------
; -------------------------8键——可调日期 -------------------------
CLK BIT P1.6 ;时钟信号端
DISP BIT P1.7 ;串出锁存端
DBUF EQU 30H ;秒的最低位地址
LED BIT P1.1
CHANGE2 BIT 21H ;加12的标志位
AD1 EQU 40H ;秒
AD2 EQU 41H ;分
AD3 EQU 42H ;时
AD4 EQU 43H ;天
AD5 EQU 44H ;月
AD6 EQU 45H ;年
; 初始化存储单元结束
ORG 0000H
LJMP MAIN
ORG 000BH ;T0中断入口
LJMP INT
ORG 0030H
MAIN: MOV R0,#AD1
MOV R7,#06H
LOOP0: MOV A,#00H
MOV @R0,A
INC R0
DJNZ R7,LOOP0 ;R0~R7清零
MOV AD1,#37H
MOV AD2,#22H
MOV AD3,#0CH
MOV AD4,#08H
MOV AD5,#08H
MOV AD6,#08H ;初始化时间为12: 34: 56, 日期为 08月08日
MOV IE,#82H ;允许T0中断
MOV TMOD,#01H ;T0允许工作
MOV TH0,#4CH
MOV TL0,#00H ;送入计数初值0.05s
MOV R5,#00H
;初始化结束
SETB TR0 ;T0使能
LOOP: LCALL TEST ;扫描键盘
CJNE A,#0FEH,NEXTD ;0FEH为1键
LCALL DY1MS
LCALL KEYDONE
NEXTD: SJMP LOOP ;扫描键盘看是否需要调整日历
DISPLAY: LCALL TEST ;扫描键盘
CJNE A,#0DFH,ERSHISI1 ;0DFH为6键
SETB PSW.1 ;显示十二小时
LJMP TIMEZHUAN
ERSHISI1:CJNE A,#0EFH,ERSHISI2 ;0EFH为5键
CLR PSW.1 ;显示二十四小时
CLR CHANGE2
LJMP TIMEZHUAN
ERSHISI2:CJNE A,#0CFH,CHANGE ;0CFH为5+6键
CLR PSW.1
SETB CHANGE2 ;CHANGE2=1表示把十二表示法转换成二十四小时
LJMP TIMEZHUAN
CHANGE: CLR CHANGE2
TIMEZHUAN:
LCALL TEST
CJNE A,#7FH,NEXTL ;7FH为8键
SETB PSW.5
LJMP ZHUAN1
NEXTL: CJNE A,#0BFH,ZHUAN1 ;0BFH为7键
CLR PSW.5
ZHUAN1: JB PSW.5,DAY ;PSW.5=0 调整时间, 为1则调整日期
MOV A,AD1 ;调整时间 键码分离
MOV B,#0AH
DIV AB
MOV R0,#DBUF
MOV @R0,B
INC R0
MOV @R0,A
MOV A,AD2
MOV B,#0AH
DIV AB
INC R0
MOV @R0,B
INC R0
MOV @R0,A
JB PSW.1,TIMEZHUAN1
LJMP TIMEZHUAN2
TIMEZHUAN1: ;判断时间是否大于12
MOV A,AD3
MOV B,#0CH
SUBB A,B
JC NORMALT
MOV AD3,A
LJMP NORMALT
TIMEZHUAN2:
JNB CHANGE2,NORMALT ;判断是否加12
MOV A,AD3
ADD A,#
MOV AD3,A
CLR CHANGE2
NORMALT: MOV A,AD3
MOV B,#0AH
DIV AB
INC R0
MOV @R0,B
INC R0
MOV @R0,A
SJMP DDISP
DAY: ;调整日期 键码分离
MOV A,AD4
MOV B,#0AH
DIV AB
MOV R0,#DBUF
MOV @R0,B
INC R0
MOV @R0,A
MOV A,AD5
MOV B,#0AH
DIV AB
INC R0
MOV @R0,B
INC R0
MOV @R0,A
MOV A,AD6
MOV B,#0AH
DIV AB
INC R0
MOV @R0,B
INC R0
MOV @R0,A
DDISP: ;显示, 串入并处的方式, 上升沿写入
MOV R0,#DBUF
MOV R7,#06H
LOOP2:
MOV R6,#08H
MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR ;显示秒
CLR C
LOOP3:
RRC A
CLR CLK
MOV DISP,C
SETB CLK
DJNZ R6,LOOP3
INC R0
DJNZ R7,LOOP2
RET
KEYDONE: ;人工手动调整日历
AGAINB: LCALL DY250MS ;防抖250ms
LCALL TEST
CJNE A,#7FH,NEXTL1 ;7FH为8键
SETB PSW.5
LJMP ZHUAN12
NEXTL1:
CJNE A,#0BFH,ZHUAN12
CLR PSW.5 ;以上为扫描键盘并设置PSW.5
ZHUAN12:
JB PSW.5,NEXT6B ;判断调整日期还是时间
CJNE A,#0FDH,NEXTA ;0FDH为2键,如果按键值为FDH则结束
LJMP BACK
NEXTA: CJNE A,#0FBH,NEXTB ;0FBH为3键
INC AD1 ;秒加1
MOV A,AD1
CJNE A,#3CH,AGAINA
MOV AD1,#00H
SJMP AGAINA
NEXTB: CJNE A,#0F7H,NEXTC ;0F7H为4键
INC AD2 ;分加1
MOV A,AD2
CJNE A,#3CH,AGAINA
MOV AD2,#00H
SJMP AGAINA
NEXTC: CJNE A,#0EFH,AGAINA ;0EFH为5键
INC AD3 ;时加1
MOV A,AD3
CJNE A,#18H,AGAINA
MOV AD3,#00H
NEXTT: SJMP AGAINA
NEXT6B:
CJNE A,#0FDH,NEXTAB;JIESHUJIAN ;0FDH为2键
LJMP BACK
NEXTAB: CJNE A,#0FBH,NEXTBB ;0FBH为3键
INC AD4 ;日加1
MOV A,AD4
CJNE A,#20H,AGAINA
MOV AD4,#01H
SJMP AGAINA
NEXTBB: CJNE A,#0F7H,NEXTCB ;0F7H为4键
INC AD5 ;月加1
MOV A,AD5
CJNE A,#0DH,AGAINA
MOV AD5,#01H
SJMP AGAINA
NEXTCB: CJNE A,#0EFH,AGAINA ;0EFH为5键
INC AD6 ;年加1
MOV A,AD6
CJNE A,#64H,AGAINA
MOV AD6,#00H
AGAINA: LCALL DISPLAY
LJMP AGAINB
BACK: RET
INT: INC R5
CJNE R5,#20,NEXTS1 ;循环20次, 每次循环为0.05秒, 共0.05*20=1秒
MOV R5,#00H
LCALL DISPLAY ;满一秒后的显示
LJMP MEND
NEXTS1: LJMP NEXTS ;满一秒后的显示
MEND: MOV A,AD1
CJNE A,#0AH,LAREMEND
SETB LED ;满十秒关灯, 否则继续
LAREMEND:
INC AD1
MOV A,AD1
CJNE A,#3CH, NEXTS2
LJMP MEND1
NEXTS2: LJMP NEXTS ;以上为看是否修改秒, 满60, 分加一否则跳转继续
MEND1: MOV AD1,#00H
INC AD2
MOV A,AD2
CJNE A,#3CH,NEXTS3
LJMP MEND2
NEXTS3: LJMP NEXTS ;以上为看是否修改分, 满60, 时加一否则跳转继续
MEND2: MOV AD2,#00H
INC AD3
MOV A,AD3
CJNE A,#0Ah,ZAIJIANCHA
AJMP BAOSHI
ZAIJIANCHA:
CJNE A,#0Bh,ZHENGCHANG
BAOSHI: CLR LED ;以上为两个报时开灯
ZHENGCHANG:
MOV A,AD3
CJNE A,#18H,NEXTS4 ;不满二十四小时跳出
LJMP MEND3 ;满二十四后跳到清零小时继续加天
NEXTS4: LJMP NEXTS
MEND3: MOV AD3,#00H
INC AD4
MOV A,AD5
CJNE A,#02H,JIXUTIAN ;判断是否为二月份
MOV A,AD6
MOV B,#4H
DIV AB
MOV A,B
JZ RUNNIAN ;判断是否为闰年
PINGNIAN:
MOV A,AD4 ;平年
CJNE A,#1DH,NEXTS
MOV AD4,#01H
AJMP JIXUYUE
RUNNIAN: MOV A,AD4 ; 闰年
CJNE A,#1EH,NEXTS
MOV AD4,#01H
AJMP JIXUYUE
JIXUTIAN: ; 不为二月, 再查看是那个月
MOV A,AD5
CJNE A,#01H,PAN1
LJMP SANSHIYI
PAN1: CJNE A,#03H,PAN3
LJMP SANSHIYI
PAN3: CJNE A,#04H,PAN4
LJMP SANSHI
PAN4: CJNE A,#05H,PAN5
LJMP SANSHIYI
PAN5: CJNE A,#06H,PAN6
LJMP SANSHI
PAN6: CJNE A,#07H,PAN7
LJMP SANSHIYI
PAN7: CJNE A,#08H,PAN8
LJMP SANSHIYI
PAN8: CJNE A,#09H,PAN9
LJMP SANSHI
PAN9 : CJNE A,#10H,PAN10
LJMP SANSHIYI
PAN10: CJNE A,#11H,SANSHIYI
LJMP SANSHI
SANSHIYI:
MOV A,AD4 ;月份: 1, 3, 5, 7, 8, 10, 12
CJNE A,#20H,NEXTS
MOV AD4,#01H
AJMP JIXUYUE
SANSHI: MOV A,AD4 ; 月份: 2, 4, 6, 8, 11
CJNE A,#1FH,NEXTS
MOV AD4,#01H
JIXUYUE: INC AD5 ; 满月后加年
CJNE A,#0DH,NEXTS
MOV AD5,#01H
INC AD6
MOV A,AD6
CJNE A,#64H,NEXTS ; 年满100后清零
MOV AD6,#00H
NEXTS: ;再赋初值
MOV TH0,#4CH
MOV TL0,#00H
RETI
DY250MS: ; 延迟防抖250ms
MOV R4,#0FAH
LOOP8: LCALL DY1MS
DJNZ R4,LOOP8
RET
DY1MS: ; 延迟防抖1ms
MOV R5,#0B0H
LOOP7: MOV R7,#2AH
DJNZ R7,$
DJNZ R5,LOOP7
RET
;键盘扫描子程序
TEST: MOV R7,#08H
SETB P1.7
CLR P1.7 ;低电平锁存
NOP
NOP
SETB P1.7 ;高电平输出
MOV A,#0FFH
AGAIN3: CLR P2.3
NOP
NOP
MOV C, P3.5 ;把p3.5的状态存入C
SETB P2.3
RLC A ;键盘状态存入A
DJNZ R7,AGAIN3 ;扫描八个按键
RET
TAB:
DB 88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H
;子程序功能索引:
;TEST——扫描键盘
;DDISP——显示
;NEXTS——重新赋初值
;DY1MS——延迟防抖1ms
END
展开阅读全文