打印

430中断问题

[复制链接]
2891|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
z663327|  楼主 | 2013-6-5 08:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用msp430编写的lcd显示和中断扫描矩阵按键 当总中断不开启的时候lcd能正常显示数据 打开总中断后不显示了 求助!!!

开启总中断在初始化程序的最后一行!!!
#include "msp430x14x.h"

#define  uint unsigned int
#define uchar unsigned char

#define zhilin_PORT P3OUT
#define zhilin_DDR P3DIR
#define DB_PORT P4OUT
#define DB_DDR P4DIR

void write_dat(uchar dat);
void delay_ms(uint ms);
void write_com(uchar com);
void Init_Port(void);
void show(uint x);
void delay(void);//按键去抖
uint keyprocess(void);

uint key=0;

#pragma vector=PORT1_VECTOR
__interrupt void ITRPT_1(void)
{
   delay();
   key = keyprocess();
   P1IFG=0;
}
void main(void)
{   
    Init_Port();
    while(1)
    {
      show(key);
    }
}


/**********************************/
#include "msp430x14x.h"

#define  uint unsigned int
#define uchar unsigned char

void delay_ms(uint ms)
{
   uint i,j;
   for(;ms>0;ms--)
   for(i=0;i<1000;i++)
   for(j=0;j<8;j++);
}
void delay(void)//按键去抖
{
int i;
for(i = 100;i--;i > 0);

}

/*******************************/
#include "msp430x14x.h"

#define  uint unsigned int
#define uchar unsigned char

#define zhilin_PORT P3OUT
#define zhilin_DDR P3DIR
#define DB_PORT P4OUT
#define DB_DDR P4DIR

void write_dat(uchar dat);
void delay_ms(uint ms);
void write_com(uchar com);

void Init_Port(void)
{
  uchar j = 0;
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
     BCSCTL1 &= ~ XT2OFF;            //打开XT2高频晶振,XT1默认低频晶振--DIVA默认1分频
   do
   {
     IFG1 &= ~ OFIFG;              //关闭晶振错误中断标志
     for(j= 0xff ; j > 0;j--);       //延时
   }
   while(IFG1 & OFIFG);         //判断是否关闭成功
   BCSCTL2 |= SELM_2;             //主系统时钟使用XT2高频晶振,DIVM默认不分频
   BCSCTL2 |= SELS;

   //将P1口所有的管教在初始化的时候设置为输入
  P1DIR = 0;
  //将P1端口所有的管脚设置为一般I/O口
  P1SEL = 0;
   //打开管脚的中断功能
  //对应管脚由高到低电平跳变使相应的标志置位
  P1IES = BIT0 + BIT1 + BIT2 + BIT3;
  P1IE = BIT0 + BIT1 + BIT2 + BIT3;

  
  P2OUT = 0XFF;
  P2DIR = 0XFF;
  P2SEL = 0X00;
  zhilin_DDR=0XFF;
  zhilin_PORT=0X00;
  DB_DDR=0XFF;
  DB_PORT=0X00;
  P3SEL = 0X00;
  P4SEL = 0X00;
        write_com(0x38);//设置16*2显示 5*7点阵屏
         delay_ms(5);
         //write_com(0x01);//清屏
         //delay(1);
         write_com(0x0C);//显示光标闪烁
         delay_ms(5);
         write_com(0X06);//写入字符后光标加一 字符加一
         delay_ms(5);

  _EINT();
}
/****************************/
#include "msp430x14x.h"
#define  uint unsigned int
#define uchar unsigned char

