1、低两位显示方式(LOW-PLAY-MOD) HPLMOD BIT 3AH ;高两位显示方式(HIGH-PLAY-MOD) BRIGHT BIT 3BH ;DISPLAY子程序参数:亮灭指示位 TCOUNT EQU 3CH ;时间计数器(TIME-COUNT) ADDRES EQU 3DH ;加1子程序参数 MAX EQU 3EH ; IFDEC BIT 20H ;BCD加法子程序参数 R_MOD EQU 3FH ;响铃方式参数 LED4 BIT 30H ;发光管状态位 BELL BIT P1.7 ;蜂鸣器 SWITCH BIT P3.7 ;继电器 FKEY BIT P3.0 ;功能键 (S1)
2、 MKEY BIT P3.1 ;修改键 (S2) WORKIN BIT 38H ;工作状态指示位 中断入口 ; ORG 0000H START: LJMP MAIN ; 0000H 引向主程序 LJMP ERR ; 0003H NOP LJMP ERR ; 引向出错处理程序 LJMP PGT0 ; 000BH 引向中断处理程序PGT0 0013H INT1 LJMP ERR 001BH T1 0023H LJMP ERR LJMP ERR ; 002BH* 主程序 ; ; MAIN: MOV IE, #00H ;关中断 MOV SP, #57H ;设置堆栈指针 MOV PSW, #00H ;选
3、用寄存器组0 MOV TMOD, #11H ;设定中断工作方式为T0和T1 MOV A, 56H CJNE A, #0AAH, CSTART ;判上电复位标志,无标志转冷启动 MOV A, 57H CJNE A, #55H, CSTART ; 无标志转冷启动 AJMP HSTART ;有上电复位标志转热启动 NOP LJMP ERR ;软件陷阱,引向出错处理程序 CSTART: MOV P1, #0FFH ;冷启动,全面初始化 MOV P3, #0FFH MOV TCON, #00H ;计时停止 MOV TL0, #0B0H ;赋中断T0初值 MOV TH0, #3CH MOV TCOUNT,
4、 #0AH ;赋定时器初值 MOV R5, #00H ;R5为一空单元(备用) MOV R4, #00H ; R4 为工作模式选择寄存器 MOV SL, #00H ;定时单元清零 MOV SH, #00H ;秒 MOV ML, #00H ; MOV MH, #00H ;分 MOV HL, #00H ; MOV HH, #00H ;时 MOV PLYTS, #64H ;赋显示次数初值为100次 MOV DSPLYP, #L0 ;显示指针指向显存单元 MOV L0, #0AH ;送显示数据- MOV L1, #0AH MOV L2, #0AH MOV L3, #04H SETB LED4 ;LED
5、4为数码管之间的发光二极管 SETB LPLMOD ;设定显示方式为闪烁 SETB HPLMOD ; SETB BRIGHT ;允许显示 CLR WORKIN ;清工作标志 , 待命 AJMP SETUP ;转开始工作软件陷阱 HSTART: MOV SCON, #00H ; 有上电标志,热启动,清串行口控制寄存器 MOV IP, #00H ; 清中断优先控制寄存器 SETB FKEY ;重设按键 SETB MKEY SETB EA ;开中断 AJMP BEGIN ;转向继续工作 LJMP ERR ; SETUP: MAIN1: ACALL DISPLY ;调用显示 JB FKEY, JUDG
6、E ;按键扫描 ACALL KEYDLY ;延时消抖动无键按下转向判断是否到点 CLR ET0 ;功能键被按下,则 CLR TR0 ;暂停计时 ACALL MENU ; 调用菜单设置程序 BEGIN: SETB WORKIN ;置工作标志位,开始工作 SETB ET0 ; SETB TR0 ;开始计时 MOV A, R4 ;移入工作模式选择 RL A ;指针放大 MOV DPTR, #M_TAB JMP A+DPTR ;根据工作模式跳转到相应程序段 M_TAB: AJMP WORK1 AJMP WORK2 AJMP WORK3 AJMP WORK4 NOP LJMP ERR ;WORK1: W
7、ORK2: CLR SWITCH ;工作方式1和2:开继电器 AJMP MAIN2 WORK3:WORK4: SETB SWITCH ;工作方式3和4:不开继电器 MAIN2: CLR BELL ;蜂鸣器短鸣一声,以示开始工作 ACALL DL05S SETB BELL JUDGE: JNB WORKIN, MAIN1 ;判断是否在定时之中 MOV A, SL ;判断秒是否为零 JNZ MAIN1 MOV A, SH ; MOV A, ML ;判断分是否为零 MOV A, MH ; MOV A, HL ;判断时是否为零 MOV A, HH ; JNZ MAIN1 ;若时分秒全为零则 CLR E
8、T0 ; 停止计时 CLR TR0 ; ACALL ACTION ; 调用到点工作子程序 AJMP MAIN ; 返回 倒计时程序 ; PGT0: CLR EA ; PUSH ACC ;保护现场 PUSH PSW PUSH DPL PUSH DPH MOV PSW, #08H ;选用寄存器组1 CLR TR0 ; MOV A,#0B7H ;中断同步修正 ADD A,TL0 MOV TL0,A MOV A,#3CH ADD A,TH0 MOV TH0,A SETB TR0 ;恢复计时 DEC TCOUNT ;定时器T0每50 000毫秒溢出一次,则 MOV A, TCOUNT ; 溢出10次为0
9、.5秒 JNZ OUTT0 ;判断是否到半秒 MOV TCOUNT, #0AH ; CPL LED4 ; 若到半秒LED取反 JNB LED4, OUTT0 ;LED每闪烁一次是一秒 MOV R0, #SH ;移入秒位的地址 SETB IFDEC ;BCD子程序参数,使其做减法 ACALL ADDBCD ;调用BCD子程序, 秒减1 CJNE R3, #99H, OUTT0 ;判断秒要否借位 MOV SH, #05H ;要借位则 MOV SL, #09H ; 送数据59(否则显示99) MOV R0, #MH ;移入分位的地址分减1判断分要否借位 MOV MH, #05H MOV ML, #0
10、9H MOV R0, #HH ACALL ADDBCD OUTT0: POP DPH ;恢复现场 POP DPL POP PSW POP ACC SETB EA RETI ;中断返回* BCD子程序(加1或减1 ) ; ADDBCD: MOV A, R0 ;移入被操作数的高位 DEC R0 ;指针减一 SWAP A ORL A, R0 ;移入被操作数的低位 MOV B, #01H ;B寄存器送立即数#01H MOV C, IFDEC ;若 减法标志位为1,则 MOV B.3, C ; MOV B.4, C ; B寄存器的值被改为#99H MOV B.7, C ; ADD A, B ; 对一个压缩的BCD码加#99H等于对其减一 DA A ;BCD码调整 MOV R3, A ;暂存结果 ANL A, #0FH ;取低位码 MOV R0, A ;存数 MOV A, R3 ;取回结果 INC R0 ;指针加一 SWAP A ;交换取结果数的高位 RET* 加1程序 ; ADDONE: MOV R0, ADDRES ;移入被加数单元的地址 CLR IFDEC ;设定BCD子程序做加法调用BCD子
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1