




已阅读5页,还剩59页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 实验要求在实验板上编程实现2012年日历和实时时钟:1.时-分-秒(2位-2位-2位)显示可通过键盘置入时间值(参照电子表设置时间工作模式)。2.可通过按键控制在LED上从右向左滚动显示年_月_日3次,如:2012_01_20空空2012_01_203.实现每日闹铃提醒功能,闹铃时间可用按键设置。闹铃采用提示音表示。4.实现秒表功能。5.实现定时器功能(预置定时时间,按键启动,倒计时,计到0响提示音。6.设计实现音乐提示音。7.设计串行通信程序,使两台实验系统同步显示。 2.硬件环境与工作原理2.1硬件环境:2.1.1单片机:SST 89E564RD 图2.12.1.2 外部设备:1. 八位8段数码管 图2.2 2. 一个4x4非编码键盘 图2.32.2工作原理:2.2.1引入选通信号的原因:由于AT89C51单片机的引脚数目有限,需要采用引脚时分复用技术,因此引入AJ00AJ07作为选通信号,用于选择当前的输入/输出设备。其中,AJ00AJ07是A12A14经过74138译码器后的输出信号(A15为译码器的使能信号)。2.2.2 选通信号产生电路图: 图2.42.2.3 数码管位选择原理:1. 输出位选信号指令: MOV A,#SELECT ;SELECT为位选信号对应的数值 MOV DPTR,#8000H MOV DPTR,A2. 电路实现原理: 在指令“MOV DPTR,#8000H”中,8000H代表外部存 储器的地址,对应于A15=1,Ai=0(i=014)。由图2.4可知,此时74138译码器有效,由A=B=C=0,得:AJ00=0,AJ0i=1(i=17)。有由于执行指令“MOV DPTR,A”时,/WR=0,因此,由图2.2可知74HC573有效,它将D0D7信号保持并输入ULN2803,信号经过放大后,作为位选信号驱动8位数码管。2.2.4 数码管段选择原理:1. 输出段选信号指令: MOV A,#SELECT ;SELECT为段选信号对应的数值 MOV DPTR,#9000H MOV DPTR,A2. 电路实现原理: 在指令“MOV DPTR,#9000H”中,9000H代表外部存储器的地址, 对应于A15=1,A12=1,Ai=0(i=011,13,14)。由图2.4可知,此时74138译码器有效,由A=C=0,B=1,得:AJ01=0,AJ0i=1(i=0,27)。有由于执行指令“MOV DPTR,A”时,/WR=0,因此,由图2.2可知74HC573有效,它将D0D7信号保持并作为位选信号输入8位数码管。2.2.5 4x4键盘控制原理: 由图2.3可知,AJ00=0时,可通过P00P03向键盘发出扫描信号或读取键盘信号。具体原理见后续代码。 3. 资源使用3.1 RAM的使用情况ALARM EQU 20H.0 ;闹钟设置标志TIME_UP EQU 20H.1 ;倒计时时间到标志SOUND_ON EQU 20H.2 ;声音开关标志UART_EN EQU 20H.3 ;处于串口通信状态标志IS_HOST EQU 20H.4;是否作为串口通信的主机 标志HOUR_TPEQU 2AHMIN_TPEQU 2BHSEC_TPEQU 2CHMUSIC_SELECT EQU 2DHTIME_BUF EQU 2EH;3035H连续存放led显示数据HOUR EQU 36H ;小时MIN EQU 37H;分钟SEC EQU 38H;秒COUNT EQU 39H ;每0.05s 加 1HOUR_ALARM EQU 3AHMIN_ALARM EQU 3BHSEC_ALARM EQU 4BHSEC_OLD EQU 3CH;存放旧的秒数HOUR_DOWN EQU 3DHMIN_DOWN EQU 3EH ;倒数时分钟数SEC_DOWN EQU 3FH ;倒数时间秒钟数VAR_HOUR EQU 40HVAR_MIN EQU 41HVAR_SEC EQU 42HMS EQU 43H ;作用同SEC_OLDYEAR0 EQU 44HYEAR1 EQU 45HMONTH EQU 46HDAY EQU 47HMUSIC1 EQU 48HMUSIC2 EQU 49HMUSIC3 EQU 4AHDATE_BUF EQU 60H ;以下连续12字节为日期显示数据3.2 系统堆栈使用情况主程序将SP设置为50H,在50H到60H之间的16字节为堆栈区,由于此工程设计的函数调用层次最多不超过3层且参数主要通过内存变量传递,因此,不会出现堆栈溢出的情况。此处,更好的方案应该是把DATE_BUF前移并把堆栈放在DATE_BUF之后。但是,实际操作时发现如果堆栈区包含62H以后的区域,就会出现一个严重的bug,由于这个bug一直没法解释和解决,我只好采用了现在这个方案。3.3 寄存器使用情况: 1. 累加器A 2. 寄存器B3. 00区的R0R7寄存器,0103区的寄存器不曾使用。3.4 定时器/计数器使用情况整个工程用到了定时器T0和T1。其中T0用于主时钟的计时,优先级最高,不可被软中断中断, 且不可被软中断屏蔽。T1用于控制播放音乐时音调的频率和控制串口通信时的波特 率。 4 程序原理与框图4.1 主函数4.1NO_KEY 初始化各变量检查是否开始闹钟 显示当前时间 扫描读取键盘值 扫描读取键盘值K9设置时钟 设置闹钟K10 进入受控模式. K16.1 主函数框图T0中断服务: 保存现场 抵消T0误差 最小计时单元自增 进位判断 闰年进位判断 恢复现场4.1.2 主函数代码:;*主函数*;*作者:刘贤莺;*日期:2012/2/26 NAME MAIN_FUNCEXTRN CODE (GET_KEY,BEEP,SET_DOWN_TIMER,CONVERT,DISP,SET_TIME,SET_ALARM_TIME)EXTRN CODE (COUNTER,DATE_ROLLER,MUSIC,INT_T1,UART_INT,UART_HOST,UART_SLAVE,SET_DATE)ALARM EQU 20H.0 ;闹钟设置标志TIME_UP EQU 20H.1 ;倒计时时间到标志SOUND_ON EQU 20H.2 ;声音开关标志UART_EN EQU 20H.3 ;处于串口通信状态标志IS_HOST EQU 20H.4;是否作为串口通信的主机 标志HOUR_TPEQU 2AHMIN_TPEQU 2BHSEC_TPEQU 2CHMUSIC_SELECT EQU 2DHTIME_BUF EQU 2EH;3035H连续存放led显示数据HOUR EQU 36H ;小时MIN EQU 37H;分钟SEC EQU 38H;秒COUNT EQU 39H ;每0.05s 加 1HOUR_ALARM EQU 3AHMIN_ALARM EQU 3BHSEC_ALARM EQU 4BHSEC_OLD EQU 3CH;存放旧的秒数HOUR_DOWN EQU 3DHMIN_DOWN EQU 3EH ;倒数时分钟数SEC_DOWN EQU 3FH ;倒数时间秒钟数VAR_HOUR EQU 40HVAR_MIN EQU 41HVAR_SEC EQU 42HMS EQU 43H ;作用同SEC_OLDYEAR0 EQU 44HYEAR1 EQU 45HMONTH EQU 46HDAY EQU 47HMUSIC1 EQU 48HMUSIC2 EQU 49HMUSIC3 EQU 4AHDATE_BUF EQU 60H ;以下连续12字节为日期显示数据;蜂鸣器引脚定义BUZZER EQU P1.6 PROG SEGMENT CODECSEG AT 0ORG 0HJMP MAINORG 0BHJMP INT_T0ORG 001BHJMP INT_T1 ;跳转至T1中断服务程序ORG 23HJMP UART_INTCSEG AT 0050HRSEG PROG;-主程序-;MAIN: MOV SP,#50HLCALL INIT ;初始化变量 LCALL INIT_TIMER ;设置定时器LCALL INIT_SHOW;无穷循环LOOP: MOV VAR_HOUR,HOUR MOV VAR_MIN,MIN MOV VAR_SEC,SEC LCALL CONVERT ;先传递参数再调用 LCALL TIME_TEST;检查闹钟时间 LCALL DISP LCALL GET_KEY;MOV A,#15 CJNE A,#9,LOOP_TO_10 LCALL BEEP LCALL SET_TIME LJMP LOOPLOOP_TO_10: CJNE A,#10,LOOP_TO_11 LCALL BEEP LCALL SET_ALARM_TIME JMP LOOPLOOP_TO_11: CJNE A,#11,LOOP_TO_12 LCALL BEEP LCALL SET_DOWN_TIMER ;设置倒计时间 JMP LOOPLOOP_TO_12: CJNE A,#12,LOOP_TO_13 LCALL BEEP LCALL COUNTER JMP LOOPLOOP_TO_13: CJNE A,#13,LOOP_TO_14 LCALL BEEP LCALL DATE_ROLLER LJMP LOOPLOOP_TO_14: CJNE A,#14,LOOP_TO_2 LCALL SET_DATE LJMP LOOPLOOP_TO_2: CJNE A,#2,LOOP_TO_15 JB ALARM,ALARM_OFF LCALL BEEP LCALL BEEP SETB ALARM JMP LOOPALARM_OFF: LCALL BEEP CLR ALARM LJMP LOOPNO_KEY:LJMP LOOPLOOP_TO_1: CJNE A,#1,NO_KEY JNB SOUND_ON,L1 CLR SOUND_ON LJMP L11L1: SETB SOUND_ON LCALL BEEPL11: LJMP LOOPLOOP_TO_15: CJNE A,#15,LOOP_TO_16 LCALL BEEP LCALL UART_HOST LJMP LOOPLOOP_TO_16: CJNE A,#16,LOOP_TO_1 LCALL BEEP LCALL UART_SLAVE LJMP LOOP ;检查是否启动闹钟TIME_TEST:JB ALARM,TI3RET;检查闹钟时间是否到了 TI3: MOV A,HOURMOV B,HOUR_ALARMCJNE A,B,BKMOV A,MINMOV B,MIN_ALARMCJNE A,B,BKLCALL TIME_OUT ;闹钟时间到了,开始提示BK:RETTIME_OUT:MOV R0,#1 ;#256;MOV SEC_OLD,#100ALARMING:MOV MUSIC_SELECT,#1 ;选择第一首歌曲LCALL MUSIC;LCALL GET_KEY;CJNE A,#4,AL1;响铃次数没到,但是用户按K4停止闹钟;LJMP AL2;AL1:DJNZ R0,ALARMING;响铃的次数到了就停;AL2:CLR ALARM RET; ;显示时钟初始值000000INIT_SHOW:MOV DPTR,#8000HMOV A,#11111111BMOVX DPTR,AMOV DPTR,#9000HMOV A,#00111111BMOVX DPTR,ARET;中断服务程序INT_T0:PUSH PSWPUSH ACCCLR EA ;关中断CLR TR0MOV A,#7;加上执行到SET TR0处需要的时间ADD A,TL0MOV TL0,AMOV A,#0DCHADDC A,TH0MOV TH0,ASETB TR0INC COUNT;秒输出MOV A,COUNTCJNE A,#100,TT1 ;是否一秒到了MOV COUNT,#0INC SECMOV A,SECCJNE A,#60,TT1 ;是否一分钟到了;分输出INC MINMOV SEC,#0MOV A,MINCJNE A,#60,TT1;是否一小时到了;时输出INC HOURMOV MIN,#0MOV A,HOURCJNE A,#24,TT1MOV SEC,#0MOV MIN,#0MOV HOUR,#0MOV A,MONTHCJNE A,#2,NOT_2MOV A,YEAR1CJNE A,#0,NOT_100MOV A,YEAR0MOV B,#4DIV ABMOV A,BCJNE A,#0,NOT_2MOV R0,#28LJMP DAY_TESTNOT_100:MOV A,YEAR1MOV B,#4DIV ABMOV A,BCJNE A,#0,NOT_2MOV R0,#29LJMP NO1NOT_2:MOV DPTR,#(MONTHS-1)MOV A,MONTHMOVC A,A+DPTRMOV R0,ANO1:LJMP DAY_TESTTT1: ;如果放在最后会出现 OUT OF RANGE 错误!POP ACCPOP PSWSETB EA ;开中断RETIDAY_TEST:INC DAYMOV A,DAYINC R0MOV B,R0CJNE A,B,TT1MOV DAY,#1INC MONTHMOV A,MONTHCJNE A,#13,TT1MOV MONTH,#1INC YEAR1MOV A,YEAR1CJNE A,#100,TT1MOV YEAR1,#0INC YEAR0MOV A,YEAR0CJNE A,#100,TT1MOV YEAR0,#0JMP TT1 ;使用定时器T0 模式0 计时INIT_TIMER:MOV TMOD,#01HMOV IE,#10001010BMOV TL0,#00HMOV TH0,#0DCHSETB TR0;启动定时器T0RET;初始化:计时单元清零INIT:CLR ALARM ;关闭闹钟功能MOV COUNT,#0MOV SEC,#0MOV MIN,#0MOV HOUR,#0MOV HOUR_ALARM,#0MOV MIN_ALARM,#0MOV SEC_ALARM,#0MOV SEC_OLD,#0 ;保存的秒值 以便对比 判断是否过了一秒MOV HOUR_DOWN,#0MOV MIN_DOWN,#0MOV SEC_DOWN,#0MOV TIME_BUF+2,#01000000B ;显示时分秒之间的分隔符MOV TIME_BUF+5,#01000000B ;显示时分秒之间的分隔符MOV YEAR0,#20MOV YEAR1,#12MOV MONTH,#2MOV DAY,#14SETB SOUND_ON ;开声音RET;/平年的每月天数表MONTHS:DB 31D,28D,31D,30D,31D,30D,31D,31D,30D,31D,30D,31D END4.2 主时钟设置模块:4.2.1 主时钟设置模块代码:;*主时钟设置模块*;*外部接口:SET_TIME;* 参数:无;*日期:2012/2/20 NAME SETTING_CLOCKEXTRN CODE (DISP,GET_KEY,CONVERT,BEEP)PUBLIC SET_TIMESETTING_CLOCK_SEG SEGMENT CODERSEG SETTING_CLOCK_SEG HOUR_TPEQU 2AHMIN_TPEQU 2BHSEC_TPEQU 2CHHOUR EQU 36H ;小时MIN EQU 37H;分钟SEC EQU 38H;秒VAR_HOUR EQU 40HVAR_MIN EQU 41HVAR_SEC EQU 42H;设置时间SET_TIME:;CLR TR0;时间停止(定时器暂停) MOV HOUR_TP,HOUR MOV MIN_TP,MIN MOV SEC_TP,SECL0: LCALL GET_KEYCJNE A,#0,TO_9LJMP NO_KEYTO_9:CJNE A,#9,TO_13LCALL BEEP;SETB TR0RETTO_13:CJNE A,#13,TO_10CLR TR0MOV HOUR,HOUR_TPMOV MIN,MIN_TPMOV SEC,SEC_TPLCALL BEEPSETB TR0RETTO_10:CJNE A,#10,TO_14INC HOUR_TPMOV A,HOUR_TPCJNE A,#24,SHOW_SET_TIMEMOV HOUR_TP,#0SHOW_SET_TIME: LCALL BEEPNO_KEY: MOV VAR_HOUR,HOUR_TP MOV VAR_MIN,MIN_TP MOV VAR_SEC,SEC_TPLCALL CONVERTLCALL DISPJMP L0TO_14:CJNE A,#14,TO_11DEC HOUR_TPMOV A,HOUR_TPCJNE A,#-1,SHOW_SET_TIMEMOV HOUR_TP,#23JMP SHOW_SET_TIMETO_11:CJNE A,#11,TO_15INC MIN_TPMOV A,MIN_TPCJNE A,#60,SHOW_SET_TIMEMOV MIN_TP,#0LJMP SHOW_SET_TIMETO_15:CJNE A,#15,TO_12DEC MIN_TPMOV A,MIN_TPCJNE A,#-1,SHOW_SET_TIMEMOV MIN_TP,#59LJMP SHOW_SET_TIMETO_12:CJNE A,#12,TO_16INC SEC_TPMOV A,SEC_TPCJNE A,#60,SHOW_SET_TIMEMOV SEC_TP,#0LJMP SHOW_SET_TIMETO_16:CJNE A,#16,NO_KEYDEC SEC_TPMOV A,SEC_TPCJNE A,#-1,SHOW_SET_TIMEMOV SEC_TP,#59LJMP SHOW_SET_TIME;END4.3 闹钟功能模块4.3.1 闹钟功能模块代码:;*闹钟功能模块*;*外部接口:SET_ALARM_TIME;* 参数:无;*日期:2012/2/21NAME SETTING_ALARM_CLOCKPUBLIC SET_ALARM_TIMEEXTRN CODE (DISP,CONVERT,BEEP,GET_KEY)S_A_CLOCK_SEG SEGMENT CODERSEG S_A_CLOCK_SEG HOUR_TPEQU 2AHMIN_TPEQU 2BHSEC_TPEQU 2CHALARM EQU 20H.0 ;闹钟设置标志HOUR EQU 36H ;小时MIN EQU 37H;分钟SEC EQU 38H;秒HOUR_ALARM EQU 3AHMIN_ALARM EQU 3BHSEC_ALARM EQU 4BHVAR_HOUR EQU 40HVAR_MIN EQU 41HVAR_SEC EQU 42H;设置闹钟时间SET_ALARM_TIME: ;MOV VAR_HOUR,HOUR_ALARM ;MOV VAR_MIN,MIN_TP; MOV VAR_SEC,SEC_ALARM;LCALL CONVERT ;传入参数后等效于 CONVERTA;LCALL CONVERTA;加载闹钟数据;LCALL DISPMOV HOUR_TP,HOUR_ALARMMOV MIN_TP,MIN_ALARMMOV SEC_TP,SEC_ALARMN0:LCALL GET_KEYCJNE A,#0,TO_10LJMP NO_KEYN00:LJMP N0TO_10:CJNE A,#10,TO_14INC HOUR_TPMOV A,HOUR_TPCJNE A,#24,SHOW_ALARM_TIMEMOV HOUR_TP,#0SHOW_ALARM_TIME: LCALL BEEPNO_KEY: MOV VAR_HOUR,HOUR_TP MOV VAR_MIN,MIN_TP MOV VAR_SEC,SEC_TPLCALL CONVERT ;传入参数后等效于 CONVERTALCALL DISPJMP N0TO_14:CJNE A,#14,TO_11DEC HOUR_TPMOV A,HOUR_TPCJNE A,#-1,SHOW_ALARM_TIMEMOV HOUR_TP,#23JMP SHOW_ALARM_TIMETO_11:CJNE A,#11,TO_15INC MIN_TPMOV A,MIN_TPCJNE A,#60,SHOW_ALARM_TIMEMOV MIN_TP,#0LJMP SHOW_ALARM_TIMETO_15:CJNE A,#15,TO_12DEC MIN_TPMOV A,MIN_TPCJNE A,#-1,SHOW_ALARM_TIMEMOV MIN_TP,#59LJMP SHOW_ALARM_TIMETO_12:CJNE A,#12,TO_16INC SEC_TPMOV A,SEC_TPCJNE A,#60,SHOW_ALARM_TIMEMOV SEC_TP,#0LJMP SHOW_ALARM_TIMETO_16:CJNE A,#16,TO_9DEC SEC_TPMOV A,SEC_TPCJNE A,#-1,SHOW_ALARM_TIMEMOV SEC_TP,#59LJMP SHOW_ALARM_TIMETO_9: CJNE A,#9,TO_13LCALL BEEPRETTO_13:CJNE A,#13,N00MOV HOUR_ALARM,HOUR_TPMOV MIN_ALARM,MIN_TPMOV SEC_ALARM,SEC_TPLCALL BEEPRET/* MOV VAR_HOUR,HOUR MOV VAR_MIN,MIN MOV VAR_SEC,SECLCALL CONVERT;加载当前时间数据,设置闹钟时,原来的计时仍在继续,现在让它显示出来RET*/;TO_ERROR:;LCALL BEEP;JMP N0;END4.4 倒计时模块4.4.1 倒计时模块代码:;*倒计时模块*;*外部接口:SET_DOWN_TIMER;* 参数:无;*日期:2012/2/21 NAME DOWN_TIMERPUBLIC SET_DOWN_TIMEREXTRN CODE (CONVERT,DISP,GET_KEY,BEEP,MUSIC)DOWN_TIMER_SEG SEGMENT CODEDOWN_SEG SEGMENT CODERSEG DOWN_TIMER_SEGTIME_UP EQU 20H.1ALARM EQU 20H.0 ;闹钟设置标志MUSIC_SELECT EQU 2DHCOUNT EQU 39H ;每0.05s 加 1HOUR EQU 36H ;小时MIN EQU 37H;分钟SEC EQU 38H;秒SEC_OLD EQU 3CH;存放旧的秒数HOUR_DOWN EQU 3DHMIN_DOWN EQU 3EH ;倒数时分钟数SEC_DOWN EQU 3FH ;倒数时间秒钟数VAR_HOUR EQU 40HVAR_MIN EQU 41HVAR_SEC EQU 42H;设置倒计时时间SET_DOWN_TIMER:;CLR TR0;MOV SEC_OLD,SEC; MOV VAR_HOUR,HOUR_DOWN; MOV VAR_MIN,MIN_DOWN; MOV VAR_SEC,SEC_DOWN;LCALL CONVERT ;传入参数后等效于 DOWN_CONVERTMOV HOUR_DOWN,#0MOV MIN_DOWN,#0MOV SEC_DOWN,#0S0:;ACALL DISPLCALL GET_KEY ;扫描键盘CJNE A,#0,TO_10AJMP NO_KEYTO_10:CJNE A,#10,TO_14 ;由于我的键盘K6键坏掉了 改用K10!INC MIN_DOWNMOV A,MIN_DOWNCJNE A,#24,SHOW_DOWN_TIMEMOV MIN_DOWN,#0SHOW_DOWN_TIME: LCALL BEEPNO_KEY: MOV VAR_HOUR,MIN_DOWN;由于增加了毫秒 所以显示整体左移两位 MOV VAR_MIN,SEC_DOWN MOV VAR_SEC,HOUR_DOWNLCALL CONVERT ;传入参数后等效于 DOWN_CONVERTLCALL DISPJMP S0TO_14:CJNE A,#14,TO_11DEC MIN_DOWNMOV A,MIN_DOWNCJNE A,#-1,SHOW_DOWN_TIMEMOV MIN_DOWN,#59JMP SHOW_DOWN_TIMETO_11:CJNE A,#11,TO_9INC SEC_DOWNMOV A,SEC_DOWNCJNE A,#60,SHOW_DOWN_TIMEMOV SEC_DOWN,#0JMP SHOW_DOWN_TIMETO_9:CJNE A,#9,TO_15RETTO_15:CJNE A,#15,TO_12DEC SEC_DOWNMOV A,SEC_DOWNCJNE A,#-1,SHOW_DOWN_TIMEMOV SEC_DOWN,#59JMP SHOW_DOWN_TIMETO_12: CJNE A,#12,TO_16INC HOUR_DOWNMOV A,HOUR_DOWNCJNE A,#100,SHOW_DOWN_TIMEMOV HOUR_DOWN,#0JMP SHOW_DOWN_TIMETO_16:CJNE A,#16,TO_13DEC HOUR_DOWNMOV A,HOUR_DOWNCJNE A,#-1,SHOW_DOWN_TIMEMOV HOUR_DOWN,#99JMP SHOW_DOWN_TIMETO_13:CJNE A,#13,S0LCALL BEEPLCALL BEEPLCALL BEEPCLR TIME_UP;SETB TR0S3:LCALL DOWN_TIME MOV VAR_HOUR,MIN_DOWN MOV VAR_MIN,SEC_DOWN MOV VAR_SEC,HOUR_DOWNLCALL CONVERT ;传入参数后等效于 DOWN_CONVERTLCALL DISPLCALL GET_KEYCJNE A,#9,S3_TO_13RETS3_TO_13:CJNE A,#13,S31;倒计时清零MOV HOUR_DOWN,#0MOV MIN_DOWN,#0MOV SEC_DOWN,#0LCALL SET_DOWN_TIMERRETS31:JNB TIME_UP, S3RET;RSEG DOWN_SEG;检查倒计时DOWN_TIME:MOV A,COUNTMOV B,SEC_OLDCJNE A,B,D01RETD01:MOV SEC_OLD,COUNTDEC HOUR_DOWNMOV A,HOUR_DOWNCJNE A,#-1,EXITMOV A,SEC_DOWNCJNE A,#0,D12MOV A,MIN_DOWNCJNE A,#0,D13SETB TIME_UPLCALL TIME_OUT;JMP LOOPRETD13:MOV HOUR_DOWN,#99MOV SEC_DOWN,#59DEC MIN_DOWNRETD12:MOV HOUR_DOWN,#59DEC SEC_DOWNRETEXIT:MOV A,HOUR_DOWNCJNE A,#0,E1 MOV A,MIN_DOWNCJNE A,#0,E1MOV A,SEC_DOWNSUBB A,#5 JNC E1LCALL BEEPE1:RETTIME_OUT:;MOV R0,#255;ALARMING:MOV MUSIC_SELECT,#0 ;选择第0首音乐LCALL MUSIC;LCALL GET_KEY;CJNE A,#9,AL1;响铃次数没到,但是用户按K4停止闹钟;AJMP AL2;AL1:DJNZ R0,ALARMING;响铃的次数到了就停;AL2:CLR ALARM RETEND4.5 秒表模块4.5.1 秒表模块代码:;*秒表模块*;*外部接口:COUNTER;* 参数:无;*日期:2012/2/22 NAME COUNTEREXTRN CODE (DISP,CONVERT,GET_KEY)PUBLIC COUNTERCOUNT_STOP EQU 20H.2HOUR EQU 36H ;小时MIN EQU 37H;分钟SEC EQU 38H;秒MS EQU 43H ;作用同SEC_OLDCOUNT_HOUR EQU 44HCOUNT_MIN EQU 45HCOUNT_SEC EQU 46HVAR_HOUR EQU 40HVAR_MIN EQU 41HVAR_SEC EQU 42HCOUNT EQU 39H ;每0.05s 加 1COUNTER_SEG SEGMENT CODERSEG COUNTER_SEGCOUNTER:LCALL GET_KEYMOV VAR_HOUR,#0MOV VAR_MIN,#0MOV VAR_SEC,#0LCALL CONVERTLCALL DISPCJNE A,#12,COUNTERCLR COUNT_STOPLCALL START_COUNTRETSTART_COUNT:MOV COUNT_HOUR,#0 ;小时变成毫秒!MOV COUNT_MIN,#0MOV COUNT_SEC,#0S1:LCALL GET_KEYCJNE A,#12,TO_13CPL COUNT_STOPJMP S3TO_13:CJNE A,#13,TO_9MOV COUNT_HOUR,#0MOV COUNT_MIN,#0MOV COUNT_SEC,#0SETB COUNT_STOPJMP S3TO_9:CJNE A,#9,NOKEYRETNOKEY:JB COUNT_STOP,S3MOV A,COUNTMOV B,MSCJNE A,B,S2JMP S3S2:MOV MS,COUNTINC COUNT_HOUR;毫秒MOV A,COUNT_HOURCJNE A,#100,S3MOV COUNT_HOUR,#0INC COUNT_SECMOV A,COUNT_SECCJNE A,#60,S3MOV COUNT_SEC,#0INC COUNT_MINMOV A,COUNT_MINCJNE A,#24,S3MOV COUNT_MIN,#0S3: MOV VAR_HOUR,COUNT_MIN ;由于增加了毫秒位 显示内容整体左移两位MOV VAR_MIN,COUNT_SECMOV VAR_SEC,COUNT_HOURLCALL CONVERTLCALL DISPJMP S1END4.6 日期滚动模块4.6.1 日期滚动模块代码:;*日期滚动模块*;*外部接口:DATE_ROLLER;* 参数:无;*日期:2012/2/23 NAME DATE_ROLLERPUBLIC DATE_ROLLERDATE_ROLLER_SEG SEGMENT CODERSEG DATE_ROLLER_SEGVAR_HOUR EQU 40HVAR_MIN EQU 41HVAR_SEC EQU 42HYEAR0 EQU 44HYEAR1 EQU 45HMONTH EQU 46HDAY EQU 47HDATE_BUF EQU 60H ;以下连续12字节为日期显示数据DATE_ROLLER:MOV R0,#0D1:MOV A,R0ADD A,#DATE_BUFMOV R1,AMOV R1,#00HINC R0CJNE R0,#8,D1MOV A,YEAR0MOV B,#10DIV ABMOV DPTR,#TABLEMOVC A,A+DPTR MOV DATE_BUF+0,AMOV A,BMOV DPTR,#TABLEMOVC A,A+DPTRMOV DATE_BUF+1,AMOV A,YEAR1MOV B,#10DIV ABMOV DPTR,#TABLEMOVC A,A+DPTR MOV DATE_BUF+2,AMOV A,BMOV DPTR,#TABLEMOVC A,A+DPTRMOV DATE_BUF+3,AMOV DATE_BUF+4,#01000000B ;显示“-”号MOV A,MONTHMOV B,#10DIV ABMOV DPTR,#TABLEMOVC A,A+DPTR MOV DATE_BUF+5,AMOV A,BMOV DPTR,#TABLEMOVC A,A+DPTRMOV DATE_BUF+6,AMOV DATE_BUF+7,#01000000B ;显示“-”号MOV A,DAYMOV B,#10DIV ABMOV DPTR,#TABLEMOVC A,A+DPTR MOV DATE_BUF+8,AMOV A,BMOV DPTR,#TABLEMOVC A,A+DPTRMOV DATE_BUF+9,AMOV DATE_BUF+10,#0H;空白区域MOV DATE_BUF+11,#0H;空白区域LOOP:MOV R4,#3MOV R1,#-8D2:MOV A,R1MOV VAR_HOUR,A;MOV A,R0;ADD A,#DATE_BUF;MOV R1,A;MOV VAR_HOUR,R1 ;保存R1MOV R2,#8MOV R3,#100
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 个人承接业务合同范本
- 理疗馆加盟合同范本
- 个人收购塑料合同范本
- 深圳设备出租合同范本
- 模特协会合同范本
- 工厂文员用工合同范本
- 足球培训协议合同范本
- 外墙真石漆甲方合同范本
- 碧桂园设计合同范本
- 保安 劳动合同范本
- 2024-2025学年高三上学期《为什么要上一个好大学?》主题班会课件
- 管道cctv检测方案
- 职业技术学校物联网应用技术专业调研报告
- GB/T 43934-2024煤矿土地复垦与生态修复技术规范
- 2023年某技术有限公司技术规范
- 秋季传染病预防课件幼儿园
- 江苏农牧科技职业学院单招《英语》考试参考题库(含答案)
- 心得报告模板
- 义务教育数学新课程标准2022年版变化与解读解读课件
- 工程结构损伤机理及桅
- 私密艾灸培训课件
评论
0/150
提交评论