#define zhilin_PORT P3OUT
#define zhilin_DDR P3DIR
#define DB_PORT P4OUT
#define DB_DDR P4DIR
uint keyprocess(void)
{
        int nP10,nP11,nP12,nP13;
        int nRes = 0;
        //P1.4输出低电平
        P1OUT &= ~(BIT4);
        nP10 = P1IN & BIT0;
        if (nP10 == 0) nRes = 13;
        nP11 = P1IN & BIT1;
        if (nP11 == 0) nRes = 14;
        nP12 = P1IN & BIT2;
        if (nP12 == 0) nRes = 15;
        nP13 = P1IN & BIT3;
        if (nP13 == 0) nRes = 16;
        //P1.5输出低电平
        P1OUT &= ~(BIT4);
        nP10 = P1IN & BIT0;
        if (nP10 == 0) nRes = 9;
        nP11 = P1IN & BIT1;
        if (nP11 == 0) nRes = 10;
        nP12 = P1IN & BIT2;
        if (nP12 == 0) nRes = 11;
        nP13 = P1IN & BIT3;
        if (nP13 == 0) nRes = 12;
        //P1.6输出低电平
        P1OUT &= ~(BIT4);
        nP10 = P1IN & BIT0;
        if (nP10 == 0) nRes = 5;
        nP11 = P1IN & BIT1;
        if (nP11 == 0) nRes = 6;
        nP12 = P1IN & BIT2;
        if (nP12 == 0) nRes = 7;
        nP13 = P1IN & BIT3;
        if (nP13 == 0) nRes = 8;
        //P1.7输出低电平
        P1OUT &= ~(BIT4);
        nP10 = P1IN & BIT0;
        if (nP10 == 0) nRes = 1;
        nP11 = P1IN & BIT1;
        if (nP11 == 0) nRes = 2;
        nP12 = P1IN & BIT2;
        if (nP12 == 0) nRes = 3;
        nP13 = P1IN & BIT3;
        if (nP13 == 0) nRes = 4;

        P1OUT = 0x00;//恢复以前值。

        //读取各个管脚的状态
        nP10 = P1IN & BIT0;
        nP11 = P1IN & BIT1;
        nP12 = P1IN & BIT2;
        nP13 = P1IN & BIT3;
        for(;;)
        {
                if(nP10 == 1 && nP11 == 1 && nP12 == 1 && nP13 == 1)
                {
                        //等待松开按键
                        break;
                }
        }
        return nRes;
}
/*******************************/
#include "msp430x14x.h"

#define  uint unsigned int
#define uchar unsigned char

#define zhilin_PORT P3OUT
#define zhilin_DDR P3DIR
#define DB_PORT P4OUT
#define DB_DDR P4DIR

void write_dat(uchar dat);
void delay_ms(uint ms);
void write_com(uchar com);

void show(uint x)
{  
         uchar i;
         uchar DAT1[7]={0,};
         uchar table1[10]={48,49,50,51,52,53,54,55,56,57};
         
                 DAT1[0]=x/100;
                 DAT1[1]=x%100/10;
                 DAT1[2]=x%10;
           write_com(0X80+0X00);
           delay_ms(5);
           for(i=0;i<3;i++)
          {
            write_dat(table1[DAT1]);
            delay_ms(5);
          }
         
}

void write_com(uchar com)//写指令
{
         zhilin_PORT&=~BIT0;//RS设置为输入指令
         zhilin_PORT&=~BIT1;//R/W设置为向lcd写入指令
         DB_PORT =com;//输入指令内容
         zhilin_PORT|=BIT2;//使能位为高电平 读取信息
         delay_ms(1);//使能延迟
         zhilin_PORT&=~BIT2;
         //使能位跳为低电平 E出现下降沿 执行指令
}

void write_dat(uchar dat)//写数据
{         
          zhilin_PORT|=BIT0;//RS设置为输入数据
          zhilin_PORT&=~BIT1;//R/W设置为向lcd写入数据
          DB_PORT=dat;//输入数据内容
          zhilin_PORT|=BIT2;//使能位为高电平 读取信息
          delay_ms(1);//使能延迟
          zhilin_PORT&=~BIT2;
         //使能位跳为低电平 E出现下降沿 显示数据
}



相关帖子

沙发
ayb_ice| | 2013-6-5 08:28 | 只看该作者
中断触发了,但没有相应的中断程序吧

