搜索
bottom↓
回复: 14

求430的矩阵键盘程序

[复制链接]

出0入0汤圆

发表于 2012-7-4 11:23:33 | 显示全部楼层 |阅读模式
求帮助,谁写过430的矩阵键盘程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-7-5 20:21:43 | 显示全部楼层
这貌似不是很难吧?再讲矩阵键盘也有使用中断与不使用中断两种,你又不讲要哪一种……

出0入0汤圆

发表于 2012-7-7 20:38:39 | 显示全部楼层
unsigned char keyscan (void)
{
  unsigned char ss;  
  unsigned char num;     //按键号
  P1DIR =0x0f;           //行P1.0-P1.3输出 列P1.4-P1.7输入

//------------------------------------------------
P1OUT = 0xf7;
ss=P1IN;
if(ss!=0xf7)     //第一行有键被按下
{
delay(200);        
switch(ss)
{
case 0xe7:{num=4;break;}
case 0xd7:{num=3;break;}
case 0xb7:{num=2;break;}
case 0x77:{num=1;break;}
default:num=17;
}
while(P1IN!=0xf7);
}  

delay(200);      
//------------------------------------------------

P1OUT = 0xfb;
ss=P1IN;
if(ss!=0xfb)     //第二行有键被按下
{
delay(200);        
switch(ss)
{
case 0xeb:{num=8;break;}
case 0xdb:{num=7;break;}
case 0xbb:{num=6;break;}
case 0x7b:{num=5;break;}
default:num=17;
}
while(P1IN!=0xfb);
}  
delay(200);
//-----------------------------------------------
P1OUT = 0xfd;
ss=P1IN;
if(ss!=0xfd)     //第三行有键被按下
{
delay(200);        
switch(ss)
{
case 0xed:{num=12;break;}
case 0xdd:{num=11;break;}
case 0xbd:{num=10;break;}
case 0x7d:{num=9;break;}
default:num=17;
}
while(P1IN!=0xfd);
}  
delay(200);
//----------------------------------------------
return num;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-7-9 10:19:49 | 显示全部楼层
不用中断,本人初学430,搞了好久没弄出来,希望给个实例参考参考。

出0入0汤圆

发表于 2012-7-12 17:48:54 | 显示全部楼层
青云LI 发表于 2012-7-9 10:19
不用中断,本人初学430,搞了好久没弄出来,希望给个实例参考参考。

可以参考一下   呵呵呵

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2012-7-12 21:29:55 | 显示全部楼层
guo594188 发表于 2012-7-12 17:48
可以参考一下   呵呵呵

谢谢指点,已解决

出0入0汤圆

发表于 2012-7-14 21:51:35 | 显示全部楼层

出0入0汤圆

发表于 2012-7-17 14:52:10 | 显示全部楼层
------------楼上你笑什么-

出0入0汤圆

发表于 2012-7-17 16:53:19 | 显示全部楼层
楼主 我写过一个用看门狗作用作间隔定时器  定时器消抖的 比较高级的矩阵按键 扫描 你需不需要?~自认为 比三楼要好

出0入0汤圆

 楼主| 发表于 2012-7-17 22:55:15 | 显示全部楼层
爬爬 发表于 2012-7-17 16:53
楼主 我写过一个用看门狗作用作间隔定时器  定时器消抖的 比较高级的矩阵按键 扫描 你需不需要?~自认为 比 ...

嗯 ,谢了,给我学习学习吧,不过现在用的是买的矩阵键盘,不需要消抖,不过以后一定用的到

出0入0汤圆

发表于 2012-7-17 23:50:28 | 显示全部楼层
青云LI 发表于 2012-7-17 22:55
嗯 ,谢了,给我学习学习吧,不过现在用的是买的矩阵键盘,不需要消抖,不过以后一定用的到 ...

?买的键盘为什么就不用消抖?
感觉你对基本原理并不清楚,还是多看看书,把基础打牢些吧

出0入0汤圆

发表于 2012-7-23 09:54:27 | 显示全部楼层
你没接上拉电阻,会检测不到按键

出0入0汤圆

发表于 2012-7-23 17:05:07 | 显示全部楼层
爬爬 发表于 2012-7-17 16:53
楼主 我写过一个用看门狗作用作间隔定时器  定时器消抖的 比较高级的矩阵按键 扫描 你需不需要?~自认为 比 ...

贴出来看看,我觉得多条思路对以后编程有益

出0入0汤圆

发表于 2012-7-24 13:39:40 | 显示全部楼层
yf88865 发表于 2012-7-23 17:05
贴出来看看,我觉得多条思路对以后编程有益

这是按键的程序
#include<msp430x14x.h>
#include"UART.h"
#define OK 1
#define NO 0
typedef unsigned char uint8;
typedef unsigned int uint16;
void key_init()
{
#ifdef DEBUG
    send_string("key board is initaled");
    NEXT;
#endif
    P1DIR|=(BIT7+BIT6+BIT5+BIT4);
}
unsigned char key_scan()
{
    P1OUT&=~(BIT7+BIT6+BIT5+BIT4);
    if((P1IN&0X0F)!=0X0F) return OK;//返回一个作为判断是否按下
    else return NO;
}

unsigned char key_get()
{
    uint8 temp1=0x80;
    uint8 n=0;
    for(n=0;n<4;n++)
    {
      P1OUT=0XF0;   
      P1OUT&=~temp1;//依次将输入給低 且只有一个为低
      temp1>>=1;
      if((P1IN&BIT0)==0) return (1+(n*4));
      if((P1IN&BIT1)==0) return (2+(n*4));
      if((P1IN&BIT2)==0) return (3+(n*4));
      if((P1IN&BIT3)==0) return (4+(n*4));
    }
    return 0;
}
下面是在主函数关于按键 的程序
#pragma vector=WDT_VECTOR
__interrupt void WDT_int()
{
    //static uint16 j=0;
    //static uint8 j2=0;
    static uint8 cnt=0;
    static uint8 flag1=0;
    static uint8 flag2=0;
#ifdef DEBUG
    j++;
    if(j==1000)
    {
        j=0;
        j2++;
        if(j2%2)  LED_1;
        else LED_0;//led的作用是作为一个指示灯 做一个LED小模块 作为指示灯
    }
#endif
    cnt++;
    if(cnt==30)
    {
        cnt=0;
        if(flag1=key_scan())
        {
            if(!flag2)
            {
#ifdef DEBUG
                send_string("key is pressed");
                NEXT;
#endif
                num=key_get();
#ifdef DEBUG
                send_char(num+48);
                NEXT;
#endif
            }
            flag2=flag1;
        }
    }
    if((flag1==0)&&(flag2==1))
    {
#ifdef DEBUG
        send_string("key gets up");
        NEXT;
#endif
        flag2=0;
        //LPM3_EXIT;
     }
}
/*将按键的检测放入看门狗定时器中断中  每隔一定时间进来检测 */

出0入0汤圆

发表于 2012-12-13 14:23:10 | 显示全部楼层
防抖不太好做
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 08:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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