導航:首頁 > 編程語言 > 匯編語言的中斷程序實例

匯編語言的中斷程序實例

發布時間:2023-06-02 15:13:54

1. 用單片機匯編語言編寫中斷程序

ORG 0000H
LJMP START
ORG 000BH
LJMP Timer0Interrupt

START:
MOV SP,#60H
LCALL InitTimer0

LOOP:
;add your code here!
LJMP LOOP

InitTimer0:
MOV TMOD,#01H
MOV TH0,#0FCH
MOV TL0,#18H
SETB EA
SETB ET0
SETB TR0
RET

Timer0Interrupt:
PUSH DPH
PUSH DPL
PUSH ACC
MOV TH0,#0FCH
MOV TL0,#18H
CPL P1.0
POP ACC
POP DPL
POP DPH
RETI

END

這是定時器0的一個1ms中斷一次的程序 在P1.0埠輸出1KHz方波

2. 用匯編程序用定時器和中斷,編寫程序

主程序:
push ds ;保存數據段
mov ax,0000
mov ds,ax ;數據段清零
mov ax,offset irq7 ;取中斷程序入口地址
add ax,2000 ;加裝時IP=2000地址
mov si,003c ;填8259中斷7中斷矢量
mov w[si],ax ;填偏移量矢量
mov ax,0000 ;段地址CS=0000H
mov si,003e
mov w[si],ax ;填段地址矢量
pop ds ;彈棧
in al,21 ;讀8259中斷屏蔽字
and al,7f ;開8259中斷7
out 21,al
mov al,b4 ;8253的計數器2為方式2,採用二進制計數,先低後高寫入計數值 10110100
out 43,al ;寫入方式控制字
mov ax,2e9c 0010 1110 1001 1100B 11932D
out 42,al ;寫入低位元組計數值 1001 1100
mov al,ah
out 42,al ;寫入高位元組計數值 0010 1110
mov al,81 ;8255的A口為方式0輸出,B口為方式0輸出,C口下部輸入 1000 0001
out 63,al ;寫方式控制字
call first ;調用first子程序,賦計數初值
begi:hlt 延時等待
sti ;開中斷
mov ah,01
int 16 ;檢測是否按了鍵盤
jz begi
mov ah,00 ;讀鍵值
int 16
cmp al,0d ;是否按了回車
jnz A1
mov si,4000
not [si+04] ;偏移地址為4004的內存單元內容取反
jmp begi
A1:cmp al,1b ;是否按了ESC鍵
jnz A2
call first ;重新賦初值,相當於清零
A2:jmp begi
中斷程序:
irq7:call disp ;調用disp子程序,用來在數碼管顯示數據
mov si,4000
cmp [si+04],00 ;判斷是否按了第2次回車鍵
je A4
call addn ;調用addn子程序,用來計數
A4:mov al,20
out 20,al
cli ;關中斷
iret ;返回
addn程序:
addn:mov si,4000
add [si+03],01 ;百分之一秒加1
cmp [si+03],0a ;判斷是否大於10
jz A5
jmp A9
A5:mov [si+03],00
Add [si+02],01 ;十分之一秒加1
cmp [si+02],0a ;判斷是否大於10
jz A6
jmp A9
A6:mov [si+02],00
add [si+01],01 ;秒位加1
cmp [si+01],0a ;判斷是否大於10
jz A7
jmp A9
A7:mov [si+01],00
add [si],01 ;十秒位加1
cmp [si],06 ;判斷是否大於6
jz A8
jmp A9
A8:mov [si],00 ;大於60:00重新開始
A9: ret
賦初值程序:
first:mov si,4000
mov al,00
mov [si],al
mov [si+01],al
mov [si+02],al
mov [si+03],al
mov [si+04],al
ret
顯示程序:
disp:push ax ;保存AX
mov si,4000 ;指向數據緩沖區
mov dl,f7 ;1111 0111 指向數碼管
mov al,dl ;al=1111 0111
again:out 60,al ;寫埠A
mov al,[si]
mov bx,4100 ;指向數碼緩沖區 bx=0100 0001 0000 0000
and ax,00ff ; ax=0000 0000 al
add bx,ax ;得到顯示代碼 bx=0100 0001 al
mov al,[bx]
out 61,al ;寫埠B
call dally :調用延時程序dally
inc si
mov al,dl
test al,01
jz out
ror al,1 ;指向下一個數碼管
mov dl,al
jmp again
out: pop ax ;彈出AX
ret
dally:push cx ;延時程序
push ax
mov cx,0010
t1 :mov ax,0010
t2 dec ax
jnz t2
loop t1
pop ax
pop cx
ret
數碼緩沖區:
0000:4000 3f,06,5b4f,66,6d,7d,07,7f,6f
二、 設計思想
電子秒錶要實現的功能:用鍵盤中斷來控制整個程序,按一下回車鍵啟動電子秒錶,再按一下暫停,按一下ESC鍵清零,用七段數碼管顯示時間。整個程序涉及到8255、8253與8259三個晶元。8253的OUT2,CLK2分別連接8259的IRQ7與PCLK,8253的GATE2連接正5伏電壓,採用計數器2每隔0.01秒產生一次中斷並且計數,寫入以偏移地址4000H開始的4個內存單元,然後利用8255將內存單元的數據輸出到七段數碼管。由於鍵盤中斷優先於8259的7號中斷,所以程序只有在按一下回車鍵才啟動電子秒錶,再按一下暫停,按一下ESC鍵清零,如果超出了60秒,整個程序自動重新開始。
三、 所用晶元工作原理
8255:介面電路在CPU和I/O設備之間起著信號的變換和傳輸的作用。 任何介面電路與CPU之間的信息傳輸方式都是並行的,即CPU與介面電路之間以數據位元組/字為單位傳送信息。介面電路與I/O設備之間的信息傳送方式,有並行和串列兩種,相應的介面電路稱為並行介面和串列介面。
並行介面是在多根數據線上,以數據位元組/字與I/O設備交換信息。在輸入過程中,輸入設備把數據送給介面,並且使狀態線「輸入准備好」有效。介面把數據存放在「輸入緩沖寄存器」中,同時使「輸入回答」線有效,作為對外設的響應。外設在收到這個回答信號後,就撤消數據和「輸入准備好」信號。數據到達介面中後,介面會在「狀態寄存器」中設置輸入准備好標志,或者向CPU發一個中斷請求。CPU可用查詢方式或中斷方式從介面中讀取數據。介面中的數據被讀取後,介面會自動清除狀態寄存器中的標志,且撤消對CPU的中斷請求。
在輸出過程中,每當輸出寄存器可以接收數據,介面就會將狀態寄存器中「輸出准備好」狀態置1或向CPU發一個中斷請求,CPU可用查詢或中斷方式向介面輸出數據。當CPU輸出的數據到達介面後,介面會清除「輸出准備好」狀態,把數據送往外設,並向外設發一個「數據輸出准備好」信號。外設受到驅動後,便接收數據,並向介面電路發一個「輸出回答」信號,介面收到該回答信號後,又將狀態寄存器中「輸出准備好」置位,以便CPU輸出下一個數據。
8253:對CLK信號進行「減1計數」。首先CPU把「控制字」,寫入「控制寄存器」,把「計數初始值」寫入「初值寄存器」,然後, 定時/計數器按控制字要求計數。計數從「計數初始值 開始,每當CLK信號出現一次,計數值減1,當計數值減為0時,從OUT端輸出規定的信號(具體形式與工作模式有關)。當CLK信號出現時,計數值是否減1(即是否計數),受到「門控信號」GATE的影響,一般,僅當GATE有效時,才減1.門控信號GATE如何影響計數操作,以及輸出端OUT在各種情況下輸出的信號形式與定時/計數器的工作模式有關。
8259:1. IR線上提出了中斷請求的中斷源,即出現請求,IRR中斷請求寄存器(共有8位D7~D0)對應於連接在IR0~IR7線上的外設的中斷請求,哪一根輸入線有請求,哪一根輸入線就置1。
2. 若OCW1(IMR中斷屏蔽寄存器)未使該中斷請求屏蔽(對應位為0時不屏蔽),該請求被送入PR(優先權分析器)比較。否則,不送入PR比較。
3. PR把新進入的請求與ISR(服務中寄存器)中正在被處理的中斷進行比較。如果新進入的請求優先順序較低,則8259不向CPU提出請求。如果新進入的請求優先順序較高,則8259使INT引腳輸出高電平,向CPU提出請求。
4. 如果CPU內部的標志寄存器中的IF(中斷允許標志)為0,CPU不響應該請求。若IF=1,CPU在執行完當前指令後,從CPU的INTA引腳上向8259發出兩個負脈沖。
5.第一個 INTA負脈沖到達8259時,8259完成以下三項工作:
a.使IRR(中斷請求寄存器)的鎖存功能失效。這樣一來,在IR7~IR0上的請求信號就不會被8259接收。直到第二個INTA負脈沖到達8259時,才又使IRR的鎖存功能有效。
b.使ISR(服務中寄存器)中的相應位置1。
c.使IRR中的相應位清0。
6.第二個INTA負脈沖到達8259時,8259完成以下工作:
a.將中斷類型碼(ICW2中的值)送到數據匯流排上,CPU將其保存在「內部暫存器」中。
b.如果ICW4(它設定級中斷聯方式之特定完全嵌套方式,將在8259的工作方式中詳述ICW4)中設置了中斷自動結束方式,則將ISR的相應位清0。

