-5898bb56cd2ce299.png (140.11 KB, 下載次數: 33)
下載附件
2021-6-19 01:19 上傳
IMG_202106170_005156323.png (248.43 KB, 下載次數: 30)
下載附件
2021-6-19 01:19 上傳
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
|