xiaolouxinyue 发表于 2011-10-16 10:38:59

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;
    }
}

LXJLXH 发表于 2011-10-16 10:52:30

学习。。。。。。。。。。。。。。。。。。

xiaolouxinyue 发表于 2011-10-16 14:25:10

额 。。。 谁来帮忙解决个问题啊 。。。。。

到底是为什么会让key[].cnt又变为0的呢?我在程序中对cnt,除了初始化之外,也只有加的操作啊 。。。。

不明白啊!不明白!

谁来解释下哈!!!

xiaolouxinyue 发表于 2011-10-18 08:51:21

坛子里的大神们啊。。。你们在哪啊。。。。

gbwaikp2011 发表于 2011-10-18 09:59:58

很想帮帮你,可是这款单片机我没用过,不太熟悉。。。

xiaolouxinyue 发表于 2011-10-21 10:07:31

为嘛啊?为嘛啊?为嘛加了段FOR循环后它就会莫名其妙的一直复位了呢?

xiaolouxinyue 发表于 2011-10-21 10:08:32

回复【4楼】gbwaikp2011
很想帮帮你,可是这款单片机我没用过,不太熟悉。。。
-----------------------------------------------------------------------

谢谢!不过这应该只是程序的问题,可能哪个地方改了什么寄存器,让单片机复位了。。。。

gather1 发表于 2011-10-21 10:51:20

等待,学习中......

SamPa 发表于 2011-10-22 11:11:08

建议你看下这个片子的看门狗那部分,感觉还是狗不太听话,我用过这个片子,米有出过这种问题
页: [1]
查看完整版本: STC单片机的键盘解码程序怎么了?为嘛加了初始化后就会莫名其妙的一直初始化。。。。