使用特权

评论回复
板凳
z663327|  楼主 | 2013-6-5 09:24 | 只看该作者
#pragma vector=PORT1_VECTOR
__interrupt void ITRPT_1(void)
{
   delay();
   key = keyprocess();
   P1IFG=0;
}
这就是中断服务程序啊 中断服务程序调用子函数keyprocess() 读取按键数字

使用特权

评论回复
地板
z663327|  楼主 | 2013-6-5 09:25 | 只看该作者
ayb_ice 发表于 2013-6-5 08:28
中断触发了,但没有相应的中断程序吧


#pragma vector=PORT1_VECTOR
__interrupt void ITRPT_1(void)
{
   delay();
   key = keyprocess();
   P1IFG=0;
}
这就是中断服务程序啊 中断服务程序调用子函数keyprocess() 读取按键数字

使用特权

评论回复
5
ayb_ice| | 2013-6-5 09:36 | 只看该作者
是说其它中断

使用特权

评论回复
6
ayb_ice| | 2013-6-5 09:38 | 只看该作者
这段程序明显有BUG

//读取各个管脚的状态
        nP10 = P1IN & BIT0;
        nP11 = P1IN & BIT1;
        nP12 = P1IN & BIT2;
        nP13 = P1IN & BIT3;
        for(;;)
        {
                if(nP10 == 1 && nP11 == 1 && nP12 == 1 && nP13 == 1)
                {
                        //等待松开按键
                        break;
                }
        }

使用特权

评论回复
7
z663327|  楼主 | 2013-6-5 09:59 | 只看该作者
ayb_ice 发表于 2013-6-5 09:38
这段程序明显有BUG

//读取各个管脚的状态

是的是的 是我太粗心了 !!!我刚把这段程序注释掉了 能够正常显示了 但显示的数字一直为“4”

使用特权

评论回复
8
ayb_ice| | 2013-6-5 10:18 | 只看该作者
那段代码还是有问题吧

改成这样
nP10 = !!(P1IN & BIT0);
        nP11 = !!(P1IN & BIT1);
        nP12 = !!(P1IN & BIT2);
        nP13 = !!(P1IN & BIT3);

另外要放到循环内去



使用特权

评论回复
9
z663327|  楼主 | 2013-6-5 10:33 | 只看该作者
ayb_ice 发表于 2013-6-5 10:18
那段代码还是有问题吧

改成这样

for(;;)
        {
                if(nP10 == 1 && nP11 == 1 && nP12 == 1 && nP13 == 1)
                {
                        //等待松开按键
                        break;
                }
        }

这个for循环是不是不能要啊 我觉得我原先的程序没有显示的原因就是这里死循环程序没有执行到show函数
还有你写的 nP10 = !!(P1IN & BIT0); “!!”是什么意思啊?

使用特权

评论回复
10
z663327|  楼主 | 2013-6-5 10:50 | 只看该作者
ayb_ice 发表于 2013-6-5 10:18
那段代码还是有问题吧

改成这样

刚刚搜索了一下 当需要把某个非布尔变量临时当作布尔变量来用的时候就可以采用这个写法。我试试你说的办法!

使用特权

评论回复
11
z663327|  楼主 | 2013-6-5 10:55 | 只看该作者
ayb_ice 发表于 2013-6-5 10:18
那段代码还是有问题吧

改成这样

for(;;)
        {
            //读取各个管脚的状态
            nP10 =!! (P1IN & BIT0);
            nP11 =!! (P1IN & BIT1);
            nP12 =!! (P1IN & BIT2);
            nP13 =!! (P1IN & BIT3);
                if(nP10 == 1 && nP11 == 1 && nP12 == 1 && nP13 == 1)
                {
                        //等待松开按键
                        break;
                }
        }
又一直显示0了 按键没反应!

使用特权

评论回复
12
ayb_ice| | 2013-6-5 11:03 | 只看该作者
估计你程序很多地方都有BUG

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

21

帖子

2

粉丝