圖1外部中斷及矩陣鍵盤中斷信號示意圖
外部中斷是單片機(jī)實(shí)時(shí)地處理外部事件的一種內(nèi)部機(jī)制。當(dāng)外部事件發(fā)生時(shí),單片機(jī)的中斷系統(tǒng)將迫使CPU暫停正在執(zhí)行的程序,轉(zhuǎn)而去進(jìn)行中斷事件的處理,中斷完畢后返回被中斷的程序處,繼續(xù)執(zhí)行下去。
中斷過程:
1.中斷當(dāng)前程序并保護(hù)斷點(diǎn)
2.轉(zhuǎn)入中斷服務(wù)入口
3.保護(hù)現(xiàn)場
4.執(zhí)行中斷服務(wù)程序
5.恢復(fù)現(xiàn)場
6.中斷返回
中斷的好處:
1、 提高了CPU的效率
CPU 是計(jì)算機(jī)的指揮中心,它與外圍設(shè)備(如按鍵、顯示器等)通訊的方法有查詢和中斷 2 種。
查詢的方法是無論外圍IO 是否需要服務(wù),CPU 每隔一段時(shí)間都要依次查詢一遍,這種方法 CPU 需要花費(fèi)一些時(shí)間在做查詢服務(wù)工作。
而中斷則是在外圍設(shè)備需要通訊服務(wù)時(shí)主動(dòng)告訴 CPU, CPU 停下當(dāng)前工作去處理中斷程序, 從而提高了CPU 效率。
2、 可以實(shí)現(xiàn)實(shí)時(shí)處理
外設(shè)任何時(shí)刻都可能發(fā)出請求中斷信號,CPU 接到請求后及時(shí)處理,以滿足實(shí)時(shí)系統(tǒng)的需要。
3、 可以及時(shí)處理故障
計(jì)算機(jī)系統(tǒng)運(yùn)行過程中難免會出現(xiàn)故障,有許多事情是無法預(yù)料的,如電源掉電、存儲器出錯(cuò)、外圍設(shè)備工作不正常等,這時(shí)可以通過中斷系統(tǒng)向中斷源 CPU 發(fā)送中斷請求,由 CPU 及時(shí)轉(zhuǎn)到相應(yīng)的出錯(cuò)處理程序,從而提高計(jì)算機(jī)的可靠性。
圖2中斷名稱
IE 中斷允許控制寄存器
圖3IE中斷允許控制寄存器
EA:EA = 0 時(shí),所有中斷禁止(即不產(chǎn)生中斷)。
EA = 1 時(shí),各中斷的產(chǎn)生由個(gè)別的允許位決定。
EX1:外部中斷INT1中斷允許。
EX0:外部中斷INT0中斷允許。
中斷程序格式:
圖4外部中斷程序格式
矩陣鍵盤中斷掃描程序:
#include< reg52.h > //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義#define KeyPort P0
sbit dula=P2^1;
sbit wela=P2^0;
unsigned char code DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71};// 顯示段碼值0~F
unsigned char num;
void DelayUs2x(unsigned char t);//us級延時(shí)函數(shù)聲明
void DelayMs(unsigned char t); //ms級延時(shí)
unsigned char KeyScan(void);//鍵盤掃描
unsigned char KeyPro(void);
void display(unsigned char aa);
/*------------------------------------------------
主函數(shù)
------------------------------------------------*/
void main (void)
{
dula=1;
P1=0xff;
dula=0;
wela=1;
P1=0x00;
wela=0;
EA=1; //全局中斷開
EX0=1; //外部中斷0開
IT0=1; //邊沿觸發(fā)
while (1) //主循環(huán)
{
display(num);
KeyPort=0xf0;// 賦值用于中斷檢測
}
}
void display(unsigned char aa)
{
dula=1;
P1=DuanMa[aa];
dula=0;
}
/*------------------------------------------------
uS延時(shí)函數(shù),含有輸入參數(shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時(shí)請使用匯編,大致延時(shí)
長度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延時(shí)函數(shù),含有輸入?yún)?shù) unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的范圍是
0~255 這里使用晶振12M,精確延時(shí)請使用匯編
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延時(shí)1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
按鍵掃描函數(shù),返回掃描鍵值
------------------------------------------------*/
unsigned char KeyScan(void) //鍵盤掃描函數(shù),使用行列逐級掃描法
{
unsigned char Val;
KeyPort=0xf0;//高四位置高,低四位拉低
if(KeyPort!=0xf0)//表示有按鍵按下
{
DelayMs(10); //去抖
if(KeyPort!=0xf0)
{ //表示有按鍵按下
KeyPort=0xfe; //檢測第一行
if(KeyPort!=0xfe)
{
Val=KeyPort&0xf0;
Val+=0x0e;
while(KeyPort!=0xfe);
DelayMs(10); //去抖
while(KeyPort!=0xfe);
return Val;
}
KeyPort=0xfd; //檢測第二行
if(KeyPort!=0xfd)
{
Val=KeyPort&0xf0;
Val+=0x0d;
while(KeyPort!=0xfd);
DelayMs(10); //去抖
while(KeyPort!=0xfd);
return Val;
}
KeyPort=0xfb; //檢測第三行
if(KeyPort!=0xfb)
{
Val=KeyPort&0xf0;
Val+=0x0b;
while(KeyPort!=0xfb);
DelayMs(10); //去抖
while(KeyPort!=0xfb);
return Val;
}
KeyPort=0xf7; //檢測第四行
if(KeyPort!=0xf7)
{
Val=KeyPort&0xf0;
Val+=0x07;
while(KeyPort!=0xf7);
DelayMs(10); //去抖
while(KeyPort!=0xf7);
return Val;
}
}
}
return 0xff;
}
/*------------------------------------------------
按鍵值處理函數(shù),返回掃鍵值
------------------------------------------------*/
unsigned char KeyPro(void)
{
switch(KeyScan())
{
case 0x7e:return 0;break;//0 按下相應(yīng)的鍵顯示相對應(yīng)的碼值
case 0x7d:return 1;break;//1
case 0x7b:return 2;break;//2
case 0x77:return 3;break;//3
case 0xbe:return 4;break;//4
case 0xbd:return 5;break;//5
case 0xbb:return 6;break;//6
case 0xb7:return 7;break;//7
case 0xde:return 8;break;//8
case 0xdd:return 9;break;//9
case 0xdb:return 10;break;//a
case 0xd7:return 11;break;//b
case 0xee:return 12;break;//c
case 0xed:return 13;break;//d
case 0xeb:return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
}
}
/*------------------------------------------------
外部中斷0程序
------------------------------------------------*/
void ISR_INT0(void) interrupt 0
{
num=KeyPro();
IE0=0;
}
接線方式:
杜邦線連接(用杜邦線連接<單片機(jī) IO>和<模塊接口>)
表6.1接線
-
單片機(jī)
+關(guān)注
關(guān)注
6035文章
44554瀏覽量
634629 -
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211574 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41470 -
矩陣鍵盤
+關(guān)注
關(guān)注
7文章
206瀏覽量
31454 -
外部中斷
+關(guān)注
關(guān)注
1文章
131瀏覽量
15816
發(fā)布評論請先 登錄
相關(guān)推薦
評論