3. 匯編語言 中斷程序代碼

還是找到了以前寫的,拿分來
;***************************
;purpose:ring and display a message every 10 seconds
;***************************
.model small
.stack 100h
.data
count dw 1
msg db 'The bell is ringing!',0dh,0ah,'$'
.code
main proc far
start:
mov ax,@data
mov ds,ax
mov al,1ch
mov ah,35h ;get interrupt vector
int 21h
push es
push bx
push ds

mov dx,offset ring
mov ax,seg ring
mov ds,ax
mov al,1ch
mov ah,25h
int 21h

pop ds
in al,21h
and al,11111110b
out 21h,al
sti
mov di,2000
delay:
mov si,3000
delay1:
dec si
jnz delay

pop dx
pop ds
mov al,1ch
mov ah,25h
int 21h
mov ah,4ch
int 21h
main endp
;---------------------
;purpose:ring every 10 seconds when substituted for interrupt 1ch
ring proc near
push ds
push ax
push cx
push dx
mov ax,@data
mov ds,ax
sti
dec count
jnz exit
mov dx,offset msg
mov ah,09h
int 21h

mov dx,100
in al,61h
and al,0fch
sound:
xor al,02
out 61h,al
mov cx,1400h
wait1:
loop wait1
dec dx
jne sound
mov count ,182
exit:
cli
pop dx
pop cx
pop ax
pop ds
iret
ring endp
end start

