智能车制作
标题:
求高手们看下程序
[打印本页]
作者:
ccsshu
时间:
2013-1-23 10:21
标题:
求高手们看下程序
小弟我是刚学的,卡在了输入中断这一部分几天了,求高手们指导下。我这个程序是想实现按键中断的,功用有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 */
}
作者:
爱你,就一句话
时间:
2013-1-23 10:39
循环模块有问题,for循环语句里面没有判断退出语句,导致循环中的相应代码不断重复执行
作者:
ccsshu
时间:
2013-1-23 10:45
师兄,那是不是在每一个if 后面都加一个break啊
作者:
ccsshu
时间:
2013-1-23 11:07
不行啊,加了break;之后,很快就跳出了程序,而且还有错误
说remove deep code
作者:
qurrer
时间:
2013-1-23 13:41
作者:
773655190
时间:
2013-3-11 22:58
那个我想说你按下up对down无影响,如果不是全亮,说明up或down必为1,一个是1一个是0,按照你的程序,当然是左移一位,右移一位了呗!
作者:
773655190
时间:
2013-3-11 23:01
另外,你何必要让它死循环呢,可以再加个东西,比如说up与down都是1的时候跳出来。这个程序问题太大,再重新写吧!同努力!
作者:
ccsshu
时间:
2013-3-12 15:19
恩,谢谢
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2