日历时钟单片机课程设计附汇编程序+方案图+模块图+ddb模拟图.docx
《日历时钟单片机课程设计附汇编程序+方案图+模块图+ddb模拟图.docx》由会员分享,可在线阅读,更多相关《日历时钟单片机课程设计附汇编程序+方案图+模块图+ddb模拟图.docx(17页珍藏版)》请在冰豆网上搜索。
日历时钟单片机课程设计附汇编程序+方案图+模块图+ddb模拟图
;山东科技大学信电通信07-1lfj作品lifaji@
方案一:
方案二:
采用方案二。
模块图
;-------------------------按键说明-------------------------
;--------------------------1键——进入可调状态-------------------------
;-------------------------2键——结束返回-------------------------
;-------------------------3键——秒加1/日加1-------------------------
;-------------------------4键——分加1/月加1-------------------------
;-------------------------5键——显示24小时制/时加1/年加1-------------------------
;-------------------------6键——显示12小时制-------------------------
;-------------------------7键——可调时间-------------------------
;-------------------------8键——可调日期-------------------------
CLKBITP1.6;时钟信号端
DISPBITP1.7;串出锁存端
DBUFEQU30H;秒的最低位地址
LEDBITP1.1
CHANGE2BIT21H;加12的标志位
AD1EQU40H;秒
AD2EQU41H;分
AD3EQU42H;时
AD4EQU43H;天
AD5EQU44H;月
AD6EQU45H;年
;初始化存储单元结束
ORG0000H
LJMPMAIN
ORG000BH;T0中断入口
LJMPINT
ORG0030H
MAIN:
MOVR0,#AD1
MOVR7,#06H
LOOP0:
MOVA,#00H
MOV@R0,A
INCR0
DJNZR7,LOOP0;R0~R7清零
MOVAD1,#37H
MOVAD2,#22H
MOVAD3,#0CH
MOVAD4,#08H
MOVAD5,#08H
MOVAD6,#08H;初始化时间为12:
34:
56,日期为08年08月08日
MOVIE,#82H;允许T0中断
MOVTMOD,#01H;T0允许工作
MOVTH0,#4CH
MOVTL0,#00H;送入计数初值0.05s
MOVR5,#00H
;初始化结束
SETBTR0;T0使能
LOOP:
LCALLTEST;扫描键盘
CJNEA,#0FEH,NEXTD;0FEH为1键
LCALLDY1MS
LCALLKEYDONE
NEXTD:
SJMPLOOP;扫描键盘看是否需要调整日历
DISPLAY:
LCALLTEST;扫描键盘
CJNEA,#0DFH,ERSHISI1;0DFH为6键
SETBPSW.1;显示十二小时
LJMPTIMEZHUAN
ERSHISI1:
CJNEA,#0EFH,ERSHISI2;0EFH为5键
CLRPSW.1;显示二十四小时
CLRCHANGE2
LJMPTIMEZHUAN
ERSHISI2:
CJNEA,#0CFH,CHANGE;0CFH为5+6键
CLRPSW.1
SETBCHANGE2;CHANGE2=1表示把十二表示法转换成二十四小时
LJMPTIMEZHUAN
CHANGE:
CLRCHANGE2
TIMEZHUAN:
LCALLTEST
CJNEA,#7FH,NEXTL;7FH为8键
SETBPSW.5
LJMPZHUAN1
NEXTL:
CJNEA,#0BFH,ZHUAN1;0BFH为7键
CLRPSW.5
ZHUAN1:
JBPSW.5,DAY;PSW.5=0调整时间,为1则调整日期
MOVA,AD1;调整时间键码分离
MOVB,#0AH
DIVAB
MOVR0,#DBUF
MOV@R0,B
INCR0
MOV@R0,A
MOVA,AD2
MOVB,#0AH
DIVAB
INCR0
MOV@R0,B
INCR0
MOV@R0,A
JBPSW.1,TIMEZHUAN1
LJMPTIMEZHUAN2
TIMEZHUAN1:
;判断时间是否大于12
MOVA,AD3
MOVB,#0CH
SUBBA,B
JCNORMALT
MOVAD3,A
LJMPNORMALT
TIMEZHUAN2:
JNBCHANGE2,NORMALT;判断是否加12
MOVA,AD3
ADDA,#
MOVAD3,A
CLRCHANGE2
NORMALT:
MOVA,AD3
MOVB,#0AH
DIVAB
INCR0
MOV@R0,B
INCR0
MOV@R0,A
SJMPDDISP
DAY:
;调整日期键码分离
MOVA,AD4
MOVB,#0AH
DIVAB
MOVR0,#DBUF
MOV@R0,B
INCR0
MOV@R0,A
MOVA,AD5
MOVB,#0AH
DIVAB
INCR0
MOV@R0,B
INCR0
MOV@R0,A
MOVA,AD6
MOVB,#0AH
DIVAB
INCR0
MOV@R0,B
INCR0
MOV@R0,A
DDISP:
;显示,串入并处的方式,上升沿写入
MOVR0,#DBUF
MOVR7,#06H
LOOP2:
MOVR6,#08H
MOVA,@R0
MOVDPTR,#TAB
MOVCA,@A+DPTR;显示秒
CLRC
LOOP3:
RRCA
CLRCLK
MOVDISP,C
SETBCLK
DJNZR6,LOOP3
INCR0
DJNZR7,LOOP2
RET
KEYDONE:
;人工手动调整日历
AGAINB:
LCALLDY250MS;防抖250ms
LCALLTEST
CJNEA,#7FH,NEXTL1;7FH为8键
SETBPSW.5
LJMPZHUAN12
NEXTL1:
CJNEA,#0BFH,ZHUAN12
CLRPSW.5;以上为扫描键盘并设置PSW.5
ZHUAN12:
JBPSW.5,NEXT6B;判断调整日期还是时间
CJNEA,#0FDH,NEXTA;0FDH为2键,如果按键值为FDH则结束
LJMPBACK
NEXTA:
CJNEA,#0FBH,NEXTB;0FBH为3键
INCAD1;秒加1
MOVA,AD1
CJNEA,#3CH,AGAINA
MOVAD1,#00H
SJMPAGAINA
NEXTB:
CJNEA,#0F7H,NEXTC;0F7H为4键
INCAD2;分加1
MOVA,AD2
CJNEA,#3CH,AGAINA
MOVAD2,#00H
SJMPAGAINA
NEXTC:
CJNEA,#0EFH,AGAINA;0EFH为5键
INCAD3;时加1
MOVA,AD3
CJNEA,#18H,AGAINA
MOVAD3,#00H
NEXTT:
SJMPAGAINA
NEXT6B:
CJNEA,#0FDH,NEXTAB;JIESHUJIAN;0FDH为2键
LJMPBACK
NEXTAB:
CJNEA,#0FBH,NEXTBB;0FBH为3键
INCAD4;日加1
MOVA,AD4
CJNEA,#20H,AGAINA
MOVAD4,#01H
SJMPAGAINA
NEXTBB:
CJNEA,#0F7H,NEXTCB;0F7H为4键
INCAD5;月加1
MOVA,AD5
CJNEA,#0DH,AGAINA
MOVAD5,#01H
SJMPAGAINA
NEXTCB:
CJNEA,#0EFH,AGAINA;0EFH为5键
INCAD6;年加1
MOVA,AD6
CJNEA,#64H,AGAINA
MOVAD6,#00H
AGAINA:
LCALLDISPLAY
LJMPAGAINB
BACK:
RET
INT:
INCR5
CJNER5,#20,NEXTS1;循环20次,每次循环为0.05秒,共0.05*20=1秒
MOVR5,#00H
LCALLDISPLAY;满一秒后的显示
LJMPMEND
NEXTS1:
LJMPNEXTS;满一秒后的显示
MEND:
MOVA,AD1
CJNEA,#0AH,LAREMEND
SETBLED;满十秒关灯,否则继续
LAREMEND:
INCAD1
MOVA,AD1
CJNEA,#3CH,NEXTS2
LJMPMEND1
NEXTS2:
LJMPNEXTS;以上为看是否修改秒,满60,分加一否则跳转继续
MEND1:
MOVAD1,#00H
INCAD2
MOVA,AD2
CJNEA,#3CH,NEXTS3
LJMPMEND2
NEXTS3:
LJMPNEXTS;以上为看是否修改分,满60,时加一否则跳转继续
MEND2:
MOVAD2,#00H
INCAD3
MOVA,AD3
CJNEA,#0Ah,ZAIJIANCHA
AJMPBAOSHI
ZAIJIANCHA:
CJNEA,#0Bh,ZHENGCHANG
BAOSHI:
CLRLED;以上为两个报时开灯
ZHENGCHANG:
MOVA,AD3
CJNEA,#18H,NEXTS4;不满二十四小时跳出
LJMPMEND3;满二十四后跳到清零小时继续加天
NEXTS4:
LJMPNEXTS
MEND3:
MOVAD3,#00H
INCAD4
MOVA,AD5
CJNEA,#02H,JIXUTIAN;判断是否为二月份
MOVA,AD6
MOVB,#4H
DIVAB
MOVA,B
JZRUNNIAN;判断是否为闰年
PINGNIAN:
MOVA,AD4;平年
CJNEA,#1DH,NEXTS
MOVAD4,#01H
AJMPJIXUYUE
RUNNIAN:
MOVA,AD4;闰年
CJNEA,#1EH,NEXTS
MOVAD4,#01H
AJMPJIXUYUE
JIXUTIAN:
;不为二月,再查看是那个月
MOVA,AD5
CJNEA,#01H,PAN1
LJMPSANSHIYI
PAN1:
CJNEA,#03H,PAN3
LJMPSANSHIYI
PAN3:
CJNEA,#04H,PAN4
LJMPSANSHI
PAN4:
CJNEA,#05H,PAN5
LJMPSANSHIYI
PAN5:
CJNEA,#06H,PAN6
LJMPSANSHI
PAN6:
CJNEA,#07H,PAN7
LJMPSANSHIYI
PAN7:
CJNEA,#08H,PAN8
LJMPSANSHIYI
PAN8:
CJNEA,#09H,PAN9
LJMPSANSHI
PAN9:
CJNEA,#10H,PAN10
LJMPSANSHIYI
PAN10:
CJNEA,#11H,SANSHIYI
LJMPSANSHI
SANSHIYI:
MOVA,AD4;月份:
1,3,5,7,8,10,12
CJNEA,#20H,NEXTS
MOVAD4,#01H
AJMPJIXUYUE
SANSHI:
MOVA,AD4;月份:
2,4,6,8,11
CJNEA,#1FH,NEXTS
MOVAD4,#01H
JIXUYUE:
INCAD5;满月后加年
CJNEA,#0DH,NEXTS
MOVAD5,#01H
INCAD6
MOVA,AD6
CJNEA,#64H,NEXTS;年满100后清零
MOVAD6,#00H
NEXTS:
;再赋初值
MOVTH0,#4CH
MOVTL0,#00H
RETI
DY250MS:
;延迟防抖250ms
MOVR4,#0FAH
LOOP8:
LCALLDY1MS
DJNZR4,LOOP8
RET
DY1MS:
;延迟防抖1ms
MOVR5,#0B0H
LOOP7:
MOVR7,#2AH
DJNZR7,$
DJNZR5,LOOP7
RET
;键盘扫描子程序
TEST:
MOVR7,#08H
SETBP1.7
CLRP1.7;低电平锁存
NOP
NOP
SETBP1.7;高电平输出
MOVA,#0FFH
AGAIN3:
CLRP2.3
NOP
NOP
MOVC,P3.5;把p3.5的状态存入C
SETBP2.3
RLCA;键盘状态存入A
DJNZR7,AGAIN3;扫描八个按键
RET
TAB:
DB88H,0EBH,4CH,49H,2BH,19H,18H,0CBH,08H,09H
;子程序功能索引:
;TEST——扫描键盘
;DDISP——显示
;NEXTS——重新赋初值
;DY1MS——延迟防抖1ms
END