配置字里把看门狗关了 结果运行到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;
} |