OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4889|回复: 2

修改51程序4*4按键扫描到mini板

[复制链接]

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2013-11-21 19:01:28 | 显示全部楼层 |阅读模式
先附上51例程,32代码还在修改之中

由于某开发板的4*4按键啃了。。。按键直接按下去没有反应。导致折腾了一下午。。。刚刚才发现。。。



/********************************************************************************
*  描述:                                                                       *    
*                   矩阵键盘数码管显示键值                                     *    
*          数码管为共阳1位数码管
*         矩阵键盘定义:                                                       *
*         低四为列线,高四为行线                                      *    
*          矩阵键盘P2口, 数码管接p3口                                        *    
*  注意:请将JP165短路冒断开                                                   *                            
********************************************************************************/

#include <reg51.h>
                   
#define uchar unsigned char     //宏的定义变量类型 uchar 代替 unsigned char
#define uint  unsigned int     //宏的定义变量类型 uint  代替 unsigned int

uchar  dis_buf;            //显示缓存
uchar  temp;
uchar  key;                //键顺序吗
void delay0(uchar x);      //x*0.14MS

// 此表为 LED 的字模                 0      1        2     3       4     5        6     7        8     9      a          b       c    d      e         f
unsigned char code LED7Code[] = {~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};

/*************************************************************
*                                                           *
* 延时子程序                                                *
*                                                           *
*************************************************************/

void  delay(uchar x)
{ uchar j;
    while((x--)!=0)  //CPU执行x*12次
    { for(j=0;j<125;j++)
         {;}
    }
}

/*************************************************************
*                                                            *
* 键扫描子程序  (4*3 的矩阵) P1.4 P1.5 P1.6 P1.7为行         *
*                              P1.1 P1.2 P1.3为列             *
*                                                             *
*************************************************************/

 void  keyscan(void)
 {     temp = 0;
    P2=0xF0;                 //高四位输入   行为高电平  列为低电平
    delay(1);                 //延时
    temp=P2;                 //读P1口
    temp=temp&0xF0;             //屏蔽低四位
    temp=~((temp>>4)|0xF0);      
    if(temp==1)      // p1.4 被拉低
        key=1;  //第1个按键键值
    else if(temp==2)   // p1.5 被拉低
        key=2;      //第2个按键键值
    else if(temp==4)   // p1.6 被拉低
        key=3;     //第3个按键键值
    else if(temp==8)   // p1.7 被拉低
         key=4;      //第4个按键键值
    else
        key=16;
        
    P2=0x0F;             //低四位输入  列为高电平 行为低电平
    delay(1);             //延时
    temp=P2;             //读P1口      
    temp=temp&0x0F;
    temp=~(temp|0xF0);
    if(temp==2)           //p1.1  被拉低
        key=key+0;
    else if(temp==4)   //p1.2  被拉低
        key=key+4;
    else if(temp==8)    //p1.3  被拉低
        key=key+8;
    else
        key=16;    
       
     dis_buf = key;        //键值入显示缓存
     dis_buf = dis_buf & 0x0f;
 
 }

/*************************************************************
*                                                           *
*判断键是否按下                                             *
*                                                           *
*************************************************************/

 void  keydown(void)
 {  
      P2=0xF0;       //将高4位全部置1 低四位全部置0
    if(P2!=0xF0)  //判断按键是否按下 如果按钮按下 会拉低P1其中的一个端口
    {
      keyscan();  //调用按键扫描程序
    }
 }
 
/*************************************************************
*                                                            *
* 主程序                                                     *
*                                                            *
*************************************************************/
main()
 {
    P3=0xFF;                    //置P0口
    P2=0xFF;                    //置P1口  
    delay(10);                  //延时
    
    while(1)
    {
       keydown();     //调用按键判断检测程序
       P3 = LED7Code[dis_buf%16]&0x7f;     //LED7 0x7f为小数点 共阴和共阳此处也是不一样;  %16表示输出16进制
 //          P3 = LED7Code[1];     //LED7 0x7f为小数点 共阴和共阳此处也是不一样;  %16表示输出16进制

    }
  }   



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

头像被屏蔽

2

主题

164

帖子

1

精华

禁止访问

积分
1316
金钱
1316
注册时间
2012-5-13
在线时间
127 小时
发表于 2013-11-22 19:28:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
 楼主| 发表于 2013-11-22 19:57:32 | 显示全部楼层
回复【2楼】qq371833846:
---------------------------------
不会。。。不过那个看起来很简单
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 02:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表