msp430f149 4x4矩阵按键(薄膜)

发布者:SparklingRiver最新更新时间:2022-09-15 来源: csdn关键字:msp430f149  4x4  矩阵按键  薄膜 手机看文章 扫描二维码
随时随地手机看文章

main.c

/********************************************************************

//DM430-A型开发板矩阵键盘控制程序,通过数码管显示按键值,采用逐行扫描

//4X4键盘接在P1口,通过控制IO口状态变化,逐行扫描按键是否按下

//调试环境:EW430 V5.30

//作者:mmp

//创客


P1口设置为按键插入口  

更改引脚在Config.h文件中

有黑的地方插P1.0~P1.3 因为有上拉电阻

1 5 9 13

2 6 10 14

3 7 11 15

4 8 12 16

本程序按键布局


按照需求更改

        case 0xee:key=1;break;         //上拉电阻按下按键,P1.4输出低电平

        case 0xed:key=2;break;         //P1.5输出低电平

        case 0xeb:key=3;break;          //P1.6输出低电平

        case 0xe7:key=4;break;          //P1.7输出低电平

这个位置

********************************************************************/


#include

#include "Config.h"                     //开发板配置头文件,主要配置IO端口信息

#include "delay.h"


//***********************************************************************

//               MSP430IO口初始化

//***********************************************************************

void Port_Init()

{

  LED8SEL  = 0x00;                      //设置IO口为普通I/O模式,此句可省

  LED8DIR  = 0xFF;                      //设置IO口方向为输出

  LED8PORT = 0xFF;                      //P2口初始设置为FF

  

  

  KEYSEL = 0x00;                        //设置IO口为普通I/O模式,此句可省      

  KEYDIR = 0xf0;                        //低位输入模式(vcc流入)模式,外部上拉电阻

  KEYPORT= 0x0f;                        //初始值0xF0   0x0f

}



//**********************************************************************

// 键盘扫描子程序,采用逐行(列)扫描的方式

//**********************************************************************

uchar Key_Scan(void) 

{

  uchar statevalue,key_checkin,key_check;


  KEYPORT=0x0f;                       //在IO口由输出方式变为输入方式时要延迟一个周期

  KEYPORT=0x0f;                       //采取写两次的方法延时

  key_checkin=KEYIN;                  //读取IO口状态,判断是否有键按下

  if(key_checkin!=0x0f)               //IO口值发生变化则表示有键按下

  {

    Delay_Nms(20);                     //键盘消抖,延时20MS

    key_checkin=KEYIN;

    if(key_checkin!=0x0f)

    {

      KEYPORT=0xef;                    //逐行扫描开始 将P1.4  输出低电平 来扫描第一行

      KEYPORT=0xef;                    //写两次延时,下同

      key_check=KEYIN;

      switch (key_check)               //根据读到的IO口值判断按键的按下情况

      {                                   //上拉电阻平时为高电平,按下按键为低电平

        case 0xee:key=1;break;         //上拉电阻按下按键,P1.4输出低电平

        case 0xed:key=2;break;         //P1.5输出低电平

        case 0xeb:key=3;break;          //P1.6输出低电平

        case 0xe7:key=4;break;          //P1.7输出低电平

     }

     

     KEYPORT=0xdf;

     KEYPORT=0xdf;

     key_check=KEYIN;

     switch (key_check)

     {

        case 0xde:key=5;break;

        case 0xdd:key=6;break;

        case 0xdb:key=7;break;

        case 0xd7:key=8;break;

     }

     

     KEYPORT=0xbf;

     KEYPORT=0xbf;

     key_check=KEYIN;

     switch (key_check)

     {

        case 0xbe:key=9;break;

        case 0xbd:key=10;break;

        case 0xbb:key=11;break;

        case 0xb7:key=12;break;

     }

     

     KEYPORT=0x7f;

     KEYPORT=0x7f;

     key_check=KEYIN;

     switch (key_check)

     {

        case 0x7e:key=13;break;

        case 0x7d:key=14;break;

        case 0x7b:key=15;break;

        case 0x77:key=16;break;

     }

     

    }

  }

  else

  {

    statevalue=0xff;                      //无按键时返回值

    key=statevalue;

    return(key);

  }

  return(key);

}


//*************************************************************************

// 主程序

//*************************************************************************


