外部中斷典型實驗案例分享
大小:0.15 MB 人氣: 2017-09-06 需要積分:0
1、兩個外部中斷實驗
/* ch06-3-3.c - 兩個外部中斷實驗 *///==聲明區===================================
#include?
#define?LED?P1???//?定義LED接至Port 1
void delay1ms(int);??//?聲明延遲函數?
void left(int);???//?聲明單燈左移函數?
void right(int);??//?單燈右移函數開始
//==主程序===================================
main()?????//?主程序開始?
{?IE=0x85;???//?準許INT 0,INT 1中斷(6-4頁)
?IP=0x01;???//?設定INT 0具有最高優先權(6-5頁)
?LED=0x00;???//?初值=0000 0000,燈全亮?
?while(1)???//?無窮循環,程序一直跑?
?{?delay1ms(250);?//?延遲250 1m=0.25s?
??LED=~LED;??//?LED反相?
?}?????//?while循環結束?
}??????//?主程序結束?
//==子程序===================================
/* INT 0的中斷子程序 - 單燈左移3圈 */
void my_int0(void) interrupt 0?//?INT0 中斷子程序開始?
{?unsigned saveLED=LED;?//?儲存中斷前LED狀態?
?left(3);???//?單燈左移3圈?
?LED=saveLED;??//?寫回中斷前ED狀態???
}??????//?結束INT0 中斷子程序?
/* INT 1的中斷子程序 - 單燈右移3圈 */
void my_int1(void) interrupt 2?//?INT1 中斷子程序開始?
{?unsigned saveLED=LED;?//?儲存中斷前LED狀態?
?right(3);???//?單燈右移3圈?
?LED=saveLED;??//?寫回中斷前LED狀態?
}??????//?結束INT1 中斷子程序?
/* 延遲函數,延遲約x 1ms */
void delay1ms(int x)?//?延遲函數開始?
{?int i,j;???//?聲明整數變數i,j?
?for (i=0;i
}??????//?延遲函數結束?
/* 單燈左移函數,執行x圈 */
void left(int x) ??//?單燈左移函數開始?
{?int i, j;???//?聲明變數i,j
?for(i=0;i
??for(j=0;j<7;j++)?//?j循環,左移7次?
??{?delay1ms(250);?//?延遲250 1m=0.25s
???LED=(LED<<1)|0x01; ?//?左移1位後,LSB設為1
??}????//?j循環結束?
??delay1ms(250);?//?延遲250 1m=0.25s
?}?????//?i循環結束*/
}??????//?單燈左移函數結束?
/* 單燈右移函數,執行x圈 */
void right(int x) ??//?單燈右移函數開始
{?int i, j;???//?聲明變數i,j
?for(i=0;i
??for(j=0;j<7;j++)//?j循環,右移7次?
??{?delay1ms(250);?//?延遲250 10m=0.25s
???LED=(LED>>1)|0x80; ?//?右移1位後,MSB設為1
??}????//?j循環結束?
??delay1ms(250);?//?延遲250 1m=0.25s
?}?????//?i循環結束*/
}??????//?單燈右移函數結束?
?
2、INT1中斷實驗
/* ch06-3-2.c - INT1中斷實驗 *///==聲明區====================================
#include?
#define?SEG?P0?//?定義七節顯示器接至Port 0
void delay1ms(int);?//?聲明延遲函數?
/* 聲明七節顯示器驅動信號陣列(共陽) */
unsigned char code TAB[]={?0xc0, 0xf9, 0xa4, 0xb0, 0x99,?//數字0-4
?????????? ?0x92, 0x83, 0xf8, 0x80, 0x98 };?//數字5-9
//==主程序=====================================
main()?????//?主程序開始 ?
{?int i;????//?聲明i變數(計數值)
?IE=0x84;???//?準許INT 1中斷(6-4頁)
?while(1)???//?無窮循環,程序一直跑?
?{?for(i=0;i<10;i++)?//?顯示0-9(上數)
??{?SEG=TAB[i];?//?顯示數字至七節顯示器?
???delay1ms(500);?//?延遲500 1m=0.5s?
??}
?}?????//?for循環結束?
}??????//?主程序結束?
//==子程序===================================
/* INT 1的中斷子程序 - 數字閃爍倒數9-0 */
void my_int1(void) interrupt 2? //?INT1 中斷子程序開始?
{?int i;????//?聲明i變數(計數值)
?for (i=9;i>=0;i--)?//?for循環顯示9-0(下數)
?{?SEG=TAB[i];??//?顯示數字至七節顯示器?
??delay1ms(250);?//?延遲500 1m=0.5s?
??SEG=0xff;??//?關閉七節顯示器?
??delay1ms(250);?//?延遲500 1m=0.5s?
?}?????//?for循環結束?
}??????//?結束中斷子程序?
/* 延遲函數,延遲約x*1ms */
void delay1ms(int x)?//?延遲函數開始?
{?int i,j;???//?聲明整數變數i,j?
?for (i=0;i
}??????//?延遲函數結束?
?
3、INT0中斷實驗
/* ch06-3-1.c - INT0中斷實驗 *///==聲明區===================================
#include?
#define?LED?P1???//?定義LED接至Port 1
void delay1ms(int);??//?聲明延遲函數?
void left(int);???//?聲明單燈左移函數?
//==主程序===================================
main()?????//?主程序開始?
{?IE=0x81;???//?準許INT 0中斷(6-4頁)
?LED=0x00;???//?初值=0000 0000,燈全亮?
?while(1)???//?無窮循環,程序一直跑?
?{?delay1ms(250);?//?延遲250*1m=0.25s?
??LED=~LED;??//?LED反相?
?}?????//?while循環結束?
}??????//?主程序結束?
//==子程序===================================
/* INT 0的中斷子程序 - 單燈左移3圈 */
void my_int0(void) interrupt 0?//?INT0 中斷子程序開始?
{?unsigned saveLED=LED;?//?儲存中斷前LED狀態?
?left(3);???//?單燈左移3圈?
?LED=saveLED;??//?寫回中斷前LED狀態?
}??????//?結束INT0 中斷子程序?
/* 延遲函數,延遲約x 1ms */
void delay1ms(int x)?//?延遲函數開始?
{?int i,j;???//?聲明整數變數i,j?
?for (i=0;i
}??????//?延遲函數結束?
/* 單燈左移函數,執行x圈 */
void left(int x) ??//?單燈左移函數開始?
{?int i, j;???//?聲明變數i,j
?for(i=0;i
??for(j=0;j<7;j++)//?j循環,左移7次?
??{?delay1ms(250);?//?延遲250*1m=0.25s
???LED=(LED<<1)|0x01; ?//?左移1位後,LSB設為1
??}????//?j循環結束?
??delay1ms(250);?//?延遲250*1m=0.25s
?}?????//?i循環結束*/
}???? ?//?單燈左移函數結束?
4、4x4鍵盤實驗
/* ch06-3-4.c - 4x4鍵盤實驗,外部INT0(P3.2) *///==聲明區===================================
#include?
#define?LED?P1???//?定義LED接至Port 1
#define?KEYBCD? P2? ?// 定義接鍵盤掃瞄(低4位元)及BCD輸出(高4位元)
#define?RR(x)?(x==0x7f)? 0xfe:(x<<1)|0x01?// x向左旋轉1bit
void delay1ms(int);?//?聲明延遲函數?
//==主程序===================================
main()?????//?主程序開始?
{?IE=0x81;???//?準許INT 0中斷(6-4頁)
?LED=0xfe;???//?初值=1111 1110,最右燈亮?
?while(1)???//?無窮回圈,程序一直跑?
?{?delay1ms(250);?//?延遲250 1m=0.25s
??LED=RR(LED);?//?LED向左旋轉1bit
?}?????//?while回圈結束?
}??????//?主程序結束?
//==子程序===================================
/* 延遲函數,延遲約x 1ms */
void delay1ms(int x)?//?延遲函數開始?
{?int i,j;???//?聲明整數變數i,j?
?for (i=0;i
}??????//?延遲函數結束?
/* INT 0的中斷子程序 - 單燈左移3圈 */
void my_int0(void) interrupt 0?//?INT0 中斷子程序開始?
{?unsigned saveLED=LED;?//?儲存中斷前LED狀態?
?KEYBCD=0xff;??//?規劃輸入?
?KEYBCD>>=4;???//?高四位元移至低四位元?
?LED=saveLED;??//?寫回中斷前ED狀態?
}??????//?結束INT0 中斷子程序?
?
?
5、4x4鍵盤與4個7節顯示器實驗
/* ch05-4-4.c - 4x4鍵盤與4個7節顯示器實驗, P1.4~7為共用掃描信號 *//* P1.0~3為鍵盤輸入值,P2為7節顯示器直接輸出 */
//==聲明區================================================
#include?
#define?KEYP? P2???// 掃瞄輸出端口(高位元)及鍵盤輸入端口(低位元)
#define?SEG7P? P0?? ?// 7節顯示器(g~a)輸出埤?
unsigned char code TAB[17]=?// 共陽7節顯示器(g~a)編碼?
{ ?0xc0, 0xf9, 0xa4, 0xb0, 0x99,?// 數字0-4
? ?0x92, 0x82, 0xf8, 0x80, 0x98, ?// 數字5-9
? ?0xa0, 0x83, 0xa7, 0xa1, 0x84, ?// 字母a-e(10-14)
? ?0x8e, 0xbf};? ???// 字母F(15),負號(-)
unsigned char disp[4]={ 0xbf, 0xbf, 0xbf, 0xbf }; // 顯示陣列初值為負號(-)
unsigned char scan[4]={ 0xef, 0xdf ,0xbf ,0x7f }; // 7顯示器及鍵盤之掃瞄碼?
void? delay1ms(int);???// 聲明延遲函數?
void? scanner(void);???// 聲明掃瞄函數?
//==主程序================================================
main()???????// 主程序開始?
{?while(1)?????// 無窮回圈,程序一直跑?
?scanner();?????// 掃瞄鍵盤及顯示7段顯示器?
}????????// 主程序結束?
// === 延遲函數,延遲約x*1ms ================================
void delay1ms(int x)???// 防彈跳函數開始?
{?int i,j;?????// 聲明整數變數i?
?for(i=0;i
}????????// 防彈跳函數結束?
// ======= 掃瞄4*4鍵盤及4個7節顯示器函數 ================
void scanner(void)????// 掃瞄函數開始?
{?unsigned char col,row,dig;? // 聲明變數(col:行,row:列,dig:顥示位)
?unsigned char rowkey,kcode;?// 聲明變數(rowkey:列鍵值,kcode:按鍵碼)
?for(col=0;col<4;col++)??? ?// for回圈,掃瞄第col行?
?{?KEYP? = scan[col];??// 高4位輸出掃瞄信號,低4位元輸入列值?
??SEG7P = disp[col];??// 輸出第col行數字?
??rowkey= ~KEYP & 0x0f;
??// 讀入KEYP低4位,反相再清除高4位求出列鍵值?
??if(rowkey != 0)???// 若有按鍵?
??{?if(rowkey == 0x01)???? ?row=0;?// 若第0列被按下?
???else if(rowkey == 0x02)?row=1;?// 若第1列被按下?
???else if(rowkey == 0x04)?row=2;?// 若第2列被按下?
???else if(rowkey == 0x08)?row=3;?// 若第3列被按下?
???kcode = 4 * col + row;???// 算出按鍵之號碼?
???for(dig = 0; dig < 3 ; dig++)?// 顯示陣列之左3字?
????disp[dig]=disp[dig+1];??// 將右側編碼左移1位?
???disp[3]=TAB[kcode];????// 鍵值編碼後,寫入最右側?
???while(rowkey != 0)????// 當按鈕未放開?
????rowkey=~KEYP & 0x0f;??// 再讀入列鍵值?
??}??????//?if敘述(有按鍵時)結束?
??delay1ms(4);???//?延遲4ms
?}???????//?for回圈結束(掃瞄col行)
}????????//?掃瞄函數scanner()結束?
?
6、MM74C922實驗
/* ch05-4-5.c - MM74C922實驗,P2.4~7為鍵盤值,P2.0~3輸出至7447 *///==聲明區===================================
#include?
sbit? IRQ=P3^2;? ???// 聲明P3.2 偵測是否輸入?
//==主程序===================================
main()??????// 主程序開始?
{?P2=0xff;????// 規劃P2.4~7為輸入埠,并關閉顯示器(P2.0~3)
?while(1)????// 無窮循環,程序一直跑?
??if (IRQ==1)??? ?// 判讀是否按下按鍵?
???P2=(P2>>4)|0xf0;?
?/* 高4位元(輸入)移至低4位元(輸出),再將高4位元設為1(規劃輸入)*/
}?????? ??// 主程序結束?
?
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%