实现目标
使用中断,当一个按键按下时,显示第几个按键被按下。
Proteus仿真图
C51代码(中断)
#include <REG52.H> /* special function register declarations */
#include <intrins.h>
#define byte unsigned char
#define uchar unsigned char
#define word unsigned int
#define uint unsigned int
#define ulong unsigned long
#define BYTE unsigned char
#define WORD unsigned int
#define TRUE 1
#define FALSE 0
void initUart(void);/*初始化串口波特率,使用定时器2*/
#define KEY_PORT P1 /*按键接在P1口*/
uchar key_Value; /*存放键值*/
bit int0_flag; /*中断标记*/
/******** main 函数 *********/
void main (void) {
initUart(); /* 初始化串口 */
int0_flag=0;/*设置中断0标记*/
TCON=0x55; /* 电平触发外部中断 */
IE=0x81; /*打开外中断int0*/
do {
if (int0_flag) { /*如果有中断*/
switch (key_Value){ /*根据中断源分支*/
case 1:
printf ("key-press0 is pressed\n");
/* 可在此处插入按键0处理程序 */
break;
case 2:
printf ("key-press1 is pressed\n");
/* 可在此处插入按键1处理程序 */
break;
case 4:
printf ("key-press2 is pressed\n");
/* 可在此处插入按键2处理程序 */
break;
default:break;
}
int0_flag=0; /*清中断0标记*/
}
}while(TRUE);
}
/*********** 外中断0服务程序***************/
void exint0(void) interrupt 0
{
EA=0;/* 关总中断 */
int0_flag=1; /*设置中断0标记*/
/*读取外部中断源输入,并屏蔽高5位*/
key_Value= ~KEY_PORT & 0x07;
EA=1;/* 开总中断 */
}
/********** 初始化串口波特率 ************/
void initUart(void)/*初始化串口波特率,使用定时器2*/
{
/* Setup the serial port for 9600 baud at 11.0592MHz */
SCON = 0x50; //串口工作在方式1
RCAP2H=(65536-(3456/96))>>8;
RCAP2L=(65536-(3456/96))%256;
T2CON=0x34;
TI = 1; /* 置位TI*/
}
笔记
思路(个人理解):没有一个按下时,三个按钮对应线路呈现高电平,只要任何一个按键被按下,便会产生一个低电平,触发INT0中断,然后读取P1口中的P1.0、P1.1、P1.2【key_Value= ~KEY_PORT & 0x07】,根据key_Value确定具体是哪一个按钮被按下,完成相应的操作
本文Proteus仿真图及源程序获取见:
运行结果
说明
参考课本:单片机原理与嵌入式系统设计