外部中断典型实验案例分享
大小: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%