STC单片机的键盘解码程序怎么了?为嘛加了初始化后就会莫名其妙的一直初始化。。。。
最近在做的键盘解码程序,一开始没有初始化挺正常的,按键能自动计数,并送串口发送,只是初始的数据不是0。于是在主程序前加了段初始化的代码,这一加可就不正常了,怎么按键它都只计一次了,长按也失效了。。。
初始化代码:int i;
for(i=0;i<64;i++)
{
key.num=0;
key.state=0;
key.cnt=0;
}
一开始觉得是看门狗的问题,由于主循环是死循环会让它自动复位,可不管是喂狗还是关掉看门狗,它还是那么不听话。。。
所以估计是程序的问题了,只是不知道哪个地方会让它自动复位呢?还是某个地方会让它调到初始化的那段代码呢?求大侠们赐教。。。。
附程序如下:
#include"STC89C54RD.h"
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
#define inport P0
#define outport P2
//sfr WDT_CONTR=0xe1;
uchar testin,testout,test;
sbit in1=P0^0;
sbit in2=P0^1;
sbit in3=P0^2;
sbit in4=P0^3;
sbit in5=P0^4;
uchar code info1 ={" the key you pressed is : "} ;
uchar code info2 ={" for "} ;
uchar code info3 ={" times ."};
uchar code scan_code={0xc0,0x40,0x80,0x00} ;
uchar code select_code={0x00,0x08,0x04,0x0c,0x02,0x0a,0x06,0x0e} ;
struct key_type
{
uchar num; //按键的位置要扫面的是按键寄存器中的哪个按键
uchar state; //持续按键标志位
uchar cnt; //按键有效次数
};
structkey_type xdata key;
void uart0init()
{
/*int i;
for(i=0;i<64;i++)
{
key.num=0;
key.state=0;
key.cnt=0;
} */
SCON=0x40; //设置串口模式为8位数据
TMOD=0x20; //设置定时/计数器模式
TH1=0xFD; //给定时器1高八位初始化初值
TL1=0xFD; //给定时器1低八位初始化初值
TR1=1; //开启定时器1
//ES=1; //开启串口通信功能
REN=1; //开启接收中断标志
EA=0; //总中断开启
}
uchar htod(uchar byte)
{
uchar byte1 , byte0;
byte1=byte/10;
byte0=byte%10;
return byte1*16+byte0;
}
void dis_byte(uchar byte)
{
uchar tempbyte;
tempbyte=byte;
byte&=0xF0;
byte>>=4;
if (byte>=0&&byte<=9)
SBUF=byte+48;
else if (byte>9)
SBUF=byte+87;
while(TI==0);
TI=0;
byte=tempbyte;
byte&=0x0F;
if (byte>=0&&byte<=9)
SBUF=byte+48;
else if (byte>9)
SBUF=byte+87;
while(TI==0);
TI=0;
}
void dis_ascii(uchar ascii)
{
SBUF=ascii;
while(TI==0);
TI=0;
}
void keydis()
{
uchar k,j,num,cnt;
for(j=0;j<29;j++)dis_ascii(info1);
// WDT_CONTR=0x3c;
for(k=0;k<64;k++)
{
if(key.state==1)
{
num=key.num;
dis_byte(htod(num));
// WDT_CONTR=0x3c;
for(j=0;j<5;j++)dis_ascii(info2) ;
cnt=key.cnt;
dis_byte(htod(cnt));
// WDT_CONTR=0x3c;
for(j=0;j<8;j++)dis_ascii(info3) ;
}
}
}
void keyscan()
{
uchar select,prekey,i,j,keyok;
char scan;
scan=0;
select=0;
keyok=0;
inport=0xff; //初始置1,准备读状态
outport=0x00; //P2口初始化列扫描值,并选通SUB1 select4~1=0000
while(select<=4)
{
while(scan<=3) //判断是否扫描完,若不是,继续扫描
{
inport=0xff;
outport=(scan_code+select_code);
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
if(inport!=0xff)
{
// _nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
//_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
i=0;
prekey = key.num;
key.num = (select*16+i*4+scan+1)*(~in1);
if (key.num)
{
if(prekey^key.num)
{
key.cnt++;
key.state=1;
keyok|=1;
}
else
{
key.state++;
if(key.state>=250)
{
key.cnt+=10;
key.state=1;
keyok|=1;
}
}
}
else
{
key.state=0;
keyok|=0;
}
i=1;
prekey = key.num;
key.num = (select*16+i*4+scan+1)*(~in2);
if (key.num)
{
if(prekey^key.num)
{
key.cnt++;
key.state=1;
keyok|=1;
}
else
{
key.state++;
if(key.state>=250)
{
key.cnt+=10;
key.state=1;
keyok|=1;
}
}
}
else
{
key.state=0;
keyok|=0;
}
i=2;
prekey = key.num;
key.num = (select*16+i*4+scan+1)*(~in3);
if (key.num)
{
if(prekey^key.num)
{
key.cnt++;
key.state=1;
keyok|=1;
}
else
{
key.state++;
if(key.state>=250)
{
key.cnt+=10;
key.state=1;
keyok|=1;
}
}
}
else
{
key.state=0;
keyok|=0;
}
i=3;
prekey = key.num;
key.num = (select*16+i*4+scan+1)*(~in4);
if (key.num)
{
if(prekey^key.num)
{
key.cnt++;
key.state=1;
keyok|=1;
}
else
{
key.state++;
if(key.state>=250)
{
key.cnt+=10;
key.state=1;
keyok|=1;
}
}
}
else
{
key.state=0;
keyok|=0;
}
}
else
{
for(j=0;j<4;j++)
{
key.state=0;
key.num=0;
}
}
scan++; //列扫描值加1,扫描下一列
// WDT_CONTR=0x3c;
}
scan=0;
select++;
// WDT_CONTR=0x3c;
}
if(keyok) keydis();
}
void main(void)
{
int i;
for(i=0;i<64;i++)
{
key.num=0;
key.state=0;
key.cnt=0;
}
uart0init();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
//WDT_CONTR=0x3F;
while(1)
{
keyscan();
_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
// WDT_CONTR=0x3F;
}
} 学习。。。。。。。。。。。。。。。。。。 额 。。。 谁来帮忙解决个问题啊 。。。。。
到底是为什么会让key[].cnt又变为0的呢?我在程序中对cnt,除了初始化之外,也只有加的操作啊 。。。。
不明白啊!不明白!
谁来解释下哈!!! 坛子里的大神们啊。。。你们在哪啊。。。。 很想帮帮你,可是这款单片机我没用过,不太熟悉。。。 为嘛啊?为嘛啊?为嘛加了段FOR循环后它就会莫名其妙的一直复位了呢? 回复【4楼】gbwaikp2011
很想帮帮你,可是这款单片机我没用过,不太熟悉。。。
-----------------------------------------------------------------------
谢谢!不过这应该只是程序的问题,可能哪个地方改了什么寄存器,让单片机复位了。。。。 等待,学习中...... 建议你看下这个片子的看门狗那部分,感觉还是狗不太听话,我用过这个片子,米有出过这种问题
页:
[1]