打印

高分 求教啊 程序跑死

[复制链接]
2316|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ql1007|  楼主 | 2010-8-17 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
配置字里把看门狗关了 结果运行到while(1)这 就死了 液晶依然亮的,但程序跑死了,单独测试了定时器不是定时器问题,估计是keyboradscan的问题,自己也没查出来,看门狗开了 一切正常,按键显示正常,但是会不断的唤醒我的睡眠 很讨厌。大家给看看啊  怎么会跑死呢?
void main(void)
{
port_init();
delay(65536);
flag2=EEpromRead(0);
if(flag2!=0x01)//如果上次是1 说明这次上电是睡眠状态
{EEpromWrite(0,0x01);}
else
{
EEpromWrite(0,0xff);
asm("nop");
asm("sleep");
asm("nop");
while(1);
}

LCDinit();
displaydata[0]=8;
displaydata[1]=8;
displaydata[2]=8;
displaydata[3]=8;
displaydata[4]=8;
displaydata[5]=8;
displaydata[6]=8;
displaydata[7]=8;
setLCDsegment();
//delay(65536);
tmint();
delay(65536);
while(1)
{
switch(result)
{
case 0xde:
   displaydata[1]=1;
   //tyle=1;
   setLCDsegment();
break;
case 0xdf:
     displaydata[0]=0;
   tyle=1;
   setLCDsegment();
break;
case 0xdd:
     displaydata[2]=2;
   //tyle=1;
   setLCDsegment();
break;
  case 0xbd:
     displaydata[3]=3;
   //tyle=1;
   setLCDsegment();
break;
case 0xdb:
     displaydata[4]=4;
   //tyle=1;
   setLCDsegment();
break;
case 0xbb:
     displaydata[7]=9;
   //tyle=1;
   setLCDsegment();
break;
case 0xeb:
     displaydata[0]=0;
   //tyle=1;
   setLCDsegment();
break;
default:
   break;
}
}
}
void tmint(void)
{
T0CS=0;      //时钟源为内部指令周期            
PSA=0;           //分频器分配给TMR0
//
PS2=1;          //TMR0的分频比为1:256         
PS1=1;
PS0=1;
//
GIE=1;          //允许总中断
TMR0IE=1;         //允许定时器0溢出中断
TMR0IF=0;         //清楚定时器0中断标志
TMR0=0Xd8;      //预置初值 T=(256-6)x16=4000uS
}
void interrupt dealtime()   //中断入口,该中断完成数码管的动态扫描
{                          //每中断一次的时间为4毫秒
    unsigned char i,n;
if(TMR0IF==1&&TMR0IE==1)
   {
   //判断TMR1中断 T1中断
      TMR0IE=0;//禁止溢出中断,防止干扰
            TMR0IF=0;          // 清除TMR1中断标志,每次中断溢出需要软件将TMR1IF清零
            keyboradscan();
            
             //desplay();
      TMR0 = 0XD8;
           
   }        
    PORTC=0;          //为下一次按键做准备;
    TMR0IF=0;
    GIE=1;         //开中断
}
void keyboradscan(void)
{
unsigned char key_a=200,i=1;
    while(key_a--);      //先消抖;         
  
PORTC=0X7F;                 ////C7输出低电平,其他三位输出高电平 C7是列线
asm("nop");                 //插入一定延时,确保电平稳定
result=PORTC;               //读回C口高4位结果
result=result&0x0f;         //清除高4位 因为我的布线 高四位是列线 低四位是行线
if(result!=0x0f)            //判断低4位是否为全1(全1代表没按键按下)
   {
     result=result|0x70;     //否,加上高4位0x70,做为按键扫描的结果
   }
else                        //是,改变高4位输出,重新判断是否有按键按下
   {
   PORTC=0Xbf;               //C6输出低电平,其他三位输出高电平 C6是列
   asm("nop");               //插入一定延时,确保电平稳定
   result=PORTC;             //读回C口结果
   result=result&0x0f;       //清除高4位
   if(result!=0x0f)          //判断低4位是否为全1(全1代表没按键按下)
     {
     result=result|0xb0;     //否,加上高4位0xb,做为按键扫描的结果
     }
   else                      //是,改变高4位输出,重新扫描
       {
       PORTC=0Xdf;           //C5输出低电平,其他三位输出高电平
       asm("nop");           //插入一定延时,确保电平稳定
       result=PORTC;         //读回C口高4位结果
       result=result&0x0f;   //清除高4位
       if(result!=0x0f)      //判断低4位是否为全1(全1代表没按键按下)
        {
        result=result|0xd0;  //否,加上高4位0x0d,做为按键扫描的结果
        }
       else                  //是,改变高4位的输出,重新扫描
          {
          PORTC=0Xef;        //C4输出低电平,其他三位输出高电平
          asm("nop");        //插入一定延时,确保电平稳定
          result=PORTC;      //读回C口高4位结果
          result=result&0x0f;//清除高4位
          if(result!=0x0f)   //判断低四位是否为全1(全1代表没有按键按下)
            {
             result=result|0xe0;//否,加上高4位0x0e,做为按键扫描的结果
            }
          else               //是,全部按键扫描结束,没有按键按下,置无按键按下标志位
            {
             result=0xff;    //扫描结果为0xff,做为没有按键按下的标志
            }   
          }      
      }
   }
  //return;
}
沙发
ql1007|  楼主 | 2010-8-17 11:51 | 只看该作者
我单独把
定时器屏蔽
LCDinit();
displaydata[0]=8;

