关于LCD1602与矩阵按键——按键按下时与按键释放时,效果不一致,且按下时乱码

2019-07-15 10:49发布

关于LCD1602与矩阵按键——按键按下时与按键释放时,效果不一致,且按下时乱码。向各位前辈取经!!主要的功能先介绍一下:当按键按下一个键时,lcd显示相应的数字。下面是代码
#include<reg52.h>       
#define uchar unsigned char
#define uint unsigned int
uchar num[]="0123456789abcdef";
sbit LCD_RS=P2^6;        
sbit LCD_EN=P2^7;
sbit LCD_rw=P2^5;

void delay(uint n)                   //延时
{
                uint i,j;
                for(i=n;i>0;i--)
                for(j=110;j>0;j--);
}

void LCD_write_com(uchar com)           //  写指令函数
{

                LCD_RS=0;               //指令模式       
                P0=com;
                delay(5);               // 通过延时实现数据传输时序
                LCD_EN=1;                         //允许
                delay(5);                            //使能信号持续一定时间高电平
                LCD_EN=0;
                delay(5);
                          
}
void LCD_write_data(uchar dat)
{

                LCD_RS=1;  //数据模式
                P0=dat;
                delay(5);
                LCD_EN=1;       
                delay(5);
                LCD_EN=0;  
                delay(5);

}
void LCD_init()                  //   LCD 设置
{
                LCD_RS=0;               //指令模式       
                LCD_rw=0;
                LCD_write_com(0x38);   //设置16x2显示,5x7点阵,8位数据接口
                LCD_write_com(0x0c);   //00001DCB   D=1开显示 C=1显示光标 B=1光标闪烁
                LCD_write_com(0x06);   //000001NS        N=1/0 光标+1/-1   S=1整屏(N=1)左移(N=0)右移  S=0 不移动
                LCD_write_com(0x01);        //清除屏幕显示
        //        LCD_write_com(0x80);
}

void display(uint x,uint y,uchar dat)  //显示字符函数
{        //y 为 行数选择项  x为显示位置 dat为显示的ASCII码值
                uint address;
                if(y==1)   
                    address=0x80+x;
                else
                                address=0xc0+x;
                LCD_write_com(address);
                LCD_write_data(dat);
}




uchar anasys_key(uchar  serial, uchar rate)
{          
     switch (serial)
     {
           case 0xf7:return(rate+0);
           case 0xfb:return(rate+1);
           case 0xfd:return(rate+2);
           case 0xfe:return(rate+3);
            default:return(0x00);
     }
}


uchar  getkey(void)
{                uint x;
            P1|=0xff;         //高位强制置一
                P1&=0x7f;          // 扫描置零
                if(((x=P1)&0x0f)!=0x0f){x|=0x80;return(anasys_key(x,0));}
                P1|=0xff;
                P1&=0xBf;
                if(((x=P1)&0x0f)!=0x0f){x|=0x40;return(anasys_key(x,4));}
                P1|=0xff;
                P1&=0xDf;
                if(((x=P1)&0x0f)!=0x0f){x|=0x20;return(anasys_key(x,8));}
                P1|=0xff;
                P1&=0xEf;
                if(((x=P1)&0x0f)!=0x0f){x|=0x10;return(anasys_key(x,12));}

}


void main()
{
        uchar t,tt;
        delay(400);
        LCD_init();
//        LCD_write_com(0x88);
        display(0,1,' ');


                while(1)
                {
                 t=getkey();
                 
                 delay(20);     /*防抖动*/
                 tt=getkey();
                 if((t==tt)&&(t!=0xff))
               {
                 while(tt==getkey());
                           
                display(1,1,num[t]);

                 
                 //等待按键松开

               }
            }
}

这是按下时的图像 微信图片_20170513154255.jpg
这是释放时的图像 微信图片_20170513154310.jpg


微信图片_20170513154317.jpg
微信图片_20170513154324.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。