关于io口重用的问题解决????

2019-07-16 02:54发布

                      懂的朋友请帮帮忙,谢谢!!可以只看主程序
        我的问题是我写了一个程序用矩阵控制1602液晶显示,但是我用的是郭天祥的学习板,他的P3口接在矩阵上,1602液晶显示屏控制接在P3^4,P3^5上,我在调用1602显示矩阵按键的值时就出现有时候只要输入一个数字的但是实际输出多个;
       我的矩阵检测程序是:
  这个程序的意思是在主程序里面反回一个按键的值keyvalue;
#include <reg52.h>
#define uchar unsigned  char
#define uint unsigned  int
uchar keyvalue;
uchar code tablewe[]={
0xfe,0xfd,0xfb,0xf7};
void jian(uchar ss)    //矩阵键盘函数
{            

          static uchar temp,mum;
          P3=tablewe[ss];
         temp=P3;
         temp=temp&0xf0;
        while(temp!=0xf0)
         {
          delay(10);//消除键盘抖动
         temp=P3;      
         temp=temp&0xf0;
            while(temp!=0xf0)
            {   
                    switch(temp)
               {
                   case 0xe0:mum=0+4*ss;
                          break;
             case 0xd0:mum=1+4*ss;
                 break;
                   case 0xb0:mum=2+4*ss;
               break;
               case 0x70:mum=3+4*ss;
                           break;
                   }
         keyvalue = mum;
        while(temp!=0xf0)  //松手测试
         {
         temp=P3;      
         temp=temp&0xf0;
         }
            }
       }
}
下面是1602程序
sbit lcden=P3^4;  //位声明 控制1602显示屏的
sbit rs=P3^5;

void delay (uint z)   //延时函数
{
uint x, y;
for(x = z;x > 0; x--)
  for(y = 110;y > 0; y--);
}

void write_com(uchar aa)//此为输入指令给1602显示屏的函数
{
    rs = 0;     
    P0 = aa;
    delay (2);
    lcden = 1;
    delay (2);
    lcden = 0;         
}

void write_date(uchar date)//此为输入数据给1602显示屏的函数
{
       rs = 1;
       P0 = date;
       delay (2);
       lcden = 1;
       delay (2);
       lcden = 0;
}

void yejing_init ()//液晶显示屏1602初始化
{
    write_com (0x38);  //输入指令
    write_com (0x0c);
    write_com (0x06);
    write_com (0x01);
    write_com (0x80);
}
void yejing_write (uchar wei,uchar shu)//给1602的第几位写入一个shu
{
        write_com (0x80 + wei);
        write_date (0x30 + shu);
}

void mian()
{
           yejing_init();
           keyvalue = 20;//初始化为了下面简单的if判断
            while(1)
            {
                    jian(0);//扫描第一行输出keyvalue的值
                   jian(1);
                   jian(2);
                   jian(3);
                      if (keyvalue != 20)
                      {
                          //但是按有些键3次它还是出现显示3个就是在第一个的后再面显示两个,这是怎么回事,有些按键就没有错误,还有我用状态机写的一个矩阵检测程序错误多多啊,这个程序我只是用于检测怎么消除重用的影响的,如果哪位大哥知道的指导一下
                            P3=0xff;  //我觉得这样可以消除重用的影响
                          yejing_write (0,keyvalue);  //显示keyvalue的值
                           P3=0xff;   //我觉得这样可以消除重用的影响
                           keyvalue = 20;
                      }
      }
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。