修改如下,要把中斷服務子程式與主程式分開K1 BIT P1.0 ;秒按鍵設定K2 BIT P1.1 ;分按鍵設定K3 BIT P1.2 ;小時控設定SECOND EQU 30H ;定義秒為30HMIN EQU 31H ;定義分為31HHOUR EQU 32H ;定義時為32HORG 00HSJMP STARTORG 0BHLJMP TIMERORG 0040HSTART: ;開始MOV DPTR,#TABLE ;顯示初始值MOV HOUR,#0 ;時清零MOV MIN,#0 ;分清零MOV SECOND,#0 ;秒清零MOV R6,#0 ;初始脈衝清零MOV TMOD,#01H ;定時器工作方式1MOV TH0,#(65536-50000)/256 ;定時50毫秒MOV TL0,#(65536-50000)/256MOV IE,#82HSETB TR0KEY: ;秒、分、時的按鍵設定JNB K1,ADD_SECOND ;按一下,秒加1JNB K2,ADD_MIN ;按一下,分加1JNB K3,ADD_HOUR ;按一下,時加1LJMP KEY ;若無按鍵按下,返回按鍵設定KEYADD_SECOND: ;秒按鍵,子程式LCALL DELAY ;延時子程式,去抖動JB K1,KEY ;若K1=1,則跳轉到KEYINC SECOND ;秒值加1MOV A,SECOND ;秒的值傳入ACJNE A,#60,J0 ;判斷是否加到60秒MOV SECOND,#0 ;秒清零LJMP MIN ;跳轉到分ADD_MIN: ;分按鍵,子程式LCALL DELAY ;延時子程式,去抖動JB K2,KEY ;若K2=1,則跳轉到KEYINC MIN ;分鐘值加1MOV A,MINCJNE A,#60,J1 ;判斷是否加到60分MOV MIN,#0 ;分清零LJMP HOUR ;跳轉到小時ADD_HOUR: ;時按鍵,子程式LCALL DELAY ;延時子程式,去抖動JB K3,KEY ;若K3=1,則跳轉到KEYINC HOUR ;小時值加1MOV A,HOURCJNE A,#24,J2 ;判斷是否加到24小時MOV HOUR,#0 ;時清零MOV MIN,#0 ;分清零MOV SECOND,#0 ;秒清零LJMP KEYJ0: ;等待按鍵抬起JB K1,KEYSJMP J0J1:JB K2,KEYSJMP J1J2:JB K3,KEYMOV A,SECOND ;把秒的當前計時傳入A MOV B,#10 ;把數字10傳送到B DIV AB ;A除以B,高位為十位,低位為個位 CLR P3.6 ;秒十位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.6 ;顯示秒十位 MOV A,B CLR P3.7 ;秒個位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.7 ;顯示秒個位 MOV A,MIN MOV B,#10 DIV AB CLR P3.3 ;分十位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.3 ;顯示分十位MOV A,BCLR P3.4 ;分個位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.4 ;顯示分個位 MOV A,HOUR MOV B,#10 DIV AB CLR P3.0 ;時十位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.0 ;顯示時十位 MOV A,B ;時個位 CLR P3.1 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.1 ;顯示時個位 RET TABLE: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH DELAY: MOV R7,#250 DJNZ R7,$ RETORG 1000H;(如果程式儲存器為4KB,就改成 ORG 0E00H)TIMER: ;定時器中斷服務程式MOV TH0,#(65536-50000)/256 ;初脈衝50msMOV TL0,#(65536-50000)/256INC R6 ;脈衝加1MOV A,R6CJNE A,#20,EXIT ;脈衝計滿20次INC SECOND ;秒加1MOV R6,#0 ;脈衝清零MOV A,SECONDCJNE A,#60,EXIT ;秒滿60,返回顯示INC MIN ;分加1MOV SECOND,#0 ;秒清零MOV A,MINCJNE A,#60,EXIT ;分滿60,返回顯示INC HOUR ;時加1MOV MIN,#0 ;分清零MOV A,HOURCJNE A,#24,EXIT ;時滿24,返回顯示MOV HOUR,#0 ;時清零MOV MIN,#0 ;分清零MOV SECOND,#0 ;秒清零MOV R6,#0 ;脈衝清零EXIT:RETI END
中斷服務程式的返回指令 彙編助記符 reti 機器指令 32h
子程式的返回指令 彙編助記符 ret 機器指令 22h
修改如下,要把中斷服務子程式與主程式分開K1 BIT P1.0 ;秒按鍵設定K2 BIT P1.1 ;分按鍵設定K3 BIT P1.2 ;小時控設定SECOND EQU 30H ;定義秒為30HMIN EQU 31H ;定義分為31HHOUR EQU 32H ;定義時為32HORG 00HSJMP STARTORG 0BHLJMP TIMERORG 0040HSTART: ;開始MOV DPTR,#TABLE ;顯示初始值MOV HOUR,#0 ;時清零MOV MIN,#0 ;分清零MOV SECOND,#0 ;秒清零MOV R6,#0 ;初始脈衝清零MOV TMOD,#01H ;定時器工作方式1MOV TH0,#(65536-50000)/256 ;定時50毫秒MOV TL0,#(65536-50000)/256MOV IE,#82HSETB TR0KEY: ;秒、分、時的按鍵設定JNB K1,ADD_SECOND ;按一下,秒加1JNB K2,ADD_MIN ;按一下,分加1JNB K3,ADD_HOUR ;按一下,時加1LJMP KEY ;若無按鍵按下,返回按鍵設定KEYADD_SECOND: ;秒按鍵,子程式LCALL DELAY ;延時子程式,去抖動JB K1,KEY ;若K1=1,則跳轉到KEYINC SECOND ;秒值加1MOV A,SECOND ;秒的值傳入ACJNE A,#60,J0 ;判斷是否加到60秒MOV SECOND,#0 ;秒清零LJMP MIN ;跳轉到分ADD_MIN: ;分按鍵,子程式LCALL DELAY ;延時子程式,去抖動JB K2,KEY ;若K2=1,則跳轉到KEYINC MIN ;分鐘值加1MOV A,MINCJNE A,#60,J1 ;判斷是否加到60分MOV MIN,#0 ;分清零LJMP HOUR ;跳轉到小時ADD_HOUR: ;時按鍵,子程式LCALL DELAY ;延時子程式,去抖動JB K3,KEY ;若K3=1,則跳轉到KEYINC HOUR ;小時值加1MOV A,HOURCJNE A,#24,J2 ;判斷是否加到24小時MOV HOUR,#0 ;時清零MOV MIN,#0 ;分清零MOV SECOND,#0 ;秒清零LJMP KEYJ0: ;等待按鍵抬起JB K1,KEYSJMP J0J1:JB K2,KEYSJMP J1J2:JB K3,KEYMOV A,SECOND ;把秒的當前計時傳入A MOV B,#10 ;把數字10傳送到B DIV AB ;A除以B,高位為十位,低位為個位 CLR P3.6 ;秒十位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.6 ;顯示秒十位 MOV A,B CLR P3.7 ;秒個位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.7 ;顯示秒個位 MOV A,MIN MOV B,#10 DIV AB CLR P3.3 ;分十位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.3 ;顯示分十位MOV A,BCLR P3.4 ;分個位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.4 ;顯示分個位 MOV A,HOUR MOV B,#10 DIV AB CLR P3.0 ;時十位 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.0 ;顯示時十位 MOV A,B ;時個位 CLR P3.1 MOVC A,@A+DPTR MOV P0,A LCALL DELAY SETB P3.1 ;顯示時個位 RET TABLE: DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH DELAY: MOV R7,#250 DJNZ R7,$ RETORG 1000H;(如果程式儲存器為4KB,就改成 ORG 0E00H)TIMER: ;定時器中斷服務程式MOV TH0,#(65536-50000)/256 ;初脈衝50msMOV TL0,#(65536-50000)/256INC R6 ;脈衝加1MOV A,R6CJNE A,#20,EXIT ;脈衝計滿20次INC SECOND ;秒加1MOV R6,#0 ;脈衝清零MOV A,SECONDCJNE A,#60,EXIT ;秒滿60,返回顯示INC MIN ;分加1MOV SECOND,#0 ;秒清零MOV A,MINCJNE A,#60,EXIT ;分滿60,返回顯示INC HOUR ;時加1MOV MIN,#0 ;分清零MOV A,HOURCJNE A,#24,EXIT ;時滿24,返回顯示MOV HOUR,#0 ;時清零MOV MIN,#0 ;分清零MOV SECOND,#0 ;秒清零MOV R6,#0 ;脈衝清零EXIT:RETI END