大连创客空间

 找回密码
 立即注册吧!

QQ登录

只需一步,快速开始

一键登录:

搜索
查看: 10601|回复: 65
收起左侧

【大赛原创经验贴】按键的使用(中断法)及G2553的PxIN的问题

  [复制链接]
发表于 2012-7-13 16:36:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!

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

x
MSP430的功能还是很强大的 , 但是真实因为功能太强大以至于学的时候让我走了很多的弯路呀 , 而且因为MSP430G2553我记得那个TI的人给我说这是我们最新的芯片 , 果然最新网上资料好少哦 , 而且G2553有的地方和以前430不一样 , 好开始吧

因为TI杯要求用Launchpad , 而Launchpad的端口有限 , 所以按键不可能用我们平常的矩阵键盘 , 就只有用独立按键了 , 如果只在while中循环有的按键无法识别 ,中断就是很好的选择

说到按键有的人可能会说简单 , 就是   按下按键 --> 进入中断 --> 确定是否按下 -->  延时  --> 是否按下  -->  判别按键  --> 做出相应的选择

也确实是这样的 , G2553在识别上面有些问题 , 我就是在这个问题上困扰了半天 , 先上图
1.png
按道理说  P1REN = 0xff;  P2REN = 0xff;(测试语句) 这两句话就是给P1 和P2加上拉电阻 , 按道理这两句执行完了之后PxIN这个寄存器应该全部变为0xff , 但是P2口外面什么也没有接只是部分拉为1 , 这一点不知道为什么 , 在此给大家一个参考  还有在Launchpad上P1.0 P1.6默认是插上了短路冒 , 会导致P1IN.0 P1IN.6拉不高 , 这一点要注意 , 而且有时候P1IN;也无法完全拉低 , 调试的时候注意一下, 给大家一个参考 , 下面是我写的按键程序
包含main.c   key.c   key.h 及

/****************key.h*******************/
/* 利用IO口的中断来检测按键
**
*/
#ifndef  _KEY_H_
#define  _KEY_H_
//宏定义
#define  key0     BIT5
#define  key1     BIT1
#define  key2     BIT2
#define  key3     BIT3
#define  PxIE     P1IE
#define  PxIN     P1IN
#define  PxREN  P1REN
#define  PxSEL   P1SEL
#define  PxIFG   P1IFG
#define  PxIES   P1IES
#define  PxDIR   P1DIR
#define  key_0   (PxIN & key0)
#define  key_1   (PxIN & key1)
#define  key_2   (PxIN & key2)
#define  key_3   (PxIN & key3)
#define  KeyW   ( key0 | key1 | key2 | key3)
#define  wait()   (KeyW == (PxIN & KeyW))    //松手检测

void KeyInit();            //完成中断的配置
unsigned char KeyScan();//键盘扫描函数
#endif
/**************key.h end*****************/

/****************key.c*******************/
//此函数完全调用 key.h里面的宏定义 ,增减按键 ,  移植方便
#include <msp430.h>
#include "key.h"
extern unsigned char KeyValue;  //声明全局变量

void KeyInit()
{
    PxDIR &= ~KeyW;    //把四个按键设置为输入
    PxREN |=  KeyW;    //配置上拉电阻
    PxIE  |=  KeyW;    //使能四个按键的中断
    PxIES |=  KeyW;    //四个按键选择下降沿沿触发
    PxIFG &= ~KeyW;    //清除四个按键的中断标志位
}
unsigned char KeyScan()
{
    unsigned char KeyCheck;
    unsigned char KeyCheckIn;
    KeyCheckIn  = PxIN;              //读取PxIN
    KeyCheckIn &=  KeyW;             //取按键得那几位
    if (KeyCheckIn != KeyW)          //判断是否按下
    {
        __delay_cycles(15000);       //消抖
        KeyCheck = PxIN;             //读取PxIN
        switch (KeyCheck & KeyW)     //判断键值
        {
            case (KeyW & (~key0)) :
              wait();
              return 1 ; break;
            case (KeyW & (~key1)) :
              wait();
              return 2 ; break;
            case (KeyW & (~key2)) :
              wait();
              return 3 ; break;
            case (KeyW & (~key3)) :
              wait();
              return 4 ; break;
        default : return 0;
        }
    }
    return 0;
}
/**************key.c end*****************/

/****************main.c*******************/
#include <msp430g2553.h>
#include "12864.h"
#include "key.h"

//KeyValue 值为0是未被按下 , 四个键分别返回 1 , 2 , 3 , 4
unsigned char KeyValue;  //定义一个全局变量保存键盘返回值
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  P2DIR |= BIT4|BIT5|BIT3;//作为12864的输出端口
  L12864s_Init();
  L12864s_DisChar(0,0,'x');  //测试12864显示
  //L12864s_WriteToLcd(0x30 + (char)KeyValue , DATA);
  KeyInit();
  _EINT();
  while(1)
  {
    LPM0;
    if(KeyValue)
    {
      L12864s_WriteToLcd(0x30 + KeyValue , DATA) ;  //显示返回的值
      KeyValue = 0;  //清空返回值
    }
    _NOP();
  }
}

#pragma vector=PORT1_VECTOR
__interrupt void POPT1_IRQ(void)
{
    LPM0_EXIT;
    _DINT();
    KeyValue = KeyScan(); //读取键值
    P1IFG &= ~KeyW;       //清除标志位 , 等待下一次中断
    _EINT();
}
//关于12864的函数我会以附件的形式供大家下载
/**************main.c end*****************/
上一张效果图
2.png

