打印

为什么我的5*5矩阵键盘不同按键有相同的键码?

[复制链接]
1875|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主





图中的三位数字就是按下相应按键的时候数码管显示的数字,右边第一列的数字和右边第二列的显示相同,求大神

#include <REG51xD2.H>//包含头文件
#define uchar unsigned char
#define uint unsigned int
sbit P20 =P2^0;
sbit P33=P3^3;
sbit SEG1 = P2^6;
sbit SEG2 =P2^7;
sbit SEG3 =P2^5;
unsigned int  ui_cord_h,ui_cord_l;//行列值
unsigned int ui_temp,ui_tempP33,ui_tempP20;

unsigned char const dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
                    0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F,数码管来显示按下键的值。
uchar keyscan(void);            //主要的矩阵键盘扫描函数。
void delay(uint i);
void main()
{
uchar uc_key;
uchar uc_gewei, uc_shiwei, uc_baiwei;
//变量初始化
ui_cord_h=0x0000;
ui_cord_l=0x0000;
//端口初始化
P0 = 0XFF;
P20 =1;
P33=1;
while(1)
{
uc_key=keyscan();//调用键盘扫描,
uc_baiwei = uc_key/100;
uc_shiwei = uc_key%100/10;
uc_gewei  = uc_key%10;

P1=0XFF;
P1= ~dofly[uc_gewei];
SEG1 =1;
SEG2 =0;
SEG3 =0;
delay(10);

P1=0XFF;
P1= ~dofly[uc_shiwei];
SEG1 =0;
SEG2 =1;
SEG3 =0;
delay(10);
P1=0XFF;
P1= ~dofly[uc_baiwei];
SEG1 =0;
SEG2 =0;
SEG3 =1;
delay(10);

}
}
uchar keyscan(void)//键盘扫描函数,使用行列反转扫描法 比如:行为低电位,列为高四位
{

//行线5位写0  列线5位写1
P0=0x1f;
P20 =0;
P33= 0;         
//读取 列线值
ui_tempP20=P20;
ui_tempP20<<=8;
ui_tempP33=P33;
ui_tempP33<<=9;
ui_cord_h=(P0&0x1f)|ui_tempP20|ui_tempP33;     // 列线肯定有一个为0,读入列线值
//cord_h  是一个unsgined int 类型,最高几位  会不会不是0;===============王
if(ui_cord_h!=0x001f)    //先检测有无按键按下
{
delay(100);        //去抖
if(ui_cord_h!=0x001f)
{    //0000 0011 1110 0000
    //cord_h=P3&0x0f; //读入列线值  至此已经确定按下的按键在哪一个列,
    // cord_h=P0&0x0f|((P20&0)<<8)|((P33&0)<<9);
  // 0000 00  00 0001 1110
  //====================ui_cord_h  已经确定
    ui_tempP20=P20;
    ui_tempP20<<=8;
    ui_tempP33=P33;
    ui_tempP33<<=9;
  //=================================
ui_cord_h=(P0&0x1f)|ui_tempP20|ui_tempP33;     // 列线肯定有一个为0,读入列值
/////////////////////////===============================================
   // P3=cord_h|0xf0; //输出当前列线值  只把被按下按键的列拉低 XXXX 1110
    // 0000 00  00 0001 1110
   //  0000 00  11 1110 0000
  //   0000 00  11 1111 1110
//行列翻转
// ui_cord_h   0000 00 XX XXX1 1110    例如 0000 00 01 1111 1110
    ui_temp = ui_cord_h|0x03E0;
//    0000 0011 1110 0000
//   P0= ui_temp&0x03E0;
   //  P0=ui_temp&0x00FF;
//P0 = 0X00FE   &0XE0     =0XE0
   P0=(ui_temp&0x00FF)&0X03E0;
         P20 =(ui_temp&0x0100)>>8;
   P33= (ui_temp&0x0200)>>9;
//再次读取键值
  ui_tempP20= P20;
  ui_tempP33= P33;
  
ui_cord_l=(P0&0xE0)|(ui_tempP20<<8)|(ui_tempP33<<9);     // 列线肯定有一个为0,读入列线值
    //cord_l=P3&0xf0; //读入行线值
   // cord_l=temp&0xf0; //读入行线值
    return(ui_cord_h+ui_cord_l);//键盘最后组合码值
   }
}return(0xff);     //返回该值
}
void delay(uint i)//延时函数
{
while(i--);
}

相关帖子

沙发
huangxz| | 2013-5-27 23:04 | 只看该作者
感觉楼主写的好乱啊, 一个字节都可以表示的键值为啥要3个字节去表示啊:L

使用特权

评论回复
板凳
huangxz| | 2013-5-27 23:05 | 只看该作者
扫描的一般都要上拉电阻,没看到楼主电路中有上拉电阻啊

使用特权

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

本版积分规则

101

主题

205

帖子

1

粉丝