一、準備工作
1、KEIL C51編譯環境
2、CodeGen8 代碼生成器
3、MC96F6332D 開發板
4、USB-OCD II仿真器
二、生成外部引腳中斷的代碼
1、在CodeGen8 代碼生成器的外設窗口中選擇內部RC時鐘作爲時鐘源,設置時鐘源的頻率爲8MHz,配置GPIO引腳P02和P52分別爲外部的可中斷輸入引腳,使能MCU內部的上拉電阻和防抖動功能;具體配置如下圖①、②所示,GPIO配置生成的代碼如下圖⑧所示:
2、配置外部中斷引腳的中斷方式爲下降沿觸發(因爲有配置引腳內部的上拉電阻),使能引腳的中斷功能;GUI的配置見下圖⑤、⑥所示,在下圖⑦中可以看到配置後的引腳高亮顯示了當前的引腳複用功能;中斷功能配置生產的代碼如上圖③所示;
3、點擊CodeGen8 中的C 圖標,自動打開KEIL C51軟件;下一步進行代碼的修改、編譯和程序下載
4、在中斷函數中添加代碼,對外部中斷進行狀態標誌,避免在中斷函數中進行數據的處理(中斷函數講究快進快出);
//定義2個全局變量,用來表示外部中斷的狀態
unsigned char EXIT8_STA = 0;
unsigned char EXIT0_STA = 0;
//======================================================
// interrupt routines
//======================================================
void INT_Ext8() interrupt 6
{
// External interrupt 8
EXIT8_STA = 1; //外部中斷8標誌使能
}
void INT_Ext0_7() interrupt 5
{
// External interrupt 0 ~ 7
//判斷外部引腳0是否被按下
if(EIFLAG0 & 0x01)
{
EIFLAG0 &= 0xFE;
EXIT0_STA = 1; //外部中斷0標誌使能
}
}
特別注意:外部中斷0-7中斷後需要軟件手動清除標誌位;在規格書中也同樣有體現:
5、關於引腳的方向和上拉寄存器在此不再贅述,之前的GPIO章節有詳細講解;
此處針對消抖做下介紹:現代單片機MCU內部可以對引腳進行消抖處理,所以引腳外部可以不增加濾波電容或電阻等硬件電路;關於消抖的使用:需要先配置消抖的時鐘,然後對需要消抖的I/O口進行配置即可;消抖時鐘寄存器和端口引腳的消抖配置如下圖所示:
6、關於外部中斷的觸發條件配置:MCU外部的中斷觸發有3種可供選擇,一般情況下會選用最多的是上升或下降沿觸發,因爲之前GPIO引腳有配置內部的上拉電阻,所以此處配置爲下降沿觸發;
特別注意:在代碼生成器中自動生成的EIPOL1寄存器配置爲了0x56;見文章前面的圖④所示:此處應該配置0x02即可;
建議:因爲外部中斷設置都是單獨打開和關閉,所以只要使用的中斷引腳觸發條件配置正確即可,當然還是推薦採用正確配置,便於之後代碼的調試工作。
7、使能外部引腳對應的中斷,可以看到總中斷的開關也是在IE寄存器中進行配置。
外部中斷8在IE1寄存器中進行配置,如下圖所示:
8、在主函數中增加判斷外部中斷標誌的代碼
//主函數中增加如下代碼
if(EXIT8_STA) //判斷外部中斷8是否存在
{
EXIT8_STA = 0;
printf("EXIT 8 Interrupt.\r\n");
}
else if(EXIT0_STA) //判斷外部中斷0是否存在
{
EXIT0_STA = 0;
printf("EXIT 0 Interrupt.\r\n");
}
9、點擊編譯器的下載按鈕,將剛剛編譯好的代碼下載到MCU中進行調試仿真。
10、連接串口助手到PC端,可以看到代碼可以正常運行。
三、實驗現象(具體內容可以參考工程中的Readme.txt文件)
1、MCU主頻選擇爲內部8MHz;
2、當引腳P02和P52有下降沿時會觸發中斷,在主函數中會判斷對應的中斷狀態是否爲真,如果爲真,串口會打印對應的中斷內容提示有中斷觸發,見上圖;
3、具體的代碼可以訪問鏈接:https://share.weiyun.com/5efkBCB;進行免費下載。
因爲小編自己能力水平有限,文中難免有錯誤或表達失誤的信息,還望廣大閱讀者留言批評指正,謝謝。