void main(void)

  WDT_Init();                       //看门狗初始化

  Port_Init();                      //端口初始化,用于控制IO口输入或输出

  while(1)

  {

    Key_Scan();                     //键盘扫描,看是否有按键按下

    if(key!=0xff)                   //如果有按键按下,则显示该按键键值0~15

    {

      {

        switch(key)

        {

          case 1: LED8PORT = BIT0 + BIT1 ;break;   //根据键值显示到数码管上

          case 2: LED8PORT = BIT2 + BIT3 ;break;

  case 3: LED8PORT = BIT4 + BIT5 ;break;

          case 4: LED8PORT = BIT6 + BIT7 ;break;

  case 5: LED8PORT = BIT1 + BIT2 ;break;

          case 6: LED8PORT = BIT1 + BIT3 ;break;

          case 7: LED8PORT = BIT1 + BIT4 ;break;

          case 8: LED8PORT = BIT1 + BIT5 ;break;

          case 9: LED8PORT = BIT1 + BIT6 ;break;

  case 10: LED8PORT =  BIT0 + BIT1;break;

          case 11: LED8PORT =  BIT0 + BIT2;break;

  case 12: LED8PORT =  BIT0 + BIT3 ;break;

  case 13: LED8PORT =  BIT0 + BIT4 ;break;

  case 14: LED8PORT =  BIT0 + BIT5 ;break;

  case 15: LED8PORT =  BIT0 + BIT6 ;break;

          case 16: LED8PORT =  BIT0 + BIT7 ;break;

         }

      }

    }

    

  else

  {  

    

    

    LED8PORT = 0XFF  ;              //没有按键的时候显示上次的键值  第八个灯灭,其它的亮

   

                               //第八个灯亮

    

  }

   

 }


}


#define CPU_F ((double)8000000) 

//#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) 

//#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) 


#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long


/*当BRCLK=CPU_F时用下面的公式可以计算,否则要根据设置加入分频系数*/

#define baud           9600                                //设置波特率的大小

#define baud_setting   (uint)((ulong)CPU_F/((ulong)baud))  //波特率计算公式

#define baud_h         (uchar)(baud_setting>>8)            //提取高位

#define baud_l         (uchar)(baud_setting)               //低位


#define LED8PORT        P2OUT                   //P2接8个LED灯

#define LED8SEL         P2SEL                   //P2接8个LED灯

#define LED8DIR         P2DIR                   //P2接8个LED灯


#define KEYPORT         P1OUT                   //按键所在的端口P3

#define KEYSEL          P1SEL                   //控制口功能寄存器,控制功能模式

#define KEYDIR          P1DIR                   //控制口方向寄存器

#define KEYIN           P1IN                    //键盘扫描判断需要读取IO口状态值


uchar key; //键值变量



//***********************************************************************

//               MSP430内部看门狗初始化

//***********************************************************************

void WDT_Init()

{

   WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗

}


```c

#ifndef __DELAY

#define __DELAY


#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long


void Delay_Nus(uint n);

void Delay_1ms(void);

void Delay_Nms(uint n);


#endif


```c

