這個題不用中斷更方便
#include<reg52.h>
#include<stdio.h>
int list[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
int list2[3] = {0x84,0x42,0x21};
int flag, i;
sbit s1 = P3^2;
void delay(int k)
{
int i, j;
for (i = 0; i < k; i++)
for (j = 0; j < k; j++);
}
void keyfind()
{
if (s1 == 0)
{
delay(3);
if (s1 == 0)
{
flag = 0;
}
}
}
void display()
{
if (flag == 0)
{
for (i = 0; i < 3; i++)
{
P1 = list2[i];
delay(120);
keyfind();
if (flag != 0)
{
break;
}
}
}
else
{
for (i = 0; i < 8; i++)
{
P1 = list[i];
delay(120);
keyfind();
if (flag !=1)
{
break;
}
}
}
}
void main()
{
flag = 1;
while(1)
{
display();
}
}
2. 單片機的中斷應該怎樣去寫程序單片機的中斷程序一般都要寫在特定的地方,或是有特定的格式要求。
中斷的響應是程序指針跳轉到這個中斷入口地址的過程,所以最好結合你使用的單片機的手冊看清楚中斷向量編號,地址也可以。進入一箇中斷程序,首先一般都要清楚中斷標誌位,如果這個中斷不允許被其他中斷所中斷,就需要禁止所有中斷並在退出這個中斷時允許中斷。
在中端程序裏儘量不要寫比較長的代碼,會嚴重影響單片機的效率,如果你不明白怎麼寫,就先了解你要用的單片機中關於中斷的用法,僅僅是中端還是比較好理解的,如果是和定時器等相關特殊功能寄存器結合的中斷你可能就需要更好地瞭解這塊單片機。先可以看看別人用這塊單片機寫的程序,然後再查閱些相關資料,再自己寫幾個程序試驗一下,就會熟悉的。
希望我說的這些可以幫到你。
3. 單片機中斷,寫中斷程序的格式是什麼,是固定的麼,程序是怎麼執格式是固定的
void 中斷名(void) interrupt n
這個中斷名你可以隨意取只要不是保留字就可以
n=0對應外部中斷0
n=1對應定時器0
n=2對應外部中斷1
n=3對應定時器1
n=4對應串口
。.
比如定時器0中斷服務程序
void isr_timer0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
P0=~P0;
}
4. 單片機c語言寫兩個中斷,兩個中斷怎麼寫//任務6 顯示按鍵按下的次數(中斷方式)
//任務6 顯示按鍵按下的次數(中斷方式)
#include <reg51.h> //1 包含特殊功能寄存器定義頭檔案reg51.h
#define ledport P2 //2 宏定義:ledport代表P2(發光二極管接P2口)
#define uchar unsigned char //3 宏定義:uchar代表unsigned char
#define ulong unsigned int //3 宏定義:ulong代表unsigned long
#define unsigned int j;
uchar m=0xef; //5 定義變量m:m用來儲存顯示控制數據,初值爲0xfe
ulong i;
sfr p1=0x90;
sbit led1=P1^0; //led引腳定義
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;
void fun1_int() interrupt 0 using 1//5 定義中斷服務函數:中斷號爲0,用第1組寄存器組
{
while(1) //while循環(永遠爲真,死循環)
{ //循環體開始
led1=~led1; //發光二級管的顯示狀態取反
led2=~led2;
led3=~led3;
led4=~led4;
for(j=0;j<12500;j++); //for循環,循環體爲空,耗時 //延時500ms
}
} //循環體結束
void fun2_int() interrupt 1 using 2//5 定義中斷服務函數:中斷號爲0,用第1組寄存器組
{
while(1) //7 while循環,條件表達式爲1,永遠爲真,死循環
{ //8 while循環體開始
P1=m; //9 P1口輸出當前顯示控制數據
m=(m<<1)|(m>>7); //10 顯示數據m向左循環移1位,爲下次顯示輸出作準備
for(i=0;i<60000;i++); //11 for循環實現1s延時,循環體爲空語句
} //12 while循環體結束
}
//8 中斷服務函數結束
void main(void) //9 main函數
{
EA=1;
EX0=0; //12 開外部中斷0
EX1=0;
IT1=1;
IT0=1; //11 設定外部中斷0的觸發方式:下降沿觸發。見代碼說明
while(1)
; //14 死循環,循環體爲空語句
} //15 main函數結束
//任務1 控制1只發光二極管閃爍顯示上面的註釋可以省略不看,
這個需要設定不同的寄存器,注意依稀俺這裏就可以了的,然後查一下數據手冊。
5. 單片機中斷函數如何編寫中斷服務程序的入口地址是相對固定的,而普通的功能程序入口則是隨意設定的,此外,中斷服務程序的調用方式也不同於普通的功能程序,中斷服務程序的調用是靠中斷申請信號,而非普通的程序。
在C51中,中斷服務程序同樣是一種特殊的函數,其標準形式如下。
void 函數名(void)interrupt n using m
{
函數體語句
}
此處的interrupt和using是C51的關鍵字,interrupt表示該函數是一箇中斷服務函數,n表示該中斷服務函數所對應的中斷源,中斷源與中斷編號的對應關係見表
Using用指定該中斷服務程序要使用的工作寄存器組號,m取值爲0~3,當不使用關鍵字using時,編譯系統將會把當前工作寄存器組的8個寄存器都壓入堆棧,中斷服務函數是由系統調用的,程序中的任何函數都不能調用中斷服務函數。
一般可以不使用using m.