/////////实现走动功能的的子程序//////////// DELAY1: MOV TMOD,#00000001B
MOV IE,#10000010B
//延时60ms的子程序 设置T0工作在模式1 //启用定时器T0中断产生 //打开T0并将其设置为定时器
// MOV TCON,#00010000B
MOV TL0,#LOW(65536-5000) //直接带公式法设置T0的初值,此方法为简便
方法
MOV TH0,#HIGH(65536-5000) SETB TR0
//若TF0为1时代表T0定时器计数已满,有溢出程
序往下进行
;中断服务程序 T0_SRV: PUSH ACC
MOV TL0,#LOW(65536-5000) //直接带公式法设置T0的初值,此方法为简便方法 MOV TH0,#HIGH(65536-5000)
//MOV TL0,#(8192-5000)MOD 32 //重加载初始值 //MOV TH0,#(8192-50000)/32 INC DEDA ;秒输出 MOV A,DEDA CJNE A,#200,TT1 MOV DEDA,#0 CPL WLED
//若TF0为0时将一直循环这条程序语句; RET
//定时器T0计时中断程序每隔5ms中断一次
//LED灯亮灭变换
10
INC SEC MOV A,SEC CJNE A,#60,TT1 ;分输出
INC MIN //分计数加一 MOV SEC,#0 //秒计数清零 MOV A,MIN
CJNE A,#60,TT1 //看是否一小时到了 ;时输出 INC HOUR MOV MIN,#0 MOV A,HOUR CJNE A,#24,TT1 MOV SEC,#0 MOV MIN,#0 MOV HOUR,#0 TT1: POP ACC RETI
////////////////////实现显示功能的子程序///////////////////// CONV:
;转换小时数据
//通过DIV指令进行十进制计时处理,并将中断程序处理后的数据分别存
//是否1分钟到了
放入数码管显示内存中
//其中BUF,BUF+1存放小时;BUF+2,BUF+3存放分钟 、
MOV A,HOUR MOV B,#10 DIV AB
//将HOUR内的值转换为十位和个位分别表示的十进制数字,便于用两位
11
数码管显示出来小时值
MOV DPTR,#TABLE //DPTR指针指向表的首地址 MOVC A,@A+DPTR MOV BUF,A MOV A,B MOVC A,@A+DPTR MOV BUF+1,A
MOV A,MIN //开始转换分钟 MOV B,#10 DIV AB
MOV DPTR,#TABLE MOVC A,@A+DPTR MOV BUF+2,A MOV A,B MOVC A,@A+DPTR MOV BUF+3,A RET
//////////共阳极数码管字符转换笔段码表/////// TABLE:
DB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8H DB 80H,90H,88H,83H DB 0C6H,0A1H,86H,8EH
//共阴极///////////////////////
// TABLE:
//DB 3FH,06H,5BH,4FH,66H //DB 6DH,7DH,07H,7FH //DB 6FH,77H,7CH,39H
12
//DB 5EH,79H,71H
/////////////////扫描显示子程序///////////////////
//实际四个数码管是在轮流显示的,每一刻都只有一个数码管亮,利用人的视觉暂留来使人感觉是在同时显示 DISP:
MOV R0,#BUF //指向显示器缓冲区起始地址,即存入十位上小时地址 MOV R2,#4 //扫描四次
MOV A,#00001000B //扫描初值,只是使p2.3口打开 S1:
MOV P2,A MOV A,@R0 MOV P0,A MOV A,P2
MOV R5,#2
ACALL DELAY //延时,以便显示字符稳定 ;EX:XXXX1011 RR A INC R0
//A向右移动一位 //指向BUF+1
DJNZ R2,S1 //判断是否执行了四次扫描 RET
///////////////////实现调整时间子程序//////////////////// ;设置目前时间 SETTIME:
13
CLR TR0 //定时器暂停 MOV SEC,#0 //秒钟变量清零 L0:
ACALL DISP //调用扫描显示子程序 JB K2,L1 //K2等于一时跳转到L1 JNB K2,$ //若按下K2则等待放开 ;K2小时调整 INC HOUR MOV A,HOUR
CJNE A,#24,L11 //是否到了24小时,不到跳转到L11 MOV HOUR,#0 //小时变量清零 L11:
ACALL CONV //转换显示数据 ACALL DISP //扫描显示 JMP L0 L1: JB K3,L2 JNB K3,$ ;K3分钟调整 INC MIN MOV A,MIN CJNE A,#60,L21 MOV MIN,#0 L21: ACALL CONV ACALL DISP JMP L0
L2:JB K4,L0 //未按下K4则继续扫描 JNB K4,$
ACALL BZ //蜂鸣器响一声
14