新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 用8051單片機設計倒計時牌

        用8051單片機設計倒計時牌

        作者: 時間:2016-11-13 來源:網絡 收藏
        ;************* 電子定時器的設計******************;
        ;*MCU: AT892051 ;
        ;*MCU-crystal: 12M ;
        ;*Version: 01 ;
        ;*Last Updata: 2009-5-4 ;
        ;*Author:HaiZhiZi ;
        ;*Description: ;
        ;定時器T0、T1溢出周期為50MS,T0為秒計數用 ;
        ;S2為功能鍵、S3為方式選擇鍵 ;
        ;P1口為字符輸出口,采用共陽顯示管 ;
        ;P3.2~P3.5為位選,P1.7為報警發音,P3.7為被控繼電器 ;
        ;************************************************;

        ;******************
        ; 偽定義 ;
        ;******************
        SL EQU 30H ; SL存放秒的個位數
        SH EQU 31H ; SH存放秒的十位數
        ML EQU 32H ; ML存放分的個位數
        MH EQU 33H ; MH存放分的十位數
        HL EQU 34H ; HL存放時的個位數
        HH EQU 35H ; HH存放時的十位數
        ;
        L0 EQU 36H ; L0~L3:顯示數據存儲器
        L1 EQU 37H
        L2 EQU 38H
        L3 EQU 39H
        DSPLYP EQU 3AH ; 顯示數據指針(DISPLAY-POINT)
        PLYTS EQU 3BH ; 顯示次數計數器(DISPLAY-TIMES)
        ;
        LPLMOD BIT 39H ; 低兩位顯示方式(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 ; 加1子程序參數
        IFDEC BIT 20H ; BCD加法子程序參數
        ;
        R_MOD EQU 3FH ; 響鈴方式參數
        ;
        LED4 BIT 30H ; 發光管狀態位
        BELL BIT P1.7 ; 蜂鳴器
        SWITCH BIT P3.7 ; 繼電器
        FKEY BIT P3.0 ; 功能鍵 (S1)
        MKEY BIT P3.1 ; 修改鍵 (S2)
        ;
        WORKIN BIT 38H ; 工作狀態指示位
        ;

        ;******************
        ; 中斷入口 ;
        ;******************
        ORG 0000H
        START: LJMP MAIN ; 0000H 引向主程序
        LJMP ERR ; 0003H
        NOP
        NOP
        LJMP ERR ; 引向出錯處理程序
        LJMP PGT0 ; 000BH 引向中斷處理程序PGT0
        NOP
        NOP
        LJMP ERR ; 引向出錯處理程序
        LJMP ERR ; 0013H INT1
        NOP
        NOP
        LJMP ERR
        LJMP ERR ; 001BH T1
        NOP
        NOP
        LJMP ERR
        LJMP ERR ; 0023H
        NOP
        NOP
        LJMP ERR
        LJMP ERR ; 002BH
        NOP
        NOP
        ;
        ;************
        ; 主程序 ;
        ;************
        MAIN: MOV IE,#00H ; 關中斷
        MOV SP,#57H ; 設置堆棧指針
        MOV PSW,#00H ; 選用寄存器組0
        MOV TMOD,#11H ; 設定中斷工作方式為T0和T1
        ;
        MOV A,56H
        CJNE A,#0AAH,CSTART ; 判上電復位標志,無標志轉冷啟動
        MOV A,57H
        CJNE A,#55H,CSTART ; 無標志轉冷啟動
        AJMP HSTART ; 有上電復位標志轉熱啟動
        NOP
        NOP
        LJMP ERR ; 軟件陷阱,引向出錯處理程序
        CSTART: MOV P1,#0FFH ; 冷啟動,全面初始化
        MOV P3,#0FFH
        MOV TCON,#00H ; 計時停止
        MOV TL0,#0B0H ; 賦中斷T0初值
        MOV TH0,#3CH
        MOV TCOUNT,#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 ; LED4為數碼管之間的發光二極管
        SETB LPLMOD ; 設定顯示方式為閃爍
        SETB HPLMOD ;
        SETB BRIGHT ; 允許顯示
        CLR WORKIN ; 清工作標志 , 待命
        AJMP SETUP ; 轉開始工作
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        HSTART: MOV SCON,#00H ; 有上電標志,熱啟動,清串行口控制寄存器
        MOV IP,#00H ; 清中斷優先控制寄存器
        SETB FKEY ; 重設按鍵
        SETB MKEY
        SETB EA ; 開中斷
        AJMP BEGIN ; 轉向繼續工作
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        SETUP: SETB EA ; 開中斷
        ;
        MAIN1: ACALL DISPLY ; 調用顯示
        JB FKEY,JUDGE ; 按鍵掃描
        ACALL KEYDLY ; 延時消抖動
        JB FKEY,JUDGE ; 無鍵按下轉向判斷是否到點
        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
        NOP
        LJMP ERR ; 軟件陷阱
        WORK1: ;
        WORK2: CLR SWITCH ; 工作方式1和2:開繼電器
        AJMP MAIN2
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        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 ; 判斷秒是否為零
        JNZ MAIN1
        MOV A,ML ; 判斷分是否為零
        JNZ MAIN1
        MOV A,MH ; 判斷分是否為零
        JNZ MAIN1
        MOV A,HL ; 判斷時是否為零
        JNZ MAIN1
        MOV A,HH ; 判斷時是否為零
        JNZ MAIN1 ; 若時分秒全為零則
        CLR ET0 ; 停止計時
        CLR TR0 ;
        ACALL ACTION ; 調用到點工作子程序
        AJMP MAIN ; 返回
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;******************
        ; 倒計時程序 ;
        ;******************
        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.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 ; 移入分位的地址
        ACALL ADDBCD ; 分減1
        CJNE R3,#99H,OUTT0 ; 判斷分要否借位
        MOV MH,#05H
        MOV ML,#09H
        MOV R0,#HH
        ACALL ADDBCD
        OUTT0: POP DPH ; 恢復現場
        POP DPL
        POP PSW
        POP ACC
        SETB EA
        RETI ; 中斷返回
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;
        ;**************************
        ; 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 ; 交換
        ANL A,#0FH ; 取結果數的高位
        MOV @R0,A ; 存數
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;**************
        ; 加1程序 ;
        ;**************
        ADDONE: MOV R0,ADDRES ; 移入被加數單元的地址
        CLR IFDEC ; 設定BCD子程序做加法
        ACALL ADDBCD ; 調用BCD子程序
        CLR C ; 判斷被加數是否大于
        MOV A,R3 ; 最大值"MAX"
        CJNE A,MAX,JGOVER
        JGOVER: JC ENDADO
        CLR A ; 若大于"MAX",則清零
        MOV @R0,A
        DEC R0
        MOV @R0,A
        ENDADO: RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;******************
        ; 調時快進程序 ;
        ;******************
        QUICK: CLR LPLMOD ; 設定顯示方式不閃爍
        CLR HPLMOD
        ACALL ADDONE ; 調用加1子程序
        MOV L0,R4 ; 將工作模式選擇數移入顯存
        INC L0 ; 加1轉化成顯示值
        ACALL KEYDLY ; 延時
        ACALL DL100
        JNB MKEY,QUICK ; 判斷鍵是否松開
        SETB LPLMOD ; 若松開則恢復閃爍顯示方式
        CJNE R6,#02H,ENDQUK
        SETB HPLMOD
        CLR LPLMOD
        ENDQUK: RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;
        ;******************
        ; 功能菜單程序 ;
        ;******************
        MENU: MOV R6,#00H ; 初始化; R6 計功能鍵按鍵次數
        MOV ADDRES,#05H ; 將 R5 的地址送入,以便于改變 R4 的值
        MOV MAX, #04H ; 定義工作模式選擇寄存器R4 的最大值
        MOV DSPLYP,#L0 ; 定義顯示指針指向顯存
        SETB LPLMOD ; 設定低兩位數閃爍
        CLR HPLMOD
        MOV L0,R4 ; 送顯示數據"F-0X"
        INC L0
        MOV L1,#00H
        MOV L2,#0BH
        MOV L3,#00H
        SETB LED4
        ;
        WAITFK: ACALL DISPLY ; 等待F鍵釋放
        JNB FKEY,WAITFK
        MENU1: ACALL DISPLY
        JB MKEY,JGFKEY ; M鍵掃描
        ACALL KEYDLY ; 延時消抖動
        JB MKEY,JGFKEY ; 未按下則轉F鍵掃描
        CJNE R6,#00H,NEXT1 ;
        MOV SL,#00H ; 若中途改變定時方式,則清除原計時數據
        MOV SH,#00H
        MOV ML,#00H
        MOV MH,#00H
        MOV HL,#00H
        MOV HH,#00H
        NEXT1: MOV R2,#00H ; R2用于判斷按鍵時間是否超過0.5秒
        NEXT2: ACALL ADDONE ; 調用加1程序
        MOV L0,R4 ; 移入工作方式選擇數
        INC L0
        ;
        WAITMK: ACALL DISPLY ; 等待M鍵釋放
        INC R2 ; R2自增一
        CLR C
        CJNE R2,#0C8H,JGQUIC ; 若R2大于等于200則調用快進子程序
        JGQUIC: JC WATMK1
        ACALL QUICK
        WATMK1: JNB MKEY,WAITMK ; R2小于200則等待M鍵釋放
        ;
        JGFKEY: JB FKEY,MENU1 ; 功能(F)鍵掃描
        ACALL KEYDLY ; 延時消抖動
        JB FKEY,MENU1 ; 鍵未按下則轉修改(M)鍵掃描
        INC R6 ; F鍵按鍵次數加1
        MOV A,R6 ; 移入按鍵次數
        RL A ; 指針放大
        MOV DPTR,#FUNTAB
        JMP @A+DPTR ; 根據按鍵次數跳轉到相應的程序段
        FUNTAB: AJMP WAITFK
        AJMP SETLOW
        AJMP SETHI
        AJMP ENDMEN
        NOP
        NOP
        AJMP ENDMEN
        ;STWKMD: ; 工作模式設定,不需另外改變菜單
        ;
        SETLOW: MOV MAX,#60H ; 設置低位(秒位或分位)
        MOV A,R4 ; 移入工作模式選擇數
        RL A ; 指針放大
        MOV DPTR,#FTAB1
        JMP @A+DPTR ; 根據工作模式選擇數跳轉到相應的程序段
        FTAB1: AJMP SETSS
        AJMP SETM60
        AJMP SETSS
        AJMP SETM60
        NOP
        NOP
        AJMP WAITFK
        SETSS: MOV DSPLYP,#SL ; 設定顯示區域為MM:SS
        MOV ADDRES,#SH
        AJMP WAITFK
        SETM60: MOV DSPLYP,#ML ; 設定顯示區域為HH:MM
        MOV ADDRES,#MH
        AJMP WAITFK
        ;
        SETHI: CLR LPLMOD ; 設置高位(分位或時位)
        SETB HPLMOD ; 高兩位數碼管閃爍
        MOV MAX,#31H ; 最大數為30
        MOV A,R4 ; 移入工作模式選擇數
        RL A ; 指針放大
        MOV DPTR,#FTAB2 ; 移入表首地址
        JMP @A+DPTR ; 根據工作模式選擇數跳轉到相應的程序段
        FTAB2: AJMP SETM30
        AJMP SETHH
        AJMP SETM30
        AJMP SETHH
        NOP
        NOP
        AJMP WAITFK ; 返回等待鍵釋放
        SETM30: MOV ADDRES,#MH ; 移入分位的地址
        AJMP WAITFK ; 轉向等待鍵釋放
        SETHH: MOV ADDRES,#HH ; 移入時位的地址
        AJMP WAITFK ; 轉向等待鍵釋放
        ;
        ENDMEN: CLR HPLMOD ; 恢復不閃爍顯示方式
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;****************
        ; 到點工作程序 ;
        ;****************
        ACTION: MOV L0,R4 ; 移入工作模式選擇數
        INC L0 ; 送顯示數"F-0X"
        MOV L1,#00H
        MOV L2,#0BH
        MOV L3,#00H
        SETB LED4
        MOV DSPLYP,#L0 ; 指針指向顯存
        SETB LPLMOD ; 設定顯示方式不閃爍
        SETB HPLMOD
        MOV A,R4 ; 移入工作模式選擇數
        RL A ;
        MOV DPTR,#A_TAB
        JMP @A+DPTR ; 根據工作模式選擇數跳轉
        A_TAB: AJMP ACTF1 ; 工作模式一
        AJMP ACTF1 ; 工作模式二
        AJMP ACTF3 ; 工作模式三
        AJMP ACTF3 ; 工作模式四
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ACTF1: SETB SWITCH ; 工作模式一(或二): 關繼電器
        MOV R_MOD,#82H ; 響鈴模式參數#82H
        MOV R2,#96H ; 響鈴次數參數#96H
        ACTF11: ACALL RING ; 調用響鈴子程序
        JNB MKEY,ENDACT ; 等待鍵按下
        JNB FKEY,ENDACT ; 有鍵按下則結束響鈴
        DJNZ R2, ACTF11 ; 次數未滿繼續響鈴
        MOV R_MOD,#0FFH ; 參數#0FF使響鈴無效
        AJMP ACTF11 ; 無鍵按下返回
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ACTF3: CLR SWITCH ; 工作模式三(或四): 開繼電器
        CLR BELL ; 蜂鳴器短鳴一聲
        ACALL DL1S
        SETB BELL
        MOV R_MOD,#0FFH ; 響鈴模式參數#0FFH
        MOV R2,#96H ; 響鈴時間參數#96H
        ACTF31: ACALL RING ; 調用響鈴子程序
        JNB MKEY,ENDACT ; 等待鍵按下
        JNB FKEY,ENDACT ; 有鍵按下則結束
        DJNZ R2,ACTF31 ; 次數未滿繼續
        MOV R2,#96H ; 重新賦值
        CLR BELL ; 短鳴一聲(說明: 響鈴模式參數#0FFH使
        ACALL DL100 ; 響鈴程序無效,僅起延時作用,
        SETB BELL ; 每延時一段時間短鳴一聲,以
        AJMP ACTF31 ; 提醒使用者繼電器仍在工作)
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ENDACT: SETB SWITCH ; 關繼電器
        AWAITF: ACALL DISPLY ; 調用顯示
        JNB FKEY,AWAITF ; 等待鍵釋放
        AWAITM: ACALL DISPLY ; 調用顯示
        JNB MKEY,AWAITM ; 等待鍵釋放
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;**************
        ; 響鈴程序 ;
        ;**************
        RING: MOV R5,#18H ; R5為循環控制變量
        RING1: JNB MKEY,R_EXIT ; 鍵掃描
        JNB FKEY,R_EXIT ; 有鍵按下則退出
        MOV A,R_MOD ; 移入響鈴模式參數
        MOV C,ACC.7 ; 根據響鈴模式參數改變響鈴
        MOV BELL,C
        RL A
        MOV R_MOD,A
        ACALL DL100 ; 延時
        DJNZ R5,RING1 ; 循環次數控制
        R_EXIT: SETB BELL ; 關閉響鈴
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;**************
        ; 顯示程序 ;
        ;**************
        DISPLY: PUSH ACC ; 數據壓棧保護
        PUSH PSW
        MOV PSW,#10H ; 選用寄存器組2
        MOV R0,DSPLYP ; 移入顯示指針
        MOV R2,#0FDH ; R2寄存的是數碼管選通數
        MOV A,PLYTS ; 移入顯示循環控制量
        JNZ PLAY ; 不為0則轉PLAY
        MOV PLYTS,#64H ; 否則從新賦值
        CPL BRIGHT ; 亮滅指示位取反
        PLAY: DEC PLYTS ; 顯示循環控制量減1
        JNB LPLMOD,PLAYL ; 低兩位數碼管不閃則"PLAYL"
        JB BRIGHT,PLAYL ; 亮滅指示為1也"PLAYL"
        ACALL NOPLAY ; 否則滅燈延時
        AJMP PLAY1 ; 轉顯示高位數碼管
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;用來顯示低位
        PLAYL: ORL P1,#7FH ; 清原顯示數據
        ORL P3,#3CH ; 清原選通數據
        MOV A,R2 ; 移入數碼管位選數
        RL A ; 換一位
        ANL P3,A ; 選通低位的個位數碼管
        MOV R2,A ; 暫存位選數
        MOV A,@R0 ; 移入顯示數值
        MOV DPTR,#TABLE1 ; 移入表首地址
        MOVC A,@A+DPTR ; 查表
        ANL P1,A ; 送顯示數據
        ACALL DL1MS ; 延時
        INC R0 ; 指向低位的十位數
        JB P3.3,PLAYL ; 顯示低位的十位數
        ;
        PLAY1: JNB HPLMOD,PLAYH ; 高兩位數碼管不閃則"PLAYH"
        JB BRIGHT,PLAYH ; 亮滅指示為1也"PLAYH"
        ACALL NOPLAY ; 否則滅燈延時
        AJMP OUTPLY ; 轉結束
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;用來顯示高位
        PLAYH: ORL P1,#7FH ; 清原顯示數據
        ORL P3,#3CH ; 清原選通數據
        ANL P3,#0EFH ; 選通高位的個位數數碼管
        MOV A,@R0 ; 移入顯示數值
        MOV DPTR,#TABLE1 ; 移入表首地址
        MOVC A,@A+DPTR ; 查表
        ANL P1,A ; 送顯示數據
        ACALL DL1MS ; 延時
        INC R0 ; 指向高位的十位數
        ; ; 顯示高位的十位數
        ORL P1,#7FH ; 清原顯示數據
        ORL P3,#3CH ; 清原選通數據
        ANL P3,#0DFH ; 選通高位的十位數
        MOV A,@R0 ; 移入顯示數值
        MOV C,LED4 ; 指針放大+小燈狀態
        RLC A ;
        MOV DPTR,#TABLE2 ; 移入表首地址
        MOVC A,@A+DPTR ; 查表
        ANL P1,A ; 送顯示數據
        ACALL DL1MS ; 延時
        ;
        OUTPLY: POP PSW ; 恢復數據
        POP ACC
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        TABLE1: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
        ; "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
        ;
        TABLE2: DB 0FFH, 0DFH, 0F9H, 0D9H, 0A4H, 84H, 0B0H, 90H, 0BFH, 09FH
        ; " ", " :", "1 ", "1:", "2 ", "2:", "3 ", "3:", "- ", "-:"
        ;
        ;
        ;
        ;**********************
        ; 無顯示(滅燈)程序 ;
        ;**********************
        NOPLAY: ORL P1,#7FH ; 清顯示數據
        ORL P3,#3CH ; 清選通數據
        INC R0 ; 指針自增2
        INC R0
        ACALL DL1MS ; 延時
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;******************
        ; 延時程序 ;
        ;******************
        DL1MS: MOV R3,#0F9H ; 延時 1250US 只為DISPLY所調用
        DL1MS1: NOP
        NOP
        NOP
        DJNZ R3,DL1MS1
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        KEYDLY: CLR BELL ; 按鍵消抖動專用延時程序,
        ACALL DISPLY ; 在消除抖動的同時發出按鍵提示音
        SETB BELL
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        DL50MS: MOV R7,#0AH ; 50毫秒延時程序
        DL50M1: ACALL DISPLY ; 每調用一次顯示程序5MS
        DJNZ R7,DL50M1 ; 調用10次
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        DL100: ACALL DL50MS ; 延時100毫秒
        ACALL DL50MS
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        DL05S: ACALL DL100 ; 延時0.5秒
        ACALL DL100
        ACALL DL100
        ACALL DL100
        ACALL DL100
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        DL1S: ACALL DL05S ; 延時1秒
        ACALL DL05S
        RET
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ;****************************
        ; ERR(出錯處理) 程序 ;
        ;****************************
        ERR: CLR EA ; 關中斷
        MOV DPTR,#ERR1 ; 準備返回地址
        PUSH DPL ; 壓棧
        PUSH DPH ;
        RETI ; 中斷返回
        ERR1: MOV 56H,#0AAH ; 建立上電標志(出錯標志)
        MOV 57H,#55H
        MOV A,#00H ; 準備返回地址
        PUSH ACC ; 壓棧
        PUSH ACC
        RETI ; 中斷返回
        NOP
        NOP
        LJMP ERR ; 軟件陷阱
        ;
        ORG 07FAH
        NOP
        NOP
        NOP
        LJMP ERR ; 軟件陷阱

        END ; 程序結束


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 防城港市| 屏山县| 北宁市| 蕲春县| 新蔡县| 新疆| 杭锦旗| 开原市| 临洮县| 叙永县| 哈巴河县| 汤阴县| 梁山县| 清镇市| 钦州市| 和政县| 延安市| 吉木乃县| 武威市| 宁晋县| 乌拉特前旗| 高阳县| 绥江县| 古浪县| 天峨县| 谢通门县| 都昌县| 会宁县| 甘孜| 增城市| 台南市| 昂仁县| 榆树市| 博乐市| 拜城县| 丰原市| 青铜峡市| 闸北区| 冷水江市| 巍山| 肇州县|