① c語言怎麼編寫單片機的中斷
外部中斷(INT0):
I0(void)
interrupt
0//interrupt
0用於外部中斷INT0
{//中斷執行的內容}
定時器/計數器中斷(T0):
T0(void)
interrupt
1//interrupt
1用於定時器/計數器T0
{//中斷執行的內容}
外部中斷(INT1):
I1(void)
interrupt
2//interrupt
2用於外部中斷INT1
{//中斷執行的內容}
定時器/計數器中斷(T1):
T1(void)
interrupt
3//interrupt
3用於定時器/計數器T1
{//中斷執行的內容}
② 怎樣用C語言編寫一個DOS下的中斷服務程序
DOS中斷中斷屬於匯編層面的內容,可以用asm內聯實現:
在windows visual c++下用__asm關鍵字。
在gcc下用__asm__宏即可。
示例(vc):
#include<stdio.h>
intmain()
{
__asmint3h;
return0;
}
這樣就可以在C裡面寫入匯編代碼了。
__asm關鍵字用於調用內聯匯編程序,並且可在 C 或 C++ 語句合法時出現。它不能單獨出現。必須後跟匯編指令、一組在大括弧中的命令、或者至少一對空大括弧。術語 「__asm塊」在此處指任何命令或命令組,不管是否在大括弧內。
如果不與大括弧一起使用,則__asm關鍵字表示此行的其餘部分是一條匯編語言語句。如果與大括弧一起使用,則該關鍵字表示大括弧之間的每一行都是一條匯編語言語句。為了與早期版本兼容,_asm是__asm的同義詞。
由於__asm關鍵字是語句分隔符,因此您可以將程序集指令放在同一行中。
在 Visual C++ 2005 之前,指令
__asm int 3
不會導致在使用/clr編譯時生成本機代碼;編譯器會將該指令轉換為 CLR 中斷指令。
__asm int 3現在將導致為函數生成本機代碼。如果您希望函數導致代碼中出現斷點,還希望將函數編譯為 MSIL,請使用__debugbreak。
③ c語言中斷
標准c語言沒有中斷調用機制,但是不同編譯器都有相應的中斷處理方式,可以使用戶實現中斷功能。
下面是我曾經寫過的一片跟中斷有關的東西,希望對你有幫助。
~~~~~~~~~~~~~~~~~~~~~~~~~
曾經設計俄羅斯方塊,採取延時的方法,比如每次循環延時100毫秒,但是這個期間無法響應鍵盤的請求,游戲總的來說感覺卡卡的。
現在想想解決方案還真不少:
1、採取輪詢的方式解決,就是每10毫秒檢查一下是否有鍵盤請求,總的來說,這樣基本上可以解決問題,而且簡單易行,但每10毫秒都要檢查,系統消耗太大。
2、採取中斷的方式:
(1)用高級語言調用中斷來處理問題。中斷是cpu響應一個中斷外圍設備8259A的一個過程,當鍵盤敲擊,cpu保存斷點暫停執行並且跳到相應的中斷處理程序繼續執行,結束後根據斷點再跳回來。通過這種方式可以輕松+愉快地解決這個問題。但是需要用到高級語言調用匯編,根據編譯器的不同而有所差別。
(2)自己模擬中斷。可以另外建立一個線程專門響應鍵盤的敲擊,如果有敲擊則打斷主線程。這樣做實現起來很復雜,而且涉及到不少復雜的關鍵技術,比如信號量之類的鬼東西~。
3、強大的vc
原來一直感覺vc只是一個編譯器,現在才發現,vc也可以是一種語言。vc採取了消息映射的機制來處理外部設備的請求,比如時鍾中斷、鍵盤中斷等等。通過此可以灰常灰常容易的處理外部中斷。
④ 怎樣在C語言中使用中斷函數
首先你要寫中斷函數
然後在主程序中像調用子函數一樣調用就可以了
舉個例子吧
#define uchar unsigned char
#define uchar unsigned char
sbit D1=P1^0;
uchar aa;
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(aa==20)
{
D1=~D1;
aa=0;
}
}
}
void T0time()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
⑤ 如何用c語言編寫一個可中斷的程序
/*
bioskey函數介紹
函數原型:int bioskey (int cmd)
說明:bioskey()的函數原型在bios.h中
bioskey()完成直接鍵盤操作,cmd的值決定執行什麼操作。
cmd = 0:
當cmd是0,bioskey()返回下一個在鍵盤鍵入的值(它將等待到按下一個鍵)。它返回一個16位的二進制數,包括兩個不同的值。當按下一個普通鍵時,它的低8位數存放該字元的ASCII碼;對於特殊鍵(如方向鍵、F1~F12等等),低8位為0,高8位位元組存放該鍵的掃描碼。
cmd = 1:
當cmd是1,bioskey()查詢是否按下一個鍵,若按下一個鍵則返回非零值,否則返回0。
cmd = 2:
當cmd是2,bioskey()返回Shift、Ctrl、Alt、ScrollLock、NumLock、CapsLock、Insert鍵的狀態。各鍵狀態存放在返回值的低8位位元組中。
位元組位 含義
0 右邊Shift鍵狀態
1 左邊Shift鍵狀態
3 Ctrl鍵狀態
4 Alt鍵狀態
5 ScrollLock鍵狀態
6 NumLock鍵狀態
7 CapsLock鍵狀態
8 Insert鍵狀態
*/
#include<bios.h>
#include<time.h>
#include<stdio.h>
int main()
{
char c;
while(1)
{
if(bioskey(1)!=0){c=getch();if(c=='q')break;system("pause");}
printf("Hello world!\n");
}
}
⑥ C語言中是怎麼實現中斷的能提供點資料或舉幾個例子更好……
中斷大概是這樣的。。。如果有點錯誤不要怪我。。。我以前作過滑鼠中斷的東西。。現在有些想不起來了。。。所以。。。呵呵呵。。。
當程序運行到中斷條件的時候,會向CPU發信號改變優先順序(原先運行的東西會放進哪個特定的地方的,作保存),以發出中斷的那段程序作為最高優先,執行完成後再由執行另外的。。。建議你去看看匯編。。。哈哈哈。。。我沒學過的。。。
C中實現中斷是用了一個函數:geninterrupt(...) 這個「...」是個16進制的數字,是中斷號,像滑鼠中斷號就是0x33
還要用到類似匯編里寄存器模樣的變數:如_AX,_BX,_CX,_DX...不同的值功能不同。。。哎呀,我都忘完了。。。建議去查下geninterrupt()的用法就OK了。。。
⑦ C語言中是怎麼實現中斷的能提供點資料或舉幾個例子更好……
中斷大概是這樣的。。。如果有點錯誤不要怪我。。。我以前作過滑鼠中斷的東西。。現在有些想不起來了。。。所以。。。呵呵呵。。。
當程序運行到中斷條件的時候,會向CPU發信號改變優先順序(原先運行的東西會放進哪個特定的地方的,作保存),以發出中斷的那段程序作為最高優先,執行完成後再由執行另外的。。。建議你去看看匯編。。。哈哈哈。。。我沒學過的。。。
C中實現中斷是用了一個函數:geninterrupt(...)
這個「...」是個16進制的數字,是中斷號,像滑鼠中斷號就是0x33
還要用到類似匯編里寄存器模樣的變數:如_AX,_BX,_CX,_DX...不同的值功能不同。。。哎呀,我都忘完了。。。建議去查下geninterrupt()的用法就OK了。。。
⑧ c語言的中斷如何實現
一般循環的中斷用break(直接跳出循環)或者continue(跳到循環末尾)
⑨ 如何用c語言編寫一個可中斷的程序
駐留程序
通俗點講
就是
程序運行完了,
還要保留
臨時數據
和
運行狀態,
等下一次
調用時
繼續
執行
和普通程序的
區別:
普通程序(如一個
子函數)
調用完了
,
臨時數據
就
不需要了,
分配的
內存
空間
就
回收了,
而
駐留程序
是
要保留這些的
駐留
程序
主要
用於
中斷函數
,
非中斷函數
也
有應用,較少。分別舉個例子:
1)用於
中斷:
假設
一個
用
定時器
做的
時鍾函數,定時器
設置為
1s一個中斷。
main()
{
顯示
時間
hour,min,sec;
//
循環
刷屏顯示
}
中斷函數
{
sec++;
if(sec>=60)
{
sec=0;
min++;
}
if(min>=60)
{
min=0;
hour++;
}
if(hour>=24)
{
hour=0;
}
}
這時候
就能看出,
中斷程序
在
運行完的
時候
不能
把
3個
變數
清空,
因為
下次
中斷
還要用到
上次的
值,
這個程序
要
一直
駐留
內存;
2)再來個
普通
函數的
假設
做了一個程序
,程序中
有一個
函數aa,而
函數
aa
我只能
讓它執行
3次就得
關閉程序(這個
用在
密碼
驗證上)
aa()
{
密碼驗證次數n+1
返回n
和
驗證結果
}
那這個
aa函數
在
密碼
驗證
階段
就要
常駐
內存