资源描述
序列号 46 论文题目: 基于单片机的数字电子钟 课程名称: 单片机原理机接口技术 目录11 设计任务书2 个性化电子钟功能描述3 单片机系统原理图及工作原理描述4 程序模块框图5 程序清单6 设计或调试过程中碰到的问题及决计方法7 测试数据,误差分析,补偿方法,补偿前后精度比拟8 收获及意见9 附录完整电路图目录2目录12目录23一、课程设计任务书41)根本要求42)设计报告要求:43)课程设计验收标准:5二、个性化电子钟功能描述51.根本计时功能:52.校准功能53.闹钟模式6三、单片机系统原理图及工作原理描述61.各模块介绍62.单片机系统总图9四、程序模块框图91.功能框图92.程序框图10五、程序清单11;变量定义11;初始化12;主要执行程序12;按键检测程序13;显示模式选择程序13; 中断效劳程序14;闹钟显示及转码程序16;检测闹钟程序18; 显示时分秒程序18; 显示年月日的程序22;年月日校准程序26;按键检测程序28;功能小程序34六、设计或调试过程中碰到的问题及解决方法371.存储错乱372.工作区的选择383.闹钟响的时间384.按键紊乱39七、测试数据,误差分析,补偿方法,补偿前后精度比拟39a)未考虑月份不同天数39b)中断效劳程序造成的时间延迟39八、收获及意见40九、附录完整电路图40一、 课程设计任务书1) 根本要求根据?单片机原理及接口技术?所学的内容及其他相关课程的知识,结合各生的根底,充分发挥个人的特长,设计个性化数字电子钟。具体要求以下:1 根本电路AT89S51CPU,12MHZ时钟,常规上电和手动复位电路。2 数码管显示模式4位LED数码显示器带钟点,分别显示“小时:分钟或“分钟:秒3 独立按键3个独立试按键,具体功能描述如下:MODE模式转换键,具有“正常小时校准分钟校准小时闹铃分钟闹铃等5种模式,每按一次,转换一种模式。假设当前处于正常模式,按一下此键,“小时闪烁,表示进入“小时调校模式,再按一次,转入分钟模式,如此类推,正常模式下不闪烁。 UP加“1键,按下此键,被选中的工程加“1 DOWN减“1键,按下此键,被选中的工程减“14 蜂鸣器设计1路蜂鸣器输出驱动电路,用于报警或按键声5 电源电路电源:9V交流输入,全波整流,滤波,7805稳压电路,输出5V直流电源共给单片机系统。6 软件编写数字电字钟的所有软件,包括主程序,定时器中断计时程序,定时器中断扫描显示程序,键盘扫描及功能程序,BCD码转换程序,“二翻十拆字转码程序,闹铃程序等等。将这些程序整合成一个完整的电子钟程序,在软件模拟器上调试,在MCS51学习机上调试,并测试其功能及性能。在设计软件时,学生可充分发挥自己的特长和想象力,自行扩充功能,如“秒表功能,通信功能,钟控功能等。7 精度分析在程序调试通过后,测试计时精度,分析误差来源,提出补偿方法。2) 设计报告要求:每人一份设计报告,要求独立完成,用统一的封面装订,设计报告的内容包括以下局部:1 设计任务书2 个性化电子钟功能要求3 单片机系统原理图及工作原理描述4 程序模块框图5 程序清单6 设计或调试过程中碰到的问题及决计方法7 测试数据,误差分析,补偿方法,补偿前后精度比拟8 完成课程设计后的收获或体会,对?单片机课程设计?提出改良意见。3) 课程设计验收标准:本次课程设计的成绩由大局部组成:即硬件设计软件设计和课程设计报告。硬件设计主要是电路图设计可以用手工画或计算机辅助设计。软件局部在辩论时验收,并结合辩论情况进行评定。1 电路原理图设计(20%),包括以下知识点:CPU及时钟,复位电路显示接口电路键盘接口电路蜂鸣器驱动电路电源局部2 软件设计及辩论(60%),包括以下知识点:主程序及初始化程序定时中断及计时程序定时中断及显示程序键盘程序闹铃程序按键声程序3 课程设计报告(20%),具体要求见上面所述.4) 根底较好的学生可以结合实际应用自拟题目,题目和具体设计内容定好后由指导老师比准。 指导老师:乐金松2021,12,28二、 个性化电子钟功能描述1. 根本计时功能:. 上电显示时钟、分钟、秒,时钟和分钟显示小数点以做区分. 当P3.7键按下,显示年月日,因为比拟方便观察,并没有设置小数点以作区分。2. 校准功能. 上电显示为时分秒或年月日. 当P3.4按下一次,校准时钟位,时钟位闪烁. 当P3.4按下两次,校准分钟位,分钟位闪烁. 当P3.4按下三次,校准秒位,秒位闪烁,注意,此时假设是显示年月日模式,调整无效,数码管熄灭. 当P3.4按下四次,校准年的高位,年的高位闪烁. 当P3.4按下五次,校准年的低位,年的低位闪烁. 当P3.4按下六次,校准月份位,月份位闪烁. 当P3.4按下七次,校准日位,日位闪烁,此时假设是显示时分秒模式,调整无效,数码管熄灭,其中,假设P3.5键按下,加1,假设P3.6键按下,减1. 当P3.4按下八次或九次,为闹钟校准模式. 当P3.4按到十次,恢复显示年月日或者时分秒3. 闹钟模式. 当P3.4按到八次,时钟和分钟位显示初始时间12:00,设置小时闹钟。假设P3.5键按下,加1,假设P3.6键按下,减1. 当P3.4按到九次,设置分钟闹钟,假设P3.5键按下,加1,假设P3.6键按下,减1. 即使没有设置闹钟,在时间为12:00时,也会启动闹钟,闹钟声音为十次简短的鸣声。三、 单片机系统原理图及工作原理描述1. 各模块介绍a) CPU及时钟,复位电路i. 复位电路功能描述:上电时,单片时机自动复位,按下S1按键时,手动复位,该电子钟系统会从0开始计时。ii. 时钟此电路系统配置的是12MHZ的晶振,拥有这个晶振,电路才会计时、中断系统才会溢出。iii. CPU此电子钟系统采用的是STC公司的89C52单片机,本电路主要使用其P0口数码管、P3口按键、和P1口蜂鸣器,该单片机内部含有运算器、存储器、控制器、输入输出设备等。b) 显示接口电路这个开发板需要两个锁存器分别控制位选和断选,只有位选控制端置一,才能送位选信号,同理,断选控制端置一,才能送段选信号。c) 键盘接口电路此按键,按下为0,松开为1。d) 蜂鸣器驱动电路蜂鸣器送逻辑1的时候才能发出声音。e) 电源局部此电源用LM317芯片进行整流,进行滤波和稳压后,通过调节电位器,可以把输入的9V电压转变成5V的电压。2. 单片机系统总图详见附录四、 程序模块框图正常显示模式时间校准模式闹钟模式 模式1:时分秒 模式2:年月日 模式123:校准时分秒 模式4567:校准年月日 模式8:设置小时 模式9:设置分钟1. 功能框图 程序初始化主执行程序MODE2检测1,MODE检测MODE等于8或90,MODE检测MODE不等于8或9闹钟BCD程序MODE2=0BCD1程序闹钟显示程序MODE=,显示时分秒MODE检测MODE2=1BCD2程序MODE检测MODE=1、2、3,校准时分秒MODE=4、5、6、7,校准时分秒MODE=,显示年月日时分秒显示程序年月日校准显示程序时分秒校准显示程序时分秒校准显示程序闪烁LED闪烁中断溢出Key_scan程序重新赋值调整时间返回主执行程序MODE=9,设置分钟MODE检测MODE=8,设置小时闹钟检测程序:闹钟声程序检测是否到达时间2. 程序框图 五、 程序清单;变量定义LED1EQU7FHLED2EQU7EHLED3EQU7DHLED4EQU7CHLED5EQU7BHLED6EQU7AHLED1_2EQU6CHLED2_2EQU6BHLED3_2EQU6AHLED4_2EQU69HLED5_2EQU68HLED6_2EQU67HLED7_2EQU66HLED8_2EQU65HSCAN_COUNT2EQU64HMODE2EQU60HSCAN_COUNT3EQU5FHSCAN_COUNT4EQU5EHLED1_CLOCK_HOUR EQU5DHLED2_CLOCK_HOUREQU5CHLED1_CLOCK_MIN EQU5BHLED2_CLOCK_MINEQU5AHH_MEM_CLOCKEQU59HM_MEM_CLOCKEQU58HSCAN_COUNT5EQU57HSCAN_COUNTEQU77H;扫描显示计数器TEMP1EQU76HTEMP2EQU75HTEMP3EQU74HH_MEMEQU73HM_MEMEQU72HS_MEMEQU71HD_MEMEQU6DHMON_MEMEQU63HY_MEM_1EQU62HY_MEM_2EQU61HMODE_REGEQU6FHTIMER_COUNTEQU6EH ;定时器中断次数软件计数器MODEEQU70H ;TEMP4EQU6CHFLASH_FLAGEQU20H.0;定义闪烁标志位;初始化ORG0000HLJMPMAINORG0003H;外部中断0的标志RETI;中断标志ORG000BH;定时器中断0的标志LJMPT0_INTORG0013H;外部中断1RETI;-ORG0030H;好似一般都有这一句MAIN:MOVSP,#2FHMOVTL0,#(65536-4608)MOD 256;MOD是取余数,初始化时间常数MOVTH0,#(65536-4608)/256MOVTMOD,#00000001B;G=0,C/T取T定时器,模式为模式116位定时器或计数器方式SETBET0;T0定时器0中断中断允许 SETBTR0;定时器0控制位,置1SETBEA;CPU中断允许总开关LCALL CLR_MEMMOVMON_MEM,#1MOVD_MEM,#1;-MOVH_MEM_CLOCK,#12;主要执行程序;-WAIT:;LCALLCLOCK_CHOOSE;LCALLDELAY_1SLCALLKEY4_SCANLCALLCHOOSELCALLCHECK_TIMESJMPWAIT;-显示模式的选择程序-;-等待按键按下-KEY4_SCAN:NOKEY_4:MOVC,P3.7 CPLCJNCGATE4;CY为0跳转,没有按键,执行display程序MOVTEMP4,CLCALLDELAY_10MSORLC,TEMP4JNCK4;按下跳转;没按下,返回GATE4:RETK4:LCALLSOUNDINCMODE2MOVA,MODE2CJNEA,#2,K41 ;mode只能为0或者1 mode为1执行display2程序MOVMODE2,#0K41:JNBP3.7,$RET ;显示模式选择程序;-无论如何都要选择一个模式-CHOOSE:MOVA,MODE2CJNEA,#0,NOT_CLOCK0; MODE2为1,判断是模式8还是模式9MOVA,MODE ;MODE2为0, 判断是否为8或者9CJNEA,#8,NOT_CLOCK3;MODE2=0的情况下,不为模式8,判断是否为模式9LCALLCONVERT_BCD3;为模式8,调用displayclock程序LCALLCLOCK_DISPLAY ;为模式8RETNOT_CLOCK3:CJNEA,#9,NOT_CLOCK4;判断是否为模式9LCALLCONVERT_BCD3 LJMPCLOCK_DISPLAYRETNOT_CLOCK4:LCALLCONVERT_BCD1 ;不为模式9,调用显示程序1LCALLCHOOSE_DISPLAY1RETNOT_CLOCK0:MOVA,MODECJNEA,#8,NOT_CLOCK1;MODE2为1时,不为模式8,判断是否为模式9LCALLCONVERT_BCD3;为模式8,调用displayclock程序LCALLCLOCK_DISPLAYRETNOT_CLOCK1:CJNEA,#9,NOT_CLOCK2;不为模式9,显示mode2=0下的display程序LCALLCONVERT_BCD3 ;为模式9,调用clockdisplay程序LCALLCLOCK_DISPLAYRETNOT_CLOCK2:LCALLCONVERT_BCD2; 此时为mode2模式为1的,选择闪烁模式,对DISPLAY程序经行选择LCALLCHOOSE_DISPLAY2;模式0,display程序RET;-显示模式选择函数-CHOOSE_DISPLAY1:MOVA,MODECJNEA,#0,CH_1LCALLDISPLAY1 ;模式为0,调用正常的显示程序RETCH_1:LCALLDISPLAY1_2RETCHOOSE_DISPLAY2:MOVA,MODECJNEA,#0,CH_2LCALLDISPLAY2 ;模式为0,调用正常的显示程序RETCH_2:LCALLDISPLAY2_2RET; 中断效劳程序;-中断效劳程序-T0_INT:PUSHACC;保护现场开始,保护A累加器PUSHPSW;保护程序状态字存储器PUSH DPL;数据地址指针低8位PUSHDPHSETBRS1;选择2区工作存储单元MOVTL0,#(65536-5000)MOD 256;恢复时间常数MOVTH0,#(65536-5000)/256LCALLKEY_SCANINCTIMER_COUNTMOVA,TIMER_COUNTCJNEA,#100,T0_INT1;如果A不等于100,跳到TO_INT1MOVTIMER_COUNT,#0CPLFLASH_FLAG;每5MS*100=500MS取反闪烁标志位;LCALLFLASH;CPL:Converse Position Logical 位取反JNBFLASH_FLAG,T0_INT1;为0跳到TO_INT1INCS_MEMMOVA,S_MEMCJNEA,#60,T0_INT1;秒位MOVS_MEM,#0INC M_MEMMOVA,M_MEMCJNEA,#60,T0_INT1 ;分位MOVM_MEM,#0INC H_MEMMOVA,H_MEMCJNEA,#24,T0_INT1MOVH_MEM,#0 ;时位INCD_MEMMOVA,D_MEMCJNEA,#32,T0_INT1MOVD_MEM,#1 ;天INCMON_MEMMOVA,MON_MEMCJNEA,#13,T0_INT1MOVMON_MEM,#1;月INCY_MEM_1MOVA,Y_MEM_1CJNEA,#100,T0_INT1MOVY_MEM_1,#0 ;低位年INCY_MEM_2MOVA,Y_MEM_2CJNEA,#100,T0_INT1MOVY_MEM_2,#0;高位年T0_INT1:POPDPHPOPDPLPOPPSWPOPACCRETI ;出栈;闹钟显示及转码程序;闹钟显示程序;-时钟的显示函数-CLOCK_DISPLAY:;SETBCLOCK_FLASHMOVP0,#11111111BNOPNOPMOVA,SCAN_COUNT5ADDA,ACCMOVR1,ALCALLFLASH3 ;在flash函数中选择调用哪个表;MOVDPTR,#LED_SCAN_TABLEMOVA,R1MOVCA,A+DPTRSETBP2.7;位锁存MOVP0,ACLRP2.7 MOVA,SCAN_COUNT5ADDA,ACCINCAMOVCA,A+DPTRMOVR0,AMOVA,R0MOVP0,A;LCALLDELAY_1S ;调试用CLRP2.6 ;DB3FH,06H,5BH,04FH,66H,6DH,7DH,07H ;DB7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH INCSCAN_COUNT5MOVA,SCAN_COUNT5 CJNEA,#4,DONE5MOVSCAN_COUNT5,#0DONE5: RET;闹钟闪烁及模式选择程序;-时钟闪烁模式选择程序-FLASH3:JNBFLASH_FLAG,F31;假设标志位位为0,显示闪烁程序,否那么显示正常模式;LCALLLIGHT_OFFLJMP FLASH3F31:MOVA,MODECJNEA,#8,F32LJMPH_F_CLOCK;模式8,校准小时F32:;CJNEA,#0,F34;模式为0,那么返回?LJMPM_F_CLOCK;模式9,校准分钟F34:RET; ;-闪烁程序-H_F_CLOCK:MOVDPTR,#LED_SCAN_TABLE_CLOCK_1RETM_F_CLOCK:MOVDPTR,#LED_SCAN_TABLE_CLOCK_2RET;闹钟BCD转码程序;-为闹钟做BCD转码-CONVERT_BCD3:;第一个数码管MOVR3,H_MEM_CLOCKMOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FH;保存低四位MOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED1_CLOCK_HOUR,A;第二个数码管MOVA,R6ANLA,#0F0H;保存高四位SWAPAMOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED2_CLOCK_HOUR,A;第三个数码管MOVR3,M_MEM_CLOCKMOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FHMOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED1_CLOCK_MIN,A;第四个数码管MOVA,R6ANLA,#0F0HSWAPA;MOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED2_CLOCK_MIN,ARET;检测闹钟程序;-检测是否到达闹钟时间-CHECK_TIME:MOVA,H_MEM_CLOCKCJNEA,H_MEM,OVER2CHECK_NEXT:MOVA,M_MEM_CLOCKCJNEA,M_MEM,OVER2MOVA,S_MEM;为了防止整一分钟都会叫,只在一秒的时候判断一次CJNEA,#0,OVER2LCALLCLOCK_SOUNDRETOVER2:RET; 显示时分秒程序;时分秒显示程序;-显示时分秒程序-DISPLAY1:MOVP0,#11111111BNOPNOP;MOVP0,#0FFHMOVA,SCAN_COUNT;之前定义过:SCAN_COUNTEQU7BHADDA,ACCMOVDPTR,#LED_SCAN_TABLEMOVCA,A+DPTRSETBP2.7;位锁存MOVP0,ACLRP2.7 MOVA,SCAN_COUNTADDA,ACCINCAMOVCA,A+DPTRMOVR0,AMOVA,R0MOVR0,SCAN_COUNTDOT:CJNER0,#2,NOACT1ORLA,#80HMOVP0,ASETBP0.7 ;调试用SJMPGO_ONNOACT1: CJNER0,#4,NOACT2SJMPACTMOVP0,A CLRP2.6 ;DB3FH,06H,5BH,04FH,66H,6DH,7DH,07H ;DB7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH GO_ON:INCSCAN_COUNTMOVA,SCAN_COUNT CJNEA,#6,DONEMOVSCAN_COUNT,#0DONE: RET;时分秒BCD程序;-CONVERT_BCD1:;第一个数码管MOVR3,S_MEMMOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FH;保存低四位MOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED1,A;第二个数码管MOVA,R6ANLA,#0F0H;保存高四位SWAPAMOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED2,A;第三个数码管MOVR3,M_MEMMOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FHMOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED3,A;第四个数码管MOVA,R6ANLA,#0F0HSWAPA;MOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED4,A ;第五个数码管MOVR3,H_MEMMOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FHMOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED5,A ;第六个数码管MOVA,R6ANLA,#0F0HSWAPAMOVCA,A+DPTRMOVLED6,ARET;二翻十程序;-二翻十程序-BTID:CLRAMOVR4,AMOVR5,AMOVR6,AMOVR7,#16IBTL:CLRCMOVA,R3RLCA;带进位循环左移,与LC指令的区别?MOVR3,AMOVA,R2RLCAMOVR2,AMOVA,R6ADDCA,R6DAA;DA:十进制调整指令,将二进制结果;调整为十进制数MOVR6,AMOVA,R5ADDCA,R5DAAMOVR5,AMOVA,R4ADDCA,R4;在进行A+R4前,A的值是多少DAAMOVR4,ADJNZR7,IBTL ;减1为1跳转RET; 显示年月日的程序;年月日显示程序;-显示年月日的程序-DISPLAY2:MOVP0,#11111111BNOPNOP;MOVP0,#0FFHMOVA,SCAN_COUNT2;之前定义过:SCAN_COUNTEQU7BHADDA,ACCMOVDPTR,#LED_SCAN_TABLE2MOVCA,A+DPTRSETBP2.7;位锁存MOVP0,ACLRP2.7 MOVA,SCAN_COUNT2ADDA,ACCINCAMOVCA,A+DPTRMOVR0,AMOVA,R0MOVP0,A;LCALLDELAY_1SCLRP2.6 INCSCAN_COUNT2MOVA,SCAN_COUNT2 CJNEA,#8,DONE2MOVSCAN_COUNT2,#0DONE2: RET;年月日BCD转码程序;-启用第二段转码程序-CONVERT_BCD2:;第1_2个数码管MOVR3,D_MEMMOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FH;保存低四位MOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED1_2,A;第2_2个数码管MOVA,R6ANLA,#0F0H;保存高四位SWAPAMOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED2_2,A;第3_2个数码管MOVR3,MON_MEMMOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FHMOVDPTR,#LED_CODEMOVCA,A+DPTRJNBFLASH_FLAG,MODE0_BCD1 ;FLASH_FLAG为0跳到MODE0_BCD1MODE0_BCD1:MOVLED3_2,A;第4_2个数码管MOVA,R6ANLA,#0F0HSWAPAMOVCA,A+DPTRMOVLED4_2,A ;第5_2个数码管MOVR3,Y_MEM_1MOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FHMOVDPTR,#LED_CODEMOVCA,A+DPTRJNBFLASH_FLAG,MODE0_BCD2 ;FLASH_FLAG为0跳到MODE0_BCD1MODE0_BCD2:MOVLED5_2,A ;第6_2个数码管MOVA,R6ANLA,#0F0HSWAPAMOVCA,A+DPTRMOVLED6_2,A ;第7_2个数码管MOVR3,Y_MEM_2MOVR2,#0LCALLBTIDMOVA,R6ANLA,#0FHMOVDPTR,#LED_CODEMOVCA,A+DPTRMOVLED7_2,A ;第8_2个数码管MOVA,R6ANLA,#0F0HSWAPAMOVCA,A+DPTRMOVLED8_2,ARET;显示时分秒校准程序;时分秒校准显示程序;-第三个display函数,专门校准闪烁时用,节省内存-DISPLAY1_2:MOVP0,#11111111BNOPNOPMOVA,SCAN_COUNT3;之前定义过:SCAN_COUNTEQU7BHADDA,ACCMOVR1,ALCALLFLASH1 ;在flash函数中选择调用哪个表;MOVDPTR,#LED_SCAN_TABLEMOVA,R1MOVCA,A+DPTRSETBP2.7;位锁存MOVP0,ACLRP2.7 MOVA,SCAN_COUNT3ADDA,ACCINCAMOVCA,A+DPTRMOVR0,AMOVA,R0MOVP0,A;LCALLDELAY_1S ;调试用CLRP2.6 ;DB3FH,06H,5BH,04FH,66H,6DH,7DH,07H ;DB7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH INCSCAN_COUNT3MOVA,SCAN_COUNT3 CJNEA,#2,DONE3MOVSCAN_COUNT3,#0DONE3: RET;时分秒闪烁模式选择程序;-判断闪烁模式-;-时分秒闪烁模式选择程序-FLASH1:JNBFLASH_FLAG,F1;假设标志位位为0,显示闪烁程序,否那么显示正常模式;LCALLLIGHT_OFFSJMP FLASH1F1:MOVA,MODECJNEA,#1,F2LJMPH_F;模式1,校准小时F2:CJNEA,#2,F7LJMPM_F;模式2,校准分钟F7: CJNEA,#3,F8;如果不等于3,也应该正常显示LJMPS_F ;模式3,校准秒数F8:CJNEA,#0,F10;如果变回模式0RETF10:;SJMPFLASH1RET ;-闪烁程序-H_F:MOVDPTR,#LED_SCAN_TABLE_1RETM_F:MOVDPTR,#LED_SCAN_TABLE_2RETS_F:MOVDPTR,#LED_SCAN_TABLE_3RET;年月日校准程序;年月日校准显示程序;-第四个display函数,专门校准闪烁时用年月日,节省内存-DISPLAY2_2:MOVP0,#11111111BNOPNOP;MOVP0,#0FFHMOVA,SCAN_COUNT4;之前定义过:SCAN_COUNTEQU7BHADDA,ACCMOVR1,ALCALLFLASH2 ;在flash函数中选择调用哪个表;MOVDPTR,#LED_SCAN_TABLEMOVA,R1MOVCA,A+DPTRSETBP2.7;位锁存MOVP0,ACLRP2.7 MOVA,SCAN_COUNT4ADDA,ACCINCAMOVCA,A+DPTRMOVR0,AMOVA,R0MOVP0,A;LCALLDELAY_1S ;调试用CLRP2.6 ;DB3FH,06H,5BH,04FH,66H,6DH,7DH,07H ;DB7FH,6FH,77H,7CH,39H,5EH,79H,71H,0FFH INCSCAN_COUNT4MOVA,SCAN_COUNT4 CJNEA,#2,DONE4MOVSCAN_COUNT4,#0DONE4: RET; 年月日闪烁模式选择程序;-年月日闪烁模式选择程序-FLASH2:JNBFLASH_FLAG,F3;假设标志位位为0,显示闪烁程序,否那么显示正常模式SJMPFLASH2F3:MOVA,MODE;CJNEA,#1,F12;CJNEA,#2,F12;CJNEA,#3,F12CJNEA,#4,F4;模式4,校准 天数LJMPD_FF4:CJNEA,#5,F5;模式5,校准月份LJMPMON_FF5:CJNEA,#6,F6;模式6,校准低位年LJMPY_F1F6:CJNEA,#7,F9LJMPY_F2;模式7,校准 高位年F9:CJNEA,#0,F11;如果变回模式0,返回RETF11:;SJMPFLASH2RET;-闪烁程序-D_F:MOVDPTR,#LED_SCAN_TABLE21RETMON_F:MOVDPTR,#LED_SCAN_TABLE22RETY_F1:MOVDPTR,#LED_SCAN_TABLE23RETY_F2:MOVDPTR,#LED_SCAN_TABLE24RET;按键检测程序;检测是否按下程序;-按键程序2-KEY_SCAN:LCALLNOKEY_1;LCALLNOKEY_2;LCALLNOKEY_3;NOKEY_1:MOVC,P3.4 CPLCJNCGATE1;CY为0跳转MOVTEMP4,CLCALLDELAY_10MSORLC,TEMP4JNCK1;确定按下跳转GATE1:RETNOKEY_2:MOVC,P3.5 CPLCJNCGATE2;CY为0跳转MOVTEMP4,CLCALLDELAY_10MSORLC,TEMP4JNCK2GATE2:RET;JNBP3.4,K1 ;为0跳转,按键按下为0;JNBP3.5,K2;JNBP3.6,K3;RET;JNBP3.7,K4;MODE键检测程序;-模式选择程序-K1:LCALLSOUNDINCMODEMOVA,MODECJNEA,#10,K11MOVMODE,#0K11:JNBP3.4,$RET;up键检测程序;-UP键的程序-K2:LCALLSOUNDMOVA,MODECJNEA,#0,K21;模式0,无操作RETK21:CJNEA,#1,K22LJMPH_INC;模式1,校准小时K22:CJNEA,#2,K27LJMPM_INC;模式2,校准分钟K27:CJNEA,#3,K23 ;模式3,校准秒数LJMPS_INCK23:CJNEA,#4,K24;模式4,校准 天数LJMPD_INCK24:CJNEA,#5,K25;模式5,校准月份LJMPMON_INCK25:CJNEA,#6,K26;模式6,校准低位年LJMPY_INC_1K26:CJNEA,#7,K28LJMPY_INC_2;模式7,校准 高位年K28:CJNEA,#8,K29LJMPH_CLOCK;模式8,闹钟时的时钟调整K29:LJMPM_CLOCK;模式9,闹钟分钟位调整H_CLOCK:INCH_MEM_CLOCKMOVA,H_MEM_CLOCKCJNEA,#24,H_CLOCK1MOVH_MEM_CLOCK,#0H_CLOCK1:JNBP3.5,$;检测up键是否按下 RETM_CLOCK:INCM_MEM_CLOCKMOVA,M_MEM_CLOCKCJNEA,#60,M_CLOCK1MOVM_MEM_CLOCK,#0M_CLOCK1:JNBP3.5,$;检测up键是否按下 RETH_INC:INCH_MEMMOVA,H_MEMCJNEA,#24,H_INC1MOVH_MEM,#0H_INC1:JNBP3.5,$;检测up键是否按下 RETM_INC:INCM_MEMMOVA,M_MEMCJNEA,#60,M_INC1MOVM_MEM,#0M_INC1:JNBP3.5,$;检测up键是否按下 RETS_INC:INCS_MEMMOVA,S_MEMCJNEA,#60,S_INC1MOVH_MEM,#0S_INC1:JNBP3.5,$;检测up键是否按
展开阅读全文