基于8255单片机的电子钟程序.doc_第1页
基于8255单片机的电子钟程序.doc_第2页
基于8255单片机的电子钟程序.doc_第3页
基于8255单片机的电子钟程序.doc_第4页
基于8255单片机的电子钟程序.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

关于8255单片机的程序设计;变量声明区SECOND EQU 30H ;秒MINUTE EQU 31H ;分HOUR EQU 32H ;时DAY EQU 33H ;日MONTH EQU 34H ;月YEAR_L EQU 35H ;年低位YEAR_H EQU 36H ;年高位DISPBUF EQU 37H ;显示缓冲区(6字节)DISPBIT EQU 3DH ;位选偏移量FLAG EQU 3EH ;标记(0表示在主界面,1-6分别代表显示时、分、秒、年、月、日,0为一般显示(当前位置为主界面),7为显示日期,8为显示闹铃开关,9、10显示闹铃时和分,11表示不做缓冲处理)KEY EQU 3FH ;按键值CLOSE_BIT EQU 40H ;显示屏蔽(和位选相与后送P2)A1_MINUTE EQU 41H ;闹铃1 分钟A1_HOUR EQU 42H ;闹铃1 小时A1_SWITCH EQU 43H ;闹铃1 开关A2_MINUTE EQU 44H ;闹铃2 分钟A2_HOUR EQU 45H ;闹铃2 小时A2_SWITCH EQU 46H ;闹铃2 开关A3_MINUTE EQU 47H ;闹铃3 分钟A3_HOUR EQU 48H ;闹铃3 小时A3_SWITCH EQU 49H ;闹铃3 开关FLAG_KEEP EQU 4AH ;闹钟持续鸣叫标志(1开启,0关闭)FLAG_ALARM EQU 4BH ;闹钟响标志(为1蜂鸣器响,为0蜂鸣器不响)FLAG_NUM EQU 4CH ;当前闹钟标志(1-3个闹钟)FLAG_MOVING EQU 4DH ;流水显示初始化标志(0未初始化 1已经初始化)COUNT EQU 4EH ;T0中断次数(T0内部使用)COUNT_1S EQU 4FH ;计数1S(满N秒后执行程序)FLAG_1S EQU 50H ;满1秒取反标志(1秒执行程序1,另一秒执行程序2)FLAG_ADD EQU 51H ;时间设置标记(1代表FLAG对应的时段加1)FLAG_CLOSE EQU 52H ;闪烁显示标记(为0不闪烁)DATE_STYLE EQU 53H ;日期显示模式标志(为1跳变切换显示,为2流水显示,为3下滑切换显示)CLOSE_BIT_TEMP EQU 54H ;屏蔽位暂存(流水显示模式)CLOSE_BIT_CODE EQU 55H ;段选屏蔽位(和段选相与后送P0)KEY_TEMP EQU 56H ;临时按键值(串口发送内容)COUNT_50MS EQU 57H ;50毫秒计数TEMP_R0 EQU 58H ;保护R0TEMP_R1 EQU 59H ;保护R1TEMP_R2 EQU 5AH ;保护R2FLAG_DOWN_S EQU 5BH ;下移显示阶段标志(每0.2s加1;0无显示,1、2移入显示,3-17正常,18、19移出显示)MOVING_DISPBUF EQU 5CH ;临时缓冲区(流水显示模式);-;主程序ORG 00HSJMP STARTORG 0BHLJMP INT_T0ORG 13HAJMP INT_1ORG 30HSTART: ;初始化MOV SECOND,#00MOV MINUTE,#42MOV HOUR,#02MOV DAY,#09MOV MONTH,#12MOV YEAR_L,#09MOV YEAR_H,#20MOV A1_SWITCH,#00HMOV A1_MINUTE,#22MOV A1_HOUR,#12MOV A2_SWITCH,#00HMOV A2_MINUTE,#00HMOV A2_HOUR,#00HMOV A3_SWITCH,#00HMOV A3_MINUTE,#00HMOV A3_HOUR,#00HMOV DISPBIT,#00HMOV FLAG_KEEP,00HMOV P3,#0FH ;键盘进入监控输入状态MOV R7,#00H ;整点报时鸣铃次数清0SETB P2.0 ;关蜂鸣器MOV FLAG_CLOSE,#00HMOV FLAG,#0BHMOV FLAG_ADD,#00HMOV FLAG_1S,#01HMOV COUNT,#00HMOV KEY,#00HSETB PT0 ;计数器中断优先级高CLR PX1 ;外部中断1优先级低MOV TMOD,#21H ;T0为定时器方式1,T1为方式2SETB TR0 ;T0开始计数MOV TL1,#0F3H ;T1初始化MOV TH1,#0F3H ;T1重置初值SETB TR1 ;T1开始计数MOV SCON,#50H ;串口工作方式1,允许接收MOV PCON,#80H ;SMOD=1MOV IE,#10000110B ;开总中断,开T0,外部中断1CLR IT1 ;外部中断1触发方式为电平触发;-;基本功能模块,按1显示012345,按2显示ABCDEF,按4进入电子时钟界面MOV CLOSE_BIT_CODE,#00HMOV FLAG_1S,#01HMAIN0:ACALL DISPLAYMOV A,KEY ;取键值CJNE A,#01H,MAIN0_J0 ;判断键值MOV KEY,#00H ;主菜单下KEY=1,显示012345SHOW_012345_START: ;显示初始化MOV CLOSE_BIT_CODE,#0FFH ;无段选屏蔽MOV CLOSE_BIT,#81H ;屏蔽所有位选ACALL BUF_012345 ;显示缓冲区缓存012345SHOW_012345:MOV A,FLAG_1S ;取1S取反标志CJNE A,#01H,SHOW_012345_J0CPL A ;1S已经到(FLAG_1S=1)INC AMOV FLAG_1S,A ;1S取反标志取反,等待下一秒SETB CMOV A,CLOSE_BITRLC AMOV CLOSE_BIT,A ;已到1S,依次开位选SHOW_012345_J0: ;1S未到(FLAG_1S=0),继续显示ACALL DISPLAYMOV A,KEY ;取键值CJNE A,#02H,SHOW_012345_J1MOV KEY,#00HSJMP SHOW_ABCDEF_START ;子功能1下KEY=2,转至显示ABCDEFSHOW_012345_J1:CJNE A,#04H,SHOW_012345 ;子功能1下KEY不为2和4,循环MOV KEY,#00HSJMP MAIN1_START ;子功能1下KEY=4,转入时钟模块MAIN0_J0:CJNE A,#02H,MAIN0_J1MOV KEY,#00H ;主菜单下KEY=2,显示ABCDEFSHOW_ABCDEF_START: ;显示初始化MOV CLOSE_BIT_CODE,#00H ;屏蔽所有段选MOV CLOSE_BIT,#0FFH ;无位选屏蔽ACALL BUF_ABCDEF ;显示缓冲区缓存ABCDEFSHOW_ABCDEF:MOV A,FLAG_1S ;取1S取反标志CJNE A,#01H,SHOW_ABCDEF_J0CPL A ;1S已经到(FLAG_1S=1)INC AMOV FLAG_1S,A ;1S取反标志取反,等待下一秒SETB CMOV A,CLOSE_BIT_CODERLC AMOV CLOSE_BIT_CODE,A ;已到1S,依次开段选SHOW_ABCDEF_J0: ;1S未到(FLAG_1S=0),继续显示ACALL DISPLAYMOV A,KEY ;取键值CJNE A,#01H,SHOW_ABCDEF_J1MOV KEY,#00HSJMP SHOW_012345_START ;子功能2下KEY=1,转至显示012345SHOW_ABCDEF_J1:CJNE A,#04H,SHOW_ABCDEF ;子功能2下KEY不为1和4,循环MOV KEY,#00HSJMP MAIN1_START ;子功能2下KEY=4,转入时钟模块MAIN0_J1:CJNE A,#04H,MAIN0MOV KEY,#00H ;主菜单下KEY=4,转入时钟模块SJMP MAIN1_START;-;缓存012345BUF_012345:MOV A,#DISPBUFADD A,#5MOV R0,AMOV R1,#6MOV A,#0BUF_012345_LOOP:MOV R0,ADEC R0INC ADJNZ R1,BUF_012345_LOOPRET;-;缓存ABCDEFBUF_ABCDEF:MOV A,#DISPBUFADD A,#5MOV R0,AMOV R1,#6MOV A,#0AHBUF_ABCDEF_LOOP:MOV R0,ADEC R0INC ADJNZ R1,BUF_ABCDEF_LOOPRET;-;功能模块2,电子时钟MAIN1_START:MOV FLAG,#00HMOV CLOSE_BIT_CODE,#0FFHMOV CLOSE_BIT,#0FFHMOV FLAG_CLOSE,#00HMOV FLAG_DOWN_S,#0FFHMAIN1:LCALL ALARMLCALL ALARM_TIMELCALL BUF_TIMELCALL DISPLAYMOV A,KEY ;读键值CJNE A,#01H,MAIN1_NOT_KEY1 ;KEY=1,转入功能1,否则继续判断MOV KEY,#00HSJMP FUN1_STARTMAIN1_NOT_KEY1:MOV A,KEYCJNE A,#02H,MAIN1_NOT_KEY2 ;KEY=2,转入功能2,否则继续判断MOV KEY,#00HSJMP FUN2_STARTMAIN1_NOT_KEY2:MOV A,KEYCJNE A,#03H,MAIN1_NOT_KEY3 ;KEY=3,转入功能3,否则继续判断MOV KEY,#00HAJMP FUN3_STARTMAIN1_NOT_KEY3:MOV A,KEYCJNE A,#04H,MAIN1_NOT_KEY4 ;KEY=4,转入功能4,否则停留在当前界面MOV KEY,#00HAJMP FUN4_STARTMAIN1_NOT_KEY4:SJMP MAIN1;-;功能1界面:显示日期(YYMMDD),按1键退出FUN1_START:MOV FLAG,#07H ;FLAG=7,显示YYMMDDFUN1:LCALL BUF_TIME ;缓冲处理LCALL DISPLAY ;执行显示MOV A,KEY ;读键值CJNE A,#01H,FUN1_EXIT ;KEY=1,返回主菜单,否则停留在当前界面MOV KEY,#00HMOV FLAG,#00HSJMP MAIN1_STARTFUN1_EXIT:SJMP FUN1;-;功能2界面:时间、日期动态切换,按1键切换模式(模式1显示时间-年-月日;模式2流水显示),按2键退出FUN2_START: ;初始化,默认进入模式1MOV FLAG,#00HMOV FLAG_ADD,#00HMOV FLAG_CLOSE,#00HMOV DATE_STYLE,#01HMOV FLAG_MOVING,#00HMOV COUNT_1S,#06HMOV COUNT_50MS,#00HMOV FLAG_DOWN_S,#0FFHMOV FLAG_1S,#01HFUN2:MOV A,DATE_STYLE ;读显示模式标志CJNE A,#01H,FUN2_STYLE2 ;DATE_STYLE=01H,模式1处理,否则继续判断MOV FLAG_MOVING,#00H ;流水显示初始化标志置0LCALL FUN2_DATE_STYLE1 ;调用模式1显示函数SJMP FUN2_KEYFUN2_STYLE2:CJNE A,#02H,FUN2_STYLE3 ;DATE_STYLE=02H,模式2处理,进入模式3处理LCALL FUN2_DATE_STYLE2SJMP FUN2_KEYFUN2_STYLE3:MOV FLAG_MOVING,#00H ;流水显示初始化标志置0LCALL FUN2_DATE_STYLE3 ;调用模式3处理FUN2_KEY:MOV A,KEY ;取键值CJNE A,#02H,FUN2_J0 ;KEY=2,返回主菜单,否则继续判断MOV KEY,#00HAJMP MAIN1_STARTFUN2_J0:CJNE A,#01H,FUN2_J1 ;KEY=1切换显示模式,否则停留在主界面MOV KEY,#00H ;切换显示模式后标志初始化处理WAIT_TIME:MOV P0,#00HMOV A,COUNTCJNE A,#00H,WAIT_TIME ;切换显示后等待COUNT类标志同步计时开始MOV FLAG_1S,#01HMOV COUNT_1S,#06HMOV COUNT_50MS,#00HMOV FLAG,#02HMOV FLAG_DOWN_S,#0FFHINC DATE_STYLEMOV A,DATE_STYLECJNE A,#04H,FUN2_J1MOV DATE_STYLE,#01H ;DATE_STYLE复位FUN2_J1:SJMP FUN2;-;界面子函数1:日期显示动态显示模式1处理FUN2_DATE_STYLE1:MOV A,COUNT_1SCLR CSUBB A,#06HJC FUN2_DATE_STYLE1_J0 ;COUNT_1S=6,刚进入模式1显示,默认显示时分秒,否则跳过MOV COUNT_1S,#00HFUN2_DATE_STYLE1_J0:MOV A,COUNT_1S ;取COUNT_1SCJNE A,#00H,FUN2_DATE_STYLE1_J1 ;COUNT_1S=00H,时间显示(4秒),否则继续判断MOV FLAG,#01H ;FLAG为1或者2、3,显示时分秒SJMP FUN2_DATE_STYLE1_EXITFUN2_DATE_STYLE1_J1:CJNE A,#04H,FUN2_DATE_STYLE1_J2 ;COUNT_1S=04H,年显示(1秒),否则继续判断MOV FLAG,#04H ;标志为4,显示年份SJMP FUN2_DATE_STYLE1_EXITFUN2_DATE_STYLE1_J2:CJNE A,#05H,FUN2_DATE_STYLE1_EXIT ;COUNT_1S=5,月份天数显示(1秒),否则返回MOV FLAG,#05H ;标志为5或6,显示月份天数FUN2_DATE_STYLE1_EXIT:LCALL BUF_TIME ;显示缓冲区准备LCALL DISPLAY ;显示缓冲区内容RET;-;界面子函数2:日期显示动态显示模式2处理FUN2_DATE_STYLE2:MOV A,COUNT_1SCLR CSUBB A,#6JNC FUN2_DATE_STYLE2_MOVING ;COUNT_1S=6,流水显示MOV A,FLAG_1SCJNE A,#01H,FUN2_DATE_STYLE2_J0;FLAG_1s=1,1S到,更新缓冲区,否则跳过CPL A ;每隔1秒更新缓冲区(FLAG_1S=01H执行)INC AMOV FLAG_1S,A ;反转FLAG_1S,等待下一秒再调用MOV FLAG,#0BH ;按键中断程序无需处理缓冲区ACALL BUF_TEMPBUF ;临时缓冲区处理ACALL BUF_TEMPBUF_TO_DISPBUF ;流水显示缓冲区处理FUN2_DATE_STYLE2_J0:ACALL DISPLAY ;执行显示RET;-;界面子函数3:日期显示动态显示模式3处理FUN2_DATE_STYLE3:MOV A,COUNT_1SCLR CSUBB A,#4JC FUN2_DATE_STYLE3_NEXT ;COUNT_1S=4秒复位MOV COUNT_1S,#00H ;COUNT_1S复位,等待下一个4sMOV FLAG_DOWN_S,#00H ;准备进入下滑显示第一阶段MOV COUNT_50MS,#00HINC FLAGINC FLAG ;每4s切换显示信息(年-月日-时间)MOV A,FLAGCJNE A,#8,FUN2_DATE_STYLE3_NEXT ;FLAG复位处理MOV FLAG,#02HFUN2_DATE_STYLE3_NEXT:MOV A,COUNT_50MSCJNE A,#04H,FUN2_DATE_STYLE3_EXIT ;每0.2s下移状态标志+1,否则跳过MOV COUNT_50MS,#00H ;COUNT_50MS=0,等待下一0.2sINC FLAG_DOWN_SFUN2_DATE_STYLE3_EXIT:LCALL BUF_TIME ;缓冲LCALL DISPLAY ;显示RET;-;功能3界面:设置时间、日期,按1所选时段加1,按2切换时段(时-分-秒-年-月-日),按3返回主界面FUN3_START: ;初始化MOV FLAG,#01H ;默认显示时间(小时段闪烁)MOV FLAG_CLOSE,#01H ;开闪烁MOV FLAG_ADD,#00HMOV KEY,#00HMOV COUNT_50MS,#00HFUN3:LCALL BUF_TIMELCALL DISPLAYMOV A,KEY ;取键值CJNE A,#02H,FUN3_NOT_KEY1 ;KEY=2,切换时段,否则继续判断MOV KEY,#00HINC FLAG ;标志+1MOV A,FLAGCJNE A,#07H,FUN3_J0 ;时段标志过6后赋1MOV FLAG,#01HFUN3_J0:SJMP FUN3FUN3_NOT_KEY1:CJNE A,#01H,FUN3_NOT_KEY2 ;KEY=1,调时间(加1方式),否则继续判断MOV KEY,#00HMOV FLAG_ADD,#01H ;时段进位标志=1ACALL FORMAT_TIME ;调用格式调整函数,更新数据SJMP FUN3FUN3_NOT_KEY2:CJNE A,#03H,FUN3_NOT_KEY3 ;KEY=3,返回主界面,否则继续判断MOV KEY,#00HMOV FLAG,#00HAJMP MAIN1_STARTFUN3_NOT_KEY3:CJNE A,#04H,FUN3 ;KEY=4,调时间(减1方式),否则停留在当前界面MOV KEY,#00HMOV FLAG_ADD,#0FFH ;时段进位标志=-1的补码ACALL FORMAT_TIME ;调用格式调整函数,更新数据SJMP FUN3;-;功能4界面:设置闹铃,按1设置,按2切换指向开关状态、小时、分钟,按3切换闹铃,按4返回主菜单FUN4_START: ;初始化MOV FLAG,#08H ;默认显示开关状态MOV FLAG_NUM,#01H ;默认显示第一个闹钟MOV FLAG_CLOSE,#01H ;开闪烁MOV KEY,#00HFUN4:ACALL BUF_ALARM ;缓存闹铃数据ACALL DISPLAY ;执行显示FUN4_J0:MOV A,KEY ;读键值CJNE A,#02H,FUN4_J1 ;KEY=2,切换闹铃开关、小时、分钟,否则继续判断MOV KEY,#00HINC FLAG ;时段标志+1MOV A,FLAGCJNE A,#0BH,FUN4_J0_J0 ;时段标志过10后赋8(8为闹铃开关,9为闹铃小时,10为分钟)MOV FLAG,#08HFUN4_J0_J0:SJMP FUN4FUN4_J1:CJNE A,#01H,FUN4_J2 ;KEY=1,调闹铃,否则继续判断MOV KEY,#00HINC FLAG_ADD ;调整标志+1ACALL FORMAT_ALARM ;调用处理程序SJMP FUN4FUN4_J2:CJNE A,#03H,FUN4_J3 ;KEY=3,切换闹钟,否则继续判断MOV KEY,#00HINC FLAG_NUM ;闹铃号+1MOV A,FLAG_NUMCJNE A,#04H,FUN4_J2_J0 ;闹铃号满4后置1MOV FLAG_NUM,#01HFUN4_J2_J0:MOV FLAG,#08H ;切换闹铃后FLAG=8,显示当前闹钟状态SJMP FUN4FUN4_J3:CJNE A,#04H,FUN4_CONTINUE ;KEY=4,返回主菜单,否则停留当前界面MOV KEY,#00HMOV FLAG,#00HAJMP MAIN1_STARTFUN4_CONTINUE:SJMP FUN4;-;数据处理函数1:时间数据处理,FLAG_ADD为1时为自增调整时间,0FFH时为自减调整时间,0时为自动计时FORMAT_TIME:MOV A,FLAG_ADD ;取时间设置标志CJNE A,#00H,FORMAT_TIME_ADD_REFORM ;FLAG_ADD=0,否则进入时钟模式格式调整,否则进入设置模式格式调整(无进位)AJMP FORMAT_TIME_SECOND_REFORMFORMAT_TIME_ADD_REFORM:MOV A,FLAG ;取时段标志CJNE A,#01H,FORMAT_TIME_NOT_HOUR ;FLAG=1,当前时段为小时,否则继续判断MOV A,FLAG_ADDADD A,HOURCJNE A,#0FFH,FORMAT_TIME_NO_RESET_J0 ;小时减时复位处理MOV A,#23FORMAT_TIME_NO_RESET_J0:MOV HOUR,A ;小时设置CLR CSUBB A,#24JC FORMAT_TIME_J0 ;小时增时复位处理MOV HOUR,#00HFORMAT_TIME_J0:AJMP FORMAT_TIME_DONE ;调整完毕,返回FORMAT_TIME_NOT_HOUR:CJNE A,#02H,FORMAT_TIME_NOT_MINUTE ;FLAG=2当前时段为分钟,否则继续判断MOV A,FLAG_ADDADD A,MINUTE ;分钟设置CJNE A,#0FFH,FORMAT_TIME_NO_RESET_J1 ;分钟减时复位处理MOV A,#59FORMAT_TIME_NO_RESET_J1:MOV MINUTE,ACLR CSUBB A,#60JC FORMAT_TIME_J1 ;分钟增时复位处理MOV MINUTE,#00HFORMAT_TIME_J1:AJMP FORMAT_TIME_DONE ;调整完毕,返回FORMAT_TIME_NOT_MINUTE:CJNE A,#03H,FORMAT_TIME_NOT_SECOND ;FLAG=3,当前时段为秒,否则继续判断MOV A,FLAG_ADDADD A,SECOND ;秒设置CJNE A,#0FFH,FORMAT_TIME_NO_RESET_J2 ;分钟减时复位处理MOV A,#59FORMAT_TIME_NO_RESET_J2:MOV SECOND,ACLR ET0 ;关计数器中断MOV TL0,#0B8HMOV TH0,#3CH ;重置计数值MOV COUNT,#00HSETB ET0 ;开计数器中断,设置秒后重新计秒CLR CSUBB A,#60JC FORMAT_TIME_J2 ;秒增时复位处理MOV SECOND,#00HFORMAT_TIME_J2:AJMP FORMAT_TIME_DONEFORMAT_TIME_NOT_SECOND:CJNE A,#04H,FORMAT_TIME_NOT_YEAR ;FLAG=4,当前时段为年,否则继续判断MOV A,FLAG_ADDADD A,YEAR_LCJNE A,#0FFH,FORMAT_TIME_NO_RESET_J3 ;年份减时复位设置MOV A,#99DEC YEAR_H ;年高位借1FORMAT_TIME_NO_RESET_J3:MOV YEAR_L,AMOV A,YEAR_HCJNE A,#0FFH,FORMAT_TIME_YEAR_REFORM ;年高位减时复位设置MOV YEAR_H,#99SJMP FORMAT_TIME_YEAR_REFORM ;跳至时钟模式下的年复位调整FORMAT_TIME_NOT_YEAR:CJNE A,#05H,FORMAT_TIME_NOT_MONTH ;FLAG=5,当前时段为月,否则继续判断MOV A,FLAG_ADDADD A,MONTH ;月份设置CJNE A,#00H,FORMAT_TIME_NO_RESET_J4 ;月份减时复位设置MOV A,#12FORMAT_TIME_NO_RESET_J4:MOV MONTH,AACALL FORMAT_YEAR ;调用闰年判断函数,月份改变后天数的复位处理MOV A,MONTHCLR CSUBB A,#13JC FORMAT_TIME_DONE ;月份增时复位处理MOV MONTH,#01HSJMP FORMAT_TIME_DONEFORMAT_TIME_NOT_MONTH: ;FLAG=6,当前时段为天数MOV A,FLAG_ADDADD A,DAYMOV DAY,AACALL FORMAT_YEAR ;调用闰年判断函数,处理了天数调整SJMP FORMAT_TIME_DONEFORMAT_TIME_SECOND_REFORM:MOV A,SECOND ;由最小位秒位开始调整CJNE A,#60,FORMAT_TIME_DONE ;分无进位,调整结束MOV SECOND,#00H ;秒复位INC MINUTE ;分进位MOV FLAG_KEEP,#00H ;每过1分钟关蜂鸣器(闹铃响1分钟)SETB P2.0MOV A,MINUTECJNE A,#60,FORMAT_TIME_DONE ;时无进位,调整结束MOV MINUTE,#00H ;分复位INC HOUR ;时进位MOV A,FLAG_ADDCJNE A,#00H,FORMAT_NO_ALARM_HOUR ;设置时间状态下跳过整点报时检测ACALL ALARM_HOURFORMAT_NO_ALARM_HOUR:MOV A,HOURCJNE A,#24,FORMAT_TIME_DONE ;天数无进位,调整结束MOV HOUR,#00H ;时复位INC DAY ;天数进位ACALL FORMAT_YEAR ;调用闰年判断函数,处理了天数调整MOV A,MONTHCJNE A,#13,FORMAT_TIME_DONE ;年低位无进位,调整结束MOV MONTH,#01H ;月复位INC YEAR_LFORMAT_TIME_YEAR_REFORM:MOV A,YEAR_LCJNE A,#100,FORMAT_TIME_DONE ;年高位无进位,调整结束MOV YEAR_L,#00H ;年低位满100复位,向高位进1INC YEAR_H ;高位进1MOV A,YEAR_HCJNE A,#100,FORMAT_TIME_DONE ;高位MOV YEAR_H,#00H ;年高位满100复位FORMAT_TIME_DONE:MOV A,FLAG_ADD ;取时间设置标志CJNE A,#00H,FORMAT_TIME_ADJUST ;FLAG=0,直接返回,否则执行设置后显示参数处理SJMP FORMAT_TIME_EXITFORMAT_TIME_ADJUST:MOV FLAG_ADD,#00H ;执行设置后,设置标志归0MOV COUNT_50MS,#00H ;闪烁重新计秒MOV FLAG_CLOSE,#01H ;调时间后处于相关位处于显示状态FORMAT_TIME_EXIT:RET;-;数据处理1子函数:闰年判断以及月份、天数调整处理FORMAT_YEAR:MOV A,MONTHCJNE A,#02H,DAY30_OR_DAY31 ;MONTH不为2,判断是30天还是31天MOV A,YEAR_L ;取年低位CJNE A,#00H,DIV4 ;不能被100整除的话判断是否能被4整除MOV A,YEAR_H ;能被100整除判断能否被400整除MOV B,#4DIV ABMOV A,B ;年高位除4CJNE A,#00H,NOT_LEAP_YEARSJMP LEAP_YEAR ;能被400整除,为闰年DIV4:MOV A,YEAR_LMOV B,#4DIV ABMOV A,BCJNE A,#00H,NOT_LEAP_YEAR ;被4整除?LEAP_YEAR: ;能被4整除,为闰年MOV A,DAYCJNE A,#00H,FORMAT_YEAR_NO_RESET_J0MOV DAY,#29 ;天数减时复位设置FORMAT_YEAR_NO_RESET_J0:CLR CSUBB A,#30 ;闰年下,满30天天数复位JC FORMAT_YEAR_EXITSJMP FORMAT_YEAR_ADD_MONTHNOT_LEAP_YEAR:MOV A,DAYCJNE A,#00H,FORMAT_YEAR_NO_RESET_J1MOV DAY,#28 ;天数减时复位设置FORMAT_YEAR_NO_RESET_J1: CLR CSUBB A,#29 ;平年下,满29天天数复位JC FORMAT_YEAR_EXITSJMP FORMAT_YEAR_ADD_MONTHDAY30_OR_DAY31:MOV A,MONTHCJNE A,#4,NOT_M4SJMP DAY30 ;为4月,有30天NOT_M4:CJNE A,#6,NOT_M6SJMP DAY30 ;为6月,有30天NOT_M6:CJNE A,#9,NOT_M9SJMP DAY30 ;为9月,有30天NOT_M9:CJNE A,#11,DAY31SJMP DAY30 ;为11月,有30天DAY31: ;余下可能为31天MOV A,DAYCJNE A,#00H,FORMAT_YEAR_NO_RESET_J2MOV DAY,#31 ;天数减时复位设置FORMAT_YEAR_NO_RESET_J2:CLR CSUBB A,#32JC FORMAT_YEAR_EXIT ;大于31天,需要进位处理,否则返回SJMP FORMAT_YEAR_ADD_MONTHDAY30:MOV A,DAYCJNE A,#00H,FORMAT_YEAR_NO_RESET_J3MOV DAY,#30 ;天数减时复位设置FORMAT_YEAR_NO_RESET_J3:CLR CSUBB A,#31JC FORMAT_YEAR_EXIT ;大于30天,需要进位处理,否则返回FORMAT_YEAR_ADD_MONTH:MOV DAY,#01H ;天数复位1INC MONTH ;月进位MOV A,FLAG_ADD ;取FLAG_ADDCJNE A,#00H,FORMAT_YEAR_ADJUST ;FLAG_ADD=0,返回,否则在设置日期时候产生的天数归位不应产生月份进位,MONTH减1SJMP FORMAT_YEAR_EXITFORMAT_YEAR_ADJUST:DEC MONTHFORMAT_YEAR_EXIT:RET;-;数据处理函数2:闹铃数据处理FORMAT_ALARM:MOV A,FLAG_ADD ;取设置标志CJNE A,#00H,FORMAT_ALARM_NEXT ;FLAG_ADD=0,无修改,跳出,否则进入闹铃设置处理SJMP FORMAT_ALARM_EXITFORMAT_ALARM_NEXT:MOV R0,#A1_SWITCHMOV A,FLAG_NUM ;取当前闹钟标志DEC AMOV B,#03HMUL ABMOV B,R0ADD A,BMOV R0,A ;R0指向当前闹钟开关地址MOV A,FLAG ;取FLAGCJNE A,#08H,FORMAT_ALARM_NOT_SWITCHMOV A,R0 ;FLAG=8,修改开关状态CPL ACC.0 ;开关状态取反MOV R0,A ;修改开关状态SJMP FORMAT_ALARM_EXITFORMAT_ALARM_NOT_SWITCH:CJNE A,#09H,FORMAT_ALARM_NOT_HOURDEC R0 ;FLAG=9,修改小时,R0减1,指向小时地址INC R0 ;小时+1MOV A,R0CJNE A,#24,FORMAT_ALARM_EXIT ;满24归0判断MOV R0,#00HSJMP FORMAT_ALARM_EXITFORMAT_ALARM_NOT_HOUR:DEC R0DEC R0 ;FLAG=10,修改分钟,R0减2,指向分钟地址INC R0 ;分钟+1MOV A,R0CJNE A,#60,FORMAT_ALARM_EXIT ;满60归0判断MOV R0,#00HFORMAT_ALARM_EXIT:MOV A,FLAG_ADD ;取FLAG_ADDCJNE A,#01H,FORMAT_ALARM_J0DEC FLAG_ADD ;FLAG_ADD=1,有修改,修改完成FLAG_ADD减1MOV COUNT_50MS,#00HMOV FLAG_CLOSE,#01H ;修改后相应位处于显示状态FORMAT_ALARM_J0:RET;-;缓冲区处理函数1:显示缓冲区存时间信息,0=FLAG=3,送时分秒,FLAG=4,送年份,5=FLAG=6,送月份天数,FLAG=7,送年低位月份天数;R1指向缓冲区起始地址,R0指向数据区起始地址,转移的数据长度由FLAG判断,由R2储存BUF_TIME:MOV R4,#00H ;日期显示标志MOV A,#DISPBUFADD A,#5MOV R1,A ;R1存缓冲区最高位地址MOV A,FLAG ;取标志CJNE A,#07H,BUF_TIME_NOT_FUN1 ;FLAG=7,显示年低位、月份、天数,否则继续判断MOV CLOSE_BIT,0FFHMOV A,#YEAR_LMOV R0,A ;R0指向年低位MOV R2,#03H ;存6位SJMP BUF_TIME_START ;开始搬运数据BUF_TIME_NOT_FUN1:CJNE A,#04H,BUF_TIME_NOT_YEAR ;FLAG=4,显示年,否则继续判断MOV CLOSE_BIT,#9FH ;10011111MOV A,#YEAR_H ;FLAG=4,显示年份MOV R0,A ;R0指向年高位MOV R2,#02H ;存4位SJMP BUF_TIME_STARTBUF_TIME_NOT_YEAR:CJNE A,#04H,BUF_TIME_J0BUF_TIME_J0 :JNC BUF_TIME_MONTH_AND_DAY ;FLAG4,显示月份、天数MOV CLOSE_BIT,#0BFH ;10111111,屏蔽第6位MOV A,#MONTHMOV R0,A ;R0指向日期MOV R4,#01H ;R4=1MOV R2,#02H ;存4位BUF_TIME_START: ;数据处理,每次循环处理2位MOV A,R4 ;取R4值CJNE A,#01H,BUF_TIME_NO_ADD ;R4=1,月份和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论