金牌会员
- 积分
- 1842
- 威望
- 877
- 贡献
- 507
- 兑换币
- 557
- 注册时间
- 2013-1-21
- 在线时间
- 229 小时
|
小弟我是刚学的,卡在了输入中断这一部分几天了,求高手们指导下。我这个程序是想实现按键中断的,功用有1、按下down键,LED流水灯往右移;2、按下up键LED流水灯往左移;3、同时按下两键则灯全亮,再按下则又恢复LED流水灯。小弟这个程序现在是LED流水灯灯跑没问题,按键也能实现相应的功用。但不知为什么跑得很奇怪,例如我按下up键,灯会往左移一位,再往右移一位,接着又往左移一位,如此循环,不知为什么。求高手们帮忙看看,小弟万分感谢!
/*---------------------------------------------------------*/
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#define LED PORTB //定义LED灯的引脚
#define LED_dir DDRB //定义LED灯对应引脚的方向寄存器
#define EN_up PTT_PTT0 //定义按键EN_up引脚
#define EN_down PTT_PTT1 //定义按键EN_down引脚
#define EN_dir DDRT //定义按键EN对应引脚的方向寄存器
unsigned char data=0x01,EN_up1=1,EN_down1=1; //定义一个8位的字符型变量 跟八个LED灯对应
/*************************************************************/
/* 延时函数 */
/*************************************************************/
void delay(void)
{
unsigned int i,j;
for(j=0;j<500;j++)
for(i=0;i<1500;i++)
;
}
/************************************************************/
/* 初始化ECT模块 */
/************************************************************/
void init_ECT(void) //初始化输入模块 函数
{
EN_dir = 0x00; // 设置按键为输入
PERT = 0xff; // 设置对应引脚允许内部上、下拉
PPST = 0X00; // 设置对应引脚内部上拉
TIOS_IOS0 = 0; // 设置PT0为输入捕捉
TIOS_IOS1 = 0; // 设置PT1为输入捕捉
TCTL4_EDG0A=0;
TCTL4_EDG0B=1; // (PT0) 下降沿捕捉
TCTL4_EDG1A=0;
TCTL4_EDG1B=1; // (PT1) 下降沿捕捉
TIE_C0I = 1; //中断请求允许
TIE_C1I = 1; //中断请求允许
TSCR1_TEN = 1; // 定时器使能位.
}
/*************************************************************/
/* 输入捕捉中断 */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED // 中断函数置于非分页区内
interrupt void Int_ico0(void) //T0
{
TFLG1_C0F = 1; //中断的标志位清零!
EN_up1++;
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void Int_ico1(void) //T1
{
TFLG1_C1F = 1; //中断的标志位清零!
EN_down1++;
}
void main(void)
{
DisableInterrupts;
init_ECT(); //初始化输入模块
LED_dir=0xff; //定义LED方向
LED=data; // 对LED赋初值
EnableInterrupts; //允许可屏蔽中断
for(;;)
{
if(EN_down==0&&EN_up==0)
{
delay();
data=0xff;
LED=data;
}
if(EN_down1%2==1) //判断方向
{
delay(); //延时消抖
if(data!=0x80)
{
data=data<<1; //左移一位
LED = ~data;
}
}
if(EN_down1%2==0) //判断方向
{
delay(); //延时消抖
if(data!=0x01)
{
data=data>>1; //右移一位
LED = ~data;
}
}
if(EN_up1%2==1) //判断方向
{ }
delay(); //延时消抖
if(data!=0x80)
{
data=data<<1; //左移一位
LED = ~data;
}
if(EN_up1%2==0)
{
delay();
if(data!=0x01)
{
data=data>>1; //右移一位
LED = ~data;
}
}
} /* loop forever */
/* please make sure that you never leave main */
}
|
|