打印

麻烦高手帮忙看下键盘扫描的问题

[复制链接]
1635|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
szmc|  楼主 | 2011-6-19 14:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg51.h>
#include <intrins.h>

sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;


#define uchar unsigned char
#define uint  unsigned int

uint key;
uchar code1[]={"0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,-"};
uchar code2[]={"   Key number    "};
uchar code3[]={"   key code:-  H "};

void delay_1ms(uint n)
{
uint i,j;
for(i=0;i<n;i++)
     for(j=0;j<125;j++);
}

void write_cmd(uchar cmd)
{
  rs=0;
  rw=0;
  en=1;
  P0=cmd;
  delay_1ms(20);
  en=0;

}
void write_dat(uchar dat)
{
  rs=1;
  rw=0;
  en=1;
  P0=dat;
  delay_1ms(20);
  en=0;

}

void lcd_init()
{
   en=1;
   write_cmd(0x38);
   delay_1ms(10);
   write_cmd(0x0c);
   delay_1ms(10);
   write_cmd(0x06);
   delay_1ms(10);
   write_cmd(0x01);
   delay_1ms(10);
   en=0;
}

void keyscan()
{
  uchar temp,sem1,sem2;
  P1=0xf0;
  temp=P1;
  if(temp!=0xf0)
    {
           delay_1ms(15);
           if(temp!=0xf0)
              sem1=temp&0xf0;
                  P1=0x0f;
                  delay_1ms(1);
                  temp=P1;
                  sem2=temp&0x0f;
                  temp=sem1|sem2;
        }
   switch(temp)
   {
        case 0xee : key=0;   break;
        case 0xde : key=4;   break;
        case 0xbe : key=8;   break;
        case 0x7e : key=12;  break;
        case 0xed : key=1;   break;
        case 0xdd : key=5;   break;
        case 0xbd : key=9;   break;
        case 0x7d : key=13;  break;
        case 0xeb : key=2;   break;
        case 0xdb : key=6;   break;
        case 0xbb : key=10;  break;
        case 0x7b : key=14;  break;
        case 0xe7 : key=3;   break;
        case 0xd7 : key=7;   break;
        case 0xb7 : key=11;  break;
        case 0x77 : key=15;  break;
        default   : key=16;  break;                        

   }
}

void main()
{
  uint k;
  lcd_init();
  delay_1ms(10);
  write_cmd(0x80);
  for(k=0;k<16;k++)   
          {                    
            write_dat(code2[k]);
        delay_1ms(10);
          }
  write_cmd(0x80+0x40);
  for(k=0;k<16;k++)   
          {                    
            write_dat(code3[k]);
        delay_1ms(10);
          }
  
  while(1)
  {
  keyscan();
  delay_1ms(1);
  write_cmd(0x80+0x4d);
  delay_1ms(2);
  write_dat(code1[key]);
  delay_1ms(10);
  }
  
}

相关帖子

沙发
szmc|  楼主 | 2011-6-19 14:56 | 只看该作者
P1口扫描,1602 显示,该程序最后显示 始终是Key number    key code:- 8H ,按下键盘后短暂显示后恢复到8H,只可显示0,1,2,3,4,5,6,7,8,后面的无从显示!

使用特权

评论回复
板凳
szmc|  楼主 | 2011-6-19 14:58 | 只看该作者
4×4键盘扫描,行向依次是P10,P11,P12,P13,列向依次是P14,P15,P16,P17。看了半天没闹明白,请高手帮忙看下问题所在!

使用特权

评论回复
地板
sysdriver| | 2011-6-19 21:52 | 只看该作者
程序应该不是你写的,因为键盘扫描那里思路比较混乱,估计问题就出在那里了,一眼就看出消抖没作用,
延时15ms后,要重新读P1给temp才能判断,还有就是取端口值的那个运算,我也看不明白。

使用特权

评论回复
5
刘前辈| | 2011-6-20 10:19 | 只看该作者
uchar code1[]={"0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,-"};


应写为:
uchar code1[]="0123456789ABCDEF";
或者:
uchar code code1[]={"0123456789ABCDEF"};

//

使用特权

评论回复
6
szmc|  楼主 | 2011-6-20 11:45 | 只看该作者
刘前辈点评很得力,对于sysdriver的指正,只是加了两个变量,temp1,temp2分别接受0xf0,0x0f的扫描结果,恢复正常,谢谢专家大牛的建议

使用特权

评论回复
7
szmc|  楼主 | 2011-6-20 11:46 | 只看该作者
最后要声明的是,程序是我写的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

38

帖子

1

粉丝