displaydata[1]=8;

displaydata[2]=8;
displaydata[3]=8;
displaydata[4]=8;
displaydata[5]=8;
displaydata[6]=8;
displaydata[7]=8;
setLCDsegment();
//delay(65536);
//tmint();
delay(65536);
while(1)
{
keyboradscan();
switch(result)
{
case 0xde:
   displaydata[1]=1;
   //tyle=1;
   setLCDsegment();
break;

case 0xdf:
     displaydata[0]=0;
   tyle=1;
   setLCDsegment();
break;
case 0xdd:
     displaydata[2]=2;
   //tyle=1;
   setLCDsegment();
break;
  case 0xbd:
     displaydata[3]=3;
   //tyle=1;
   setLCDsegment();
break;
case 0xdb:
     displaydata[4]=4;
   //tyle=1;
   setLCDsegment();
break;
case 0xbb:
     displaydata[7]=9;
   //tyle=1;
   setLCDsegment();
break;
case 0xeb:
     displaydata[0]=0;
   //tyle=1;
   setLCDsegment();
break;
default:
   break;
}

}
}
结果就没跑死。。。难道我定时器有问题 ?可是我检查实在找不出问题了

使用特权

评论回复
板凳
ql1007|  楼主 | 2010-8-17 13:30 | 只看该作者
经测试后 定时器中断响应部分有问题 ,
void interrupt dealtime()   //中断入口,该中断完成数码管的动态扫描
{                          //每中断一次的时间为4毫秒
    unsigned char i,n;
if(TMR0IF==1&&TMR0IE==1)
   {
   //判断TMR1中断 T1中断
      TMR0IE=0;//禁止溢出中断,防止干扰
            TMR0IF=0;          // 清除TMR1中断标志,每次中断溢出需要软件将TMR1IF清零
            keyboradscan();
            
             //desplay();
      TMR0 = 0XD8;
           
   }        
    PORTC=0;          //为下一次按键做准备;
    TMR0IF=0;
    GIE=1;         //开中断
}

TMR0IE=0;//禁止溢出中断,防止干扰  这个我写错了 不该关掉,屏蔽掉 一切正常了 。

使用特权

评论回复
地板
yewuyi| | 2010-8-17 13:33 | 只看该作者
倒塌了,delay(65535)也太猛了吧。。。

使用特权

评论回复
5
梅开二度| | 2010-8-20 21:30 | 只看该作者
写的乱。

使用特权

评论回复
6
bpwater| | 2010-8-21 14:24 | 只看该作者
倒塌了,delay(65535)也太猛了吧。。。
yewuyi 发表于 2010-8-17 13:33


在学校里,老师都是这么教的:lol

使用特权

评论回复
7
lhkjg| | 2010-8-21 17:46 | 只看该作者
delay(65535)确实比较猛。这个里面有没有喂狗狗

使用特权

评论回复
8
XIEYUANBIN| | 2010-8-22 09:47 | 只看该作者
在学校里,老师都是这么教的:lol
bpwater 发表于 2010-8-21 14:24

现在大学里的老师都是猪
看门狗关了,谁来唤醒SLEEP???

使用特权

评论回复
9
XIEYUANBIN| | 2010-8-22 09:47 | 只看该作者
估计你的程序是别人留下来的吧?

使用特权

评论回复
10
mei326| | 2010-9-10 22:09 | 只看该作者
现在大学里的老师都是猪
看门狗关了,谁来唤醒SLEEP???
XIEYUANBIN 发表于 2010-8-22 09:47
这话有点猛!部分老师还是不错的!

使用特权

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

本版积分规则

35

主题

122

帖子

0

粉丝