希望对大家写按键程序有说启发

key module.zip (9.99 KB, 下载次数: 1008)
回复

使用道具 举报

发表于 2012-7-13 16:49:49 | 显示全部楼层
图文并茂,顶一个
回复 支持 反对

使用道具 举报

发表于 2012-7-13 21:37:00 | 显示全部楼层
很不错
回复 支持 反对

使用道具 举报

发表于 2012-7-13 21:54:39 | 显示全部楼层
今天晚上有的事做了!看到越来越多的好帖呈现在大家眼前,还真是高兴!
回复 支持 反对

使用道具 举报

发表于 2012-7-13 22:43:09 | 显示全部楼层
"#define  key0     BIT5 “这句有误?
另外中断的_DINT() 和 _EINT() 是否可以不要?
呵呵,还有就是没有找到文章开头提出来的问题:P1.1 P1.1 P1.7没有被拉高!
文章看完了,谢谢楼主的分享!
回复 支持 反对

使用道具 举报

发表于 2012-7-14 00:01:53 | 显示全部楼层
请问12864是怎样接的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 10:24:20 | 显示全部楼层

这句话 , 没有错 , 我这些的这个程序 , 只需要定义 BITx 就行了 , 其他的全交给宏定义解决 ,方便移植
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 10:31:16 | 显示全部楼层
昨日依然 发表于 2012-7-14 10:24
这句话 , 没有错 , 我这些的这个程序 , 只需要定义 BITx 就行了 , 其他的全交给宏定义解决 ,方便移植 ...

_DINT()和_EINT()  这两句话也可以不要 , 但是为了防止其他的中断影响程序 , 加上程序更健壮 , P1IN有的端口没有拉低 , 是因为P1.0 P1.6的短路帽 , 接了LED的 , 去了就好了  P2IN的话 因为P2.6 , P2.7 接的晶振 ,也也拉不低 , 至于P2口其他的拉不低我也不清楚 , 我是全部反复的试了几次, 不知道为什么 , 提出来看大家也时不时这个情况 , 同时也给大家编程的时候一个参考
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-14 10:40:16 | 显示全部楼层
tian_zhuo 发表于 2012-7-14 00:01
请问12864是怎样接的?

#define L12864s_CLK     BIT5//定义串行时钟位
#define L12864s_SID     BIT4//定义串行数据位
#define L12864s_CCS     BIT3//定义片选位
这是12864的串行显示嘛
12864的宏定义里面有的
CLK也就是接 E       6脚
SID也就是接 R/W   5脚
CCS也就是接 RS     4脚
其他的该接VCC ,GND的就接VCC,GND 及电阻
7 - 14 不接
还有提醒一句 有的12864串行显示要在12864背面的R10加焊一个0欧姆的电阻 , R9不接电阻 , 记住是0欧姆的电阻

点评

R10在我的12864上还真的没发现,到是R9接了个电阻~这样我也一样可以显示,没多大的影响吧  详情 回复 发表于 2012-7-19 09:28
回复 支持 反对

使用道具 举报

发表于 2012-7-14 21:33:46 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

发表于 2012-7-14 21:42:11 | 显示全部楼层
昨日依然 发表于 2012-7-14 10:40
#define L12864s_CLK     BIT5//定义串行时钟位
#define L12864s_SID     BIT4//定义串行数据位
#define  ...

谢谢
回复 支持 反对

使用道具 举报

发表于 2012-7-14 21:49:14 | 显示全部楼层
不错  LaunchPad IO口确实少了 谢谢楼主了
回复 支持 反对

使用道具 举报

发表于 2012-7-15 16:14:16 | 显示全部楼层
正需要这些东西,先顶一个
回复 支持 反对

使用道具 举报

发表于 2012-7-15 20:05:06 | 显示全部楼层
额 还没到这一步呢 ,求教楼主啊。。。
回复 支持 反对

使用道具 举报

发表于 2012-7-15 22:17:06 | 显示全部楼层
lz辛苦了
回复 支持 反对

使用道具 举报

发表于 2012-7-16 09:33:18 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

发表于 2012-7-17 09:19:19 | 显示全部楼层
谢谢分享,学习了
回复 支持 反对

使用道具 举报

发表于 2012-7-17 10:00:46 | 显示全部楼层
谢谢了
回复 支持 反对

使用道具 举报

发表于 2012-7-17 13:58:08 | 显示全部楼层
谢谢楼主,挺好、、
回复 支持 反对

使用道具 举报

发表于 2012-7-17 17:15:35 | 显示全部楼层
楼主,我用你的程序有错误啊,它说key.h头文件包括为解决的问题啊,怎么办?
回复 支持 反对

使用道具 举报

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

本版积分规则

单片机开发者1群:235808606;会员QQ 6群:254085994; 1群:12835691(满); 2群:121061287(满); 3群:237320668(满);4群:249652919(满);5群:253578883(满);大赛1群:187926790(满),2群:231577758(满),3群:249652919(满)。 TI杯4群:58129202(满)。
载入中

QQ|手机版|小黑屋|Archiver|大连创客空间 ( 辽ICP备15004617号-2  

GMT+8, 2017-3-1 00:46 , Processed in 0.392064 second(s), 33 queries .

地址:辽宁省大连市高新园区火炬路7号17层 QQ:2401085253

Copyright © 2010-2015 创客空间(大连)科技有限公司 All Rights Reserved.

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