4. 當一個匯編語言中斷程序,運行到什麼時候,才能跳轉到中斷呢例子如下

嘿嘿。
這是定時器T0中斷,那麼就是定時器T0開始不斷加1,到TH0TL0為FFFF時,中斷產生。
如果是外部中斷,比如INT0腳 接一按鍵另一端摟地 ,按鍵 按下時,外中斷產生。

5. 匯編語言單片機中斷

ORG 00H ;開始地址
JMP MAIN ;跳轉到主程序
ORG 03H ;外部中斷0地址
JMP EXT1 ;跳轉
ORG 13H ;外部中斷1地址
JMP EXT2 ;跳轉

MAIN:
MOV IE, #85H ;使能中斷 0,1
SETB TCON.2 ;邊沿觸發
SETB TCON.0 ;邊沿觸發

SJMP $ ;--沒有這一句,程序,自己就去執行中斷函數了

EXT1:
MOV P2, #0 ;清0,點亮發光二極體
RETI

EXT2:
MOV P2, #0FFH ;置1,關閉
RETI

END

閱讀全文

與匯編語言的中斷程序實例相關的資料

熱點內容
word使用教程下載 瀏覽:295
電腦文件平鋪圖片默認大小 瀏覽:115
文件查看設置信息失敗 瀏覽:668
編程如何編出烏鴉喝水的課文 瀏覽:20
國家反詐app報案助手怎麼使用 瀏覽:439
秘密文件丟失多少天 瀏覽:237
js中csstext 瀏覽:382
目標文件名過長復制 瀏覽:892
樂動力計步器老版本 瀏覽:933
壓縮文件鏈接怎麼編輯 瀏覽:808
如何鎖定PDF文件里的圖章 瀏覽:89
資料庫超時是什麼 瀏覽:649
文件怎麼改整列內容 瀏覽:764
360壓縮文件發郵件空白 瀏覽:813
上哪裡查自己大數據 瀏覽:907
編程語言怎麼學車 瀏覽:189
編程該怎麼學才能先找工作 瀏覽:524
文件刻制光碟多少錢 瀏覽:861
校園網的網路組成結構 瀏覽:862
u盤系統復制文件過大 瀏覽:843

友情鏈接