/********************************************

文件名:delay.c

编写者:xdq

描述:延时程序。用于14xx系列。

MCLK:12m   SCLK:4kHz   ACLK: 

[1] [2]
关键字:msp430f149  4x4  矩阵按键  薄膜 引用地址:msp430f149 4x4矩阵按键(薄膜)

上一篇:MSP430F149 反应速度测试仪 oled 显示
下一篇:msp430学习笔记_按键点亮LED

推荐阅读最新更新时间:2024-11-07 14:39

Vishay发布新款高精度薄膜SMD环绕片式电阻阵列
日前,Vishay Intertechnology, Inc.宣布,发布新系列适用于高温钻井和航空应用的高精度薄膜SMD环绕片式电阻阵列---PRAHT。新的PRAHT四电阻网络的工作温度为-55℃~+215℃,最高存储温度为+230℃,是业内首个采用薄膜技术制造的电阻阵列。 今天发布的Vishay Sfernice器件是油位和压力传感器、钻井勘探工具和航空发动机,以及刹车系统的绝佳选择。除高温性能外,电阻网络在额定功率、+215℃条件下工作2000小时后的负载寿命稳定率,仅有0.7%阻值漂移,具有10ppm/℃的严格TCR和2ppm/℃的TCR跟踪,电阻比的容差低至0.05%。 PRAHT系列的节距为1mm、1.35mm或1
[模拟电子]
Vishay发布新款高精度<font color='red'>薄膜</font>SMD环绕片式电阻阵列
德国最大规模采用薄膜技术的倾斜屋顶光伏
      日前,位于德国杜伊斯堡附近莫尔斯市最大规模的倾斜屋顶光伏系统自10.16日起正式投入使用。此系统由美国制造商First Solar提供的11000多个碲化镉模块组成,发电总量可达837千瓦。       此次太阳能发电系统是由Riedel Recycling公司建造完成,原先面积为9500平方米、朝南向的屋顶现已完全由太阳能模块组成,新装置的倾斜角度为36.55和75、高度为30米,耗时仅为3个月,整个工程进度比预先计划的快得多。       公司管理总监Ludger Riedel表示,%26ldquo;薄膜模块是我们的最佳选择。尽管阳光辐射较弱,但是总体收益良好。%26rdquo;至于在逆变器的选择上,Riedel表
[新能源]
Vishay发布工作温度超155℃车用薄膜片式电阻
2013 年 10 月18 日 — 日前,Vishay Intertechnology, Inc.(NYSE 股市代号:VSH)宣布,推出在满功率情况下工作温度达+155℃,在+250℃下线性降额至0W功率的新款精密车用薄膜片式电阻--- PATT。该电阻通过AEC-Q200认证,工作温度范围比传统薄膜片式电阻扩大了近100℃,绝对TCR低至±25ppm/℃,经过激光微调后的容差只有±0.1%。 今天发布的Vishay Dale电阻在155℃和满载额定功率下经过1000小时后的负载寿命稳定率小于0.2%,适用于需要对高温环境中低偏置和温度漂移进行补偿的低噪声、单信号处理,包括发动机舱的汽车应用、高精度石油和天然气勘探,以及
[汽车电子]
MSP430f149端口功能及设置
MSP430f149常用的端口有P1、P2、P3、P4、P5、P6,它们都可以直接用于输入/输出。MSP430系统中没有专门的输入/输出指令,输入/输出操作通过传送指令来实现。端口P1~P6的每一位都可以独立用于输入/输出,即具有位寻址功能。常见的键盘接口可以直接用端口进行模拟,用查询或者中断方式控制。由于MSP430的端口只有数据口,没有状态口或控制口,在实际应用中,如在查询式输入/输出传送时,可以用端口的某一位或者几位来传送状态信息,通过查询对应位的状态来确定外设是否处于“准备好”状态。 端口的功能: (1)P1,P2端口: I/O,中断功能,其他片内外设功能如定时器、比较器; (2)P3,P4P5P6端口:I/O,其他
[单片机]
Ascent Solar柔性薄膜太阳能面板入选时代杂志最佳发明
柔性薄膜太阳能面板制造商AscentSolar宣布,其生产的柔性铜铟镓硒太阳能面板入选时代杂志(TIME)2011年度50大最佳发明。Ascent的技术是今年入选的6项绿色发明其中的一项。 过去10年时代杂志每年都会在科学、技术和艺术领域宣布50大最佳发明。此前获此殊荣的还有iPad、尼桑Leaf汽车、3-D摄像机和世界上第一个合成细胞。 AscentSolarPresident总裁兼首席执行官RonEller表示:“时代杂志将我们的产品列为本年度50大最佳发明我们感到非常自豪。” 针对AscentSolar的薄膜技术时代杂志给出了这样的评语:“除非是在室内,否则太阳能到处都有。但太阳能又是散射的,这意味着你需要很多太阳能面板才
[新能源]
基于MSP430F149单片机为核心的展馆人员登记与录入系统设计
文章主要阐述了一种运用视频图像分析技术进行人员登记与录入系统的设计。通过红外线采集人们入馆和出馆的信号并将其送入单片机MSP430F149中,单片机对信号进行处理统计入馆、出馆人数并在LCD12864液晶显示屏上显示出来,同时对进出馆的人进行拍照并存储。通过人员登记与录入系统可以及时得到馆内准确的人数和照片,有利于博物馆更高效的组织工作,它可与第三方软件系统进行集成,为科学决策提供数据支持。 人数统计系统在不同的应用场合可以发挥不同的作用。它可以为商场或零售点获取商场内部按不同时段分布的人数统计、人群流动方向等信息,有利于评估商品对于顾客的吸引力,以及评估商场选址是否适当;对于大型建筑,管理者可利用人数统计系统了解人群的行
[单片机]
基于<font color='red'>MSP430F149</font>单片机为核心的展馆人员登记与录入系统设计
LED散热基板之厚膜与薄膜工艺差异分析
1、简介    LED 模组现今大量使用在电子相关产品上,随着应用范围扩大以及照明系统的不断提升,约从1990年开始高 功率 化的要求急速上升,尤其是以白光高功率型式的需求最大,现在的照明系统上所使用之LED功率已经不只1W、3W、5W甚至到达10W以上,所以散热基板的散热效能俨然成为最重要的议题。影响 LED散热 的主要因素包含了 LED芯片 、芯片载板、芯片封装及模组的材质与设计,而LED及其封装的材料所累积的热能多半都是以传导方式散出,所以LED芯片、基板及LED芯片封装的设计及材质就成为了主要的关键。    2、散热基板对于LED模组的影响   LED从1970年以后开始出现红光的LED,之后
[电源管理]
LED散热基板之厚膜与<font color='red'>薄膜</font>工艺差异分析
基于电容检测芯片的电容检测系统设计
  引言   电容式传感器一般是将被测量的变化量转换为电容量的变化。目前,基于这种原理的各种类型的传感器已在测量加速度、液位、几何孔径等方面得到了广泛的应用。但以电容为变化量的传感器(尤其是MEMS传感器),其电容变化范同往往只有几个pF,甚至几个fF。这便对电容检测的精度提出了很高的要求,尤其是在传感器的研发过程中,往往需要极高精度的电容检测设备对传感器进行测试与调校。但是一直以来国内外都缺乏能够对微小电容进行实时检测的专用仪器,普遍的做法是针对所研发的传感器自行设计、制做专门的电容检测电路,这无疑增加了传感器设计的难度与工作量。针对这一问题,我们设计了通用的电容式传感器检测系统。该系统能够对微小电容进行实时检测,并可以通过上
[单片机]
基于电容检测芯片的电容检测系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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