3380|7

53

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

4*4键盘程序,不知道哪里有问题,帮我看看 [复制链接]


假设P0口接4*4键盘,0-3口位行,4-7为列;P2口为显示输出,P3口为LED片选信号.
#include
unsigned char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char readkey()
{unsigned char i,j,keyvalue;
P0=0xf0;
if(P0==0xf0) return 17;
else
   for(i=0;i<4;i++)
    {
          P0=~(1<           for(j=4;j<8;j++)
           {
             if((P0&0xf0)&((1<                  {
                   keyvalue=(j-4)*4+i;
                 }
       }                    
        }
  return keyvalue;
}
void delay(unsigned char time)
{
while(!(time--));
}

void display(unsigned char val) //共阴极显示
{
unsigned char cs,dat[2],temp,pstn=0;
dat[0]=val/10;
dat[1]=val-(10*dat[0]);

for(cs=0;cs<2;cs++,pstn++)
   {temp=dat[pstn];
    P3=~(1<         P2=seg[temp];
        delay(50);
   }
    if((cs==2)|(pstn==2))
      {
          cs=0;pstn=0;
      }
}
main()
{ unsigned char value;
  while(1)
  {
   value=readkey();
   display(value);
  }

在keil2 中运行,总是读不了按键的值,请大家帮我看哈!

最新回复

[code] /*************************************************************************************** * *函数功能:4*4矩阵键盘扫描--行扫描法 *功能描述:有键按下键码返回为keycode[i *4 + j],没有键按下则返回-1,按键没有松开也返回-1 *内部变量:i--行值,j--列值,VALUE--键盘读入数据,null--连击标志 *输入参数:无 *输出参数:keycode[i *4 + j] *编写:Kool        日期:2008.5.20 * **************************************************************************************/ #include "STC.h" #include "stdio.h" #define uchar unsigned char #define uint unsigned int #define key_interface P1//键盘接口 unsigned char code keycode[16] = { 0x01,0x02,0x03,0x0f,//自定义键盘编码                                         0x04,0x05,0x06,0x0e,                                    0x07,0x08,0x09,0x0d,                                    0x0a,0x00,0x0b,0x0c}; //键盘扫描函数------行列反转法-------// uchar keyboard(void) {         idata unsigned char i,j,VALUE;//行扫描值,列扫描值,键值         static bit null = 0;//连击标志         for(i = 0;i < 4;i ++)         {                 key_interface = (0xf7 >> i) | 0xf0;//输出扫描行                 if((VALUE = key_interface & 0xf0) != 0xf0)break;//读入扫描列         }         if((~VALUE & 0xf0) == 0)//没有按键按下返回 -1,同时清除连击标志位         {                 null = 0;                 return(-1);         }         if(null == 1)return(-1);//按键被连击,返回 -1         for(j = 0;j < 4;j ++)                 if(((VALUE   详情 回复 发表于 2008-6-3 18:19
点赞 关注

回复
举报

89

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
判断按键的原理没有搞清。一个按键要两次扫描才可以。还有要防都。你在keil是不会有结果的。自己看明白了在来问吧!
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
keyvalue=j - 4 +i*4;   ???
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

4
 
加防抖程序以后如下

#include
unsigned char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char readkey()
{unsigned char i,j,keyvalue;
P0=0xf0;
if(P0==0xf0) return 17;  //如果没有按键按下,返回17
else
  {
   delay(100);            //防抖
   if(P0==0xfo) return 17;
else
{
  for(i=0;i <4;i++)
    {
  P0=~(1 <   for(j=4;j <8;j++)    // 依次检查每列
  {
    if((P0&0xf0)&((1 < {
  keyvalue=(j-4)*4+i; //计算的按钮的值
}
      }   
}
  return keyvalue;
}
}
}
void delay(unsigned char time) //延时程序
{
while(!(time--));
}

void display(unsigned char val) //共阴极显示
{
unsigned char cs,dat[2],temp,pstn=0;
dat[0]=val/10;   //十位
dat[1]=val-(10*dat[0]); //个位

for(cs=0;cs <2;cs++,pstn++)
  {temp=dat[pstn];
    P3=~(1 < P2=seg[temp];
delay(50);
  }
    if((cs==2) ?(pstn==2)) //动态显示,复位
      {
  cs=0;pstn=0;
      }
}
main()    //主程序
{ unsigned char value;
  while(1)
  {
  value=readkey();
  display(value);
  }
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

5
 
17是什么啊?另外 delay(100); 就直接加进去了? if((P0&0xf0)&((1 <
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

6
 
<<之间不能有空格,主程序明显少个},延时那个delay好像也有问题。你编译过了吗?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

7
 
那个是笔误,已经改正了
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
[code]
/***************************************************************************************
*
*函数功能:4*4矩阵键盘扫描--行扫描法
*功能描述:有键按下键码返回为keycode[i *4 + j],没有键按下则返回-1,按键没有松开也返回-1
*内部变量:i--行值,j--列值,VALUE--键盘读入数据,null--连击标志
*输入参数:无
*输出参数:keycode[i *4 + j]
*编写:Kool        日期:2008.5.20
*
**************************************************************************************/
#include "STC.h"
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
#define key_interface P1//键盘接口

unsigned char code keycode[16] = { 0x01,0x02,0x03,0x0f,//自定义键盘编码
                                        0x04,0x05,0x06,0x0e,
                                   0x07,0x08,0x09,0x0d,
                                   0x0a,0x00,0x0b,0x0c};
//键盘扫描函数------行列反转法-------//
uchar keyboard(void)
{
        idata unsigned char i,j,VALUE;//行扫描值,列扫描值,键值
        static bit null = 0;//连击标志
        for(i = 0;i < 4;i ++)
        {
                key_interface = (0xf7 >> i) | 0xf0;//输出扫描行
                if((VALUE = key_interface & 0xf0) != 0xf0)break;//读入扫描列
        }
        if((~VALUE & 0xf0) == 0)//没有按键按下返回 -1,同时清除连击标志位
        {
                null = 0;
                return(-1);
        }
        if(null == 1)return(-1);//按键被连击,返回 -1
        for(j = 0;j < 4;j ++)
                if(((VALUE << j) & 0x80) == 0)break;
        null = 1;//有键盘被按下,确定连击标志
        return(keycode[i * 4 + j]);//返回按键编码
}
void delay_key(void)
{
        idata uchar i;
        for(i = 0;i < 210;i ++);
        for(i = 0;i < 210;i ++);
        for(i = 0;i < 210;i ++);
        for(i = 0;i < 210;i ++);
}
char SCANF(void)
{
        idata char get_char;
        idata char gnull;
        idata char count = 0;
        get_char = keyboard();
        if(get_char == -1)return(-1);
        else
        {
            while(count <= 12)
            {
                delay_key();
                gnull = keyboard();
                count ++;
                if(gnull == get_char)
                {
                        gnull == 0;
                        break;
                }
            }
            if(gnull == -1)return(get_char);
            else
                return(-1);
        }
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
艾睿电子& Silicon Labs 有奖直播 | 全新蓝牙信道探测:从技术创新到实际应用
直播时间:3月12日(周三)上午10:00
直播奖励:多功能榨汁机、蓝牙音箱、手机支架

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表