COM8255 EQU 8003HOUTA EQU 8000HOUTB EQU 8001HOUTC EQU 8002HBUFFER EQU 20H ;显示缓冲区占用3个字节,20H-22HHOUR EQU 23H ;小时计数单元MIN EQU 24H ;分钟计数单元SEC EQU 25H ;秒计数单元S_27 BIT P1.0 ;工作方式选择开关,“1”为正常计时方式S_28 BIT P1.1 ;调整小时/分钟选择开关,“1”为调整小时S_29 BIT P3.2 ;小时/分钟数加1按键 ORG 0 LJMP START ORG 03H SETB TR1 ;启动T1计数,用于20ms消抖动 RETI ORG 0BH LJMP T0S ;转计时处理 ORG 1BH LJMP T1S ;转S29按键处理 ORG 30HSTART: MOV SP,#60H MOV DPTR,#COM8255 ;(8003>DPTR);指向8255命令口 MOV A,#80H ;(8000>A) 8255芯片PA、PB、PC设为基本输出模式 MOVX @DPTR,A ;(A>(DPTR)) MOV TMOD,#11H ; 设T0、T1为定时器 MOV TH0,#4CH ;T0定时50ms,晶振频率11.0592MHz MOV TL0,#0 MOV TH1,#0B8H ;T1定时20ms,晶振频率11.0592MHz MOV TL1,#00H SETB PT0 ;T0为高级中断 SETB ET0 ;允许T0中断 SETB ET1 ;允许T1中断 SETB IT0 ;设定INT0为边沿中断 SETB EA ;开中断 MOV BUFFER,#0H ;显缓区清零 MOV BUFFER+1,#0H MOV BUFFER+2,#0H MOV HOUR,#0H ;时分秒单元清零 MOV MIN,#0H MOV SEC,#0H MOV 0AH,#14H ;1区R2,1秒中断计次MAIN: SETB S_27 JB S_27,MM1 ;正常计时模式则转 SETB EX0 ;允许INT0中断 CLR TR0 ;停止T0计数 MOV SEC,#0H ;秒单元清零 SJMP MM2MM1: CLR EX0 ;禁止INT0中断 SETB TR0 ;启动T0计数MM2: MOV BUFFER,HOUR ;将时分秒送显 MOV BUFFER+1,MIN MOV BUFFER+2,SEC LCALL DISP ;显示时分秒 SJMP MAIN;-------主程序结束------------------------------------;;====================================================;T0中断服务程序;---------------------------------------------------T0S: PUSH PSW PUSH ACC SETB RS0 ;选择1区工作寄存器 CLR RS1 MOV TH0,#4CH ;T0时50ms,晶振频率11.0592MHz MOV TL0,#0H DJNZ R2,T0S1 MOV R2,#14H ;50ms中断20次为1秒 MOV A,SEC ADD A,#1 DA A MOV SEC,A CJNE A,#60H,T0S1 ;不到60秒则转移 MOV SEC,#0 MOV A,MIN ADD A,#1 DA A MOV MIN,A CJNE A,#60H,T0S1 ;不到60分则转移 MOV MIN,#0 MOV A,HOUR ADD A,#1 DA A MOV HOUR,A CJNE A,#24H,T0S1 ;不到24小时则转移 MOV HOUR,#0T0S1: POP ACC POP PSW RETI;====================================================;T1中断服务程序;---------------------------------------------------T1S: PUSH PSW PUSH ACC SETB S_29 JB S_29,T1S2 ;S29没有按下则转移 SETB S_28 JB S_28,T1S1 ;S28为高电平,调整小时则转 MOV A,MIN ADD A,#1 DA A MOV MIN,A CJNE A,#60H,T1S2 MOV MIN,#0 SJMP T1S2T1S1: MOV A,HOUR ADD A,#1 DA A MOV HOUR,A CJNE A,#24H,T1S2 MOV HOUR,#0T1S2: MOV TH1,#0B8H ;T1定时20ms,晶振频率11.0592MHz MOV TL1,#00H CLR TR1 CLR IE0 POP ACC POP PSW RETI;=====================================================;动态显示子程序;使用寄存器:R0,R2,R3,A,DPTR;-----------------------------------------------------DISP: MOV DPTR,#OUTB ;消隐数码管,实际实验箱上不需要 MOV A,#0FFH ;消隐数码管,实际实验箱上不需要 MOVX @DPTR,A ;消隐数码管,实际实验箱上不需要 MOV R0,#BUFFER+2 ;指向显缓区最后一个字节 MOV R3,#3 ;显示字节数为3字节 MOV R2,#0FEH ;位码初值,点亮最右边的数码管LOOP: MOV A,@R0 ANL A,#0FH ;取出低4位 MOV DPTR,#TAB MOVC A,@A+DPTR CLR ACC.7 ;点亮小数点 MOV DPTR,#OUTA MOVX @DPTR,A ;段码送8255的A口 MOV A,R2 INC DPTR ;指向8255的B口 MOVX @DPTR,A ;位码送8255的B口 RL A ;位码左移 MOV R2,A ;存位码 LCALL DELAY2MS ;延时2ms MOV DPTR,#OUTB ;消隐数码管,实际实验箱上不需要 MOV A,#0FFH ;消隐数码管,实际实验箱上不需要 MOVX @DPTR,A ;消隐数码管,实际实验箱上不需要 MOV A,@R0 ANL A,#0F0H ;取出高4位 SWAP A MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#OUTA MOVX @DPTR,A ;段码送8255的A口 MOV A,R2 INC DPTR ;指向8255的B口 MOVX @DPTR,A ;位码送8255的B口 RL A ;位码左移 MOV R2,A ;存位码 LCALL DELAY2MS ;延时2ms MOV DPTR,#OUTB ;消隐数码管,实际实验箱上不需要 MOV A,#0FFH ;消隐数码管,实际实验箱上不需要 MOVX @DPTR,A ;消隐数码管,实际实验箱上不需要 DEC R0 DJNZ R3,LOOP MOV A,#0FFH MOVX @DPTR,A ;熄灭所有数码管 RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H DB 92H, 82H, 0F8H,80H, 90H;==============================================;2ms延时子程序;使用寄存器:R7;对于11.0592MHz晶振,实际延时2174微秒=2.174ms;----------------------------------------------DELAY2MS: MOV R7,#250DD1: NOP NOP NOP NOP NOP NOP DJNZ R7,DD1 RET END
|