msp430的矩阵键盘程序.docx

上传人:b****5 文档编号:4571695 上传时间:2022-12-06 格式:DOCX 页数:10 大小:19.68KB
下载 相关 举报
msp430的矩阵键盘程序.docx_第1页
第1页 / 共10页
msp430的矩阵键盘程序.docx_第2页
第2页 / 共10页
msp430的矩阵键盘程序.docx_第3页
第3页 / 共10页
msp430的矩阵键盘程序.docx_第4页
第4页 / 共10页
msp430的矩阵键盘程序.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

msp430的矩阵键盘程序.docx

《msp430的矩阵键盘程序.docx》由会员分享,可在线阅读,更多相关《msp430的矩阵键盘程序.docx(10页珍藏版)》请在冰豆网上搜索。

msp430的矩阵键盘程序.docx

msp430的矩阵键盘程序

msp430g2553的矩阵按键程序

IAR环境下的程序!

矩阵按键在单片机设计中经常见到,下面给大家几个程序!

如果有需求可以看看!

矩阵按键,扫描

下面程序是淘来的!

#include

/***************全局变量***************/

unsignedcharKey_Val;      //存放键值

voidCtrlKey(unsignedcharsw);//控制键盘开关//sw=0关sw=1开

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

函数名称:

Init_Keypad

功  能:

初始化扫描键盘的IO端口

参  数:

返回值  :

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

voidInit_Keypad(void)

{    

  P1DIR=0x0f;    //P1.0~P1.3设置为输出状态,P1.4~P1.7输入状态(上拉H)

  P1OUT=0;

  P1IES=0xf0;  //P1.4~P1.7允许中断

  P1IE  =0xf0;  //P1.4~P1.7下降沿触发中断

  P1IFG=0;    //中断标志清0

  Key_Val=0;

}

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

函数名称:

Check_Key

功  能:

扫描键盘的IO端口,获得键值

参  数:

返回值  :

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

//p14\5\6\7接上拉电阻

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

        key_Val对应键值 

      列:

[p14]  [p15]  [p16]  [p17]

        ↓    ↓    ↓    ↓

行:

[p13]→    1    2    3    4  

[p12]→    5    6    7    8   

[p11]→    9    10    11    12  

[p10]→    13    14    15    16  

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

voidCheck_Key(void)

{

  unsignedcharrow,col,tmp1,tmp2;

  unsignedcharkeymap[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};//设置键盘逻辑键值

  

  tmp1=0x08;

  for(row=0;row<4;row++)          //行扫描

  {

  P1OUT=0x0f;                //P1.0~P1.3输出全1

  P1OUT-=tmp1;              //P1.0~p1.3输出四位中有一个为0

  tmp1>>=1;                    

  if((P1IN&0xf0)<0xf0)          //是否P1IN的P1.4~P1.7中有一位为0

  {                

    tmp2=0x10;                //tmp2用于检测出哪一位为0  

    for(col=0;col<4;col++)      //列检测 

    {       

      if((P1IN&tmp2)==0x00)    //是否是该列,等于0为是

      {       

      Key_Val=keymap[row*4+col];  //获取键值

      return;                //退出循环

      }

      tmp2<<=1;                //tmp2右移1位 

    }

  }

  }    

}

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

函数名称:

delay

功  能:

延时约15ms,完成消抖功能

参  数:

返回值  :

t=tmp*5*clk根据使用时钟调整tmp值

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

voiddelay(void)

{

  unsignedinttmp;

    

  for(tmp=12000;tmp>0;tmp--);

}

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

函数名称:

Key_Event

功  能:

检测按键,并获取键值

参  数:

返回值  :

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

voidKey_Event(void)

{    

  unsignedchartmp;

    

  P1OUT=0;            //设置P1OUT全为0,等待按键输入

  tmp=P1IN;          //获取p1IN

  if((tmp&0xf0)<0xf0)    //如果有键按下

  {              

      delay();            //消除抖动

      Check_Key();        //调用check_Key(),获取键值

  }    

}

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

控制打开或者关闭键盘中断

SW=0:

关闭;  ELSE:

打开

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

voidCtrlKey(unsignedcharsw)

{

if(sw==0)

  P1IE=0;    //关闭端口中断

else

        P1IE=0xf0;//打开端口中断

}

/*端口1按键中断*/

#pragmavector=PORT1_VECTOR

__interruptvoidPort(void)

{

  if((P1IFG&0xf0)!

=0)

  {  

  Key_Event();

  if(Key_Val!

=0)      //键值!

=0有键按下

  {

    CtrlKey(0);      //关键盘中断

  }

  }

  

  P1IFG=0

1OUT=0;  //清中断标志

}

下面的程序是自己改了下,端口发生了变化!

按键矩阵也发生了变化!

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

#include

/***************全局变量***************/

unsignedcharKey_Val;      //存放键值

voidmain()

{

  WDTCTL=WDTPW+WDTHOLD;

  Init_Keypad();

  _BIS_SR(LPM3_bits+GIE);//最低功耗睡眠

  while

(1);

}

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

函数名称:

Init_Keypad

功  能:

初始化扫描键盘的IO端口

参  数:

返回值  :

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

voidInit_Keypad(void)

{    

  P1DIR=0x38;//P1.0~P1.3设置为输出状态,P1.4~P1.7输入状态(上拉H)

  P1OUT=0;

   

P1IES=0xC0;  //P1.4~P1.7允许中断

  P1IE  =0xC0;  //P1.4~P1.7下降沿触发中断

  P1IFG=0;    //中断标志清0

  Key_Val=0;

}

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

函数名称:

Check_Key

功  能:

扫描键盘的IO端口,获得键值

参  数:

返回值  :

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

//p13\14\15接上拉电阻

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

        key_Val对应键值 

      列:

[p13]  [p14]  [p15]  

        ↓    ↓    ↓   

行:

[p17]→    1    2    3      

[p16]→    4    5    6      

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

voidCheck_Key(void)

{

  unsignedcharrow,col,tmp1,tmp2;

  unsignedcharkeymap[]={1,2,3,4,5,6};//设置键盘逻辑键值

  

  tmp1=0x08;                //从(xxxx1xxx相左移)

  for(row=0;row<3;row++)          //列扫描

  {

  P1OUT=0x38;                //P1.3~P1.5输出全1

  P1OUT-=tmp1;              //P1.3~p1.5输出四位中有一个为0

  tmp1<<=1;                    

  if((P1IN&0xC0)<0xC0)          //是否P1IN的P1.4~P1.7中有一位为0

  {                

    tmp2=0x80;                //tmp2用于检测出哪一位为0  

    for(col=0;col<2;col++)      //行检测 

    {       

      if((P1IN&tmp2)==0x00)    //是否是该列,等于0为是

      {       

      Key_Val=keymap[row*4+col];  //获取键值

      return;                //退出循环

      }

      tmp2>>=1;                //tmp2右移1位 

    }

  }

  }    

}

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

函数名称:

delay

功  能:

延时约15ms,完成消抖功能

参  数:

返回值  :

t=tmp*5*clk根据使用时钟调整tmp值

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

voiddelay(void)

{

  unsignedinttmp;

    

  for(tmp=12000;tmp>0;tmp--);

}

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

函数名称:

Key_Event

功  能:

检测按键,并获取键值

参  数:

返回值  :

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

voidKey_Event(void)

{    

  unsignedchartmp;

    

  P1OUT=0;            //设置P1OUT全为0,等待按键输入

  tmp=P1IN;          //获取p1IN

  if((tmp&0xf0)<0xf0)    //如果有键按下

  {              

      delay();            //消除抖动

      Check_Key();        //调用check_Key(),获取键值

  }    

}

#pragmavector=PORT1_VECTOR

__interruptvoidPort(void)

{

  delay();

  if((P1IN&0XC0)<0XC0)

  {

   

  Check_Key();

  switch(Key_Val)

  {

  case1:

  {      ;自己接相应按键的功能

    break;

  }

  case2:

    {    ;自己接相应按键的功能

    break;

    }

  case3:

    {    ;自己接相应按键的功能

    break;

    }

  case4:

    {    ;自己接相应按键的功能

    break;

    }

  case5:

    {  ;自己接相应按键的功能

    break;

    }

  case6:

    {  ;自己接相应按键的功能

    break;

    }

  default:

break;

    

  }

  }

  P1IFG=0;  //清中断标志

  }

下面这个按键用了数组了,存放按键的值,可以应用于密码锁之类的应用!

为网上淘来

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

//此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中

//此示例程序没有显示,

//键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列

//在其他的中断服务程序中通过键值队列中的数据引导程序的流程

#include  

unsignedcharkeybuff[10];

unsignedcharkeypoint=0; 

voiddelay(intv)

  {

      while(v!

=0)v--;

  }

unsignedcharkey(void)

  {

  unsignedcharx=0xff;

  P1DIR=0X0F;

  P1OUT=0X01;            //扫描第一行

  if((P1IN&0X70)==0X10)     

    x=0;

    else

      if((P1IN&0X70)==0X20)

        x=1;

          else

            if((P1IN&0X70)==0x40)

              x=2;

    else 

      {

      P1OUT=0X2;        //扫描第二行

      if((P1IN&0X70)==0X10)

        x=3;

        else

          if((P1IN&0X70)==0X20)

            x=4;

              else

              if((P1IN&0X70)==0x40)

                x=5;

        else

        {

        P1OUT=0X4;        //扫描第三行

        if((P1IN&0X70)==0X10)

        x=6;

          else

          if((P1IN&0X70)==0X20)

          x=7;

            else

            if((P1IN&0X70)==0x40)

              x=8;

        else 

        {P1OUT=8;        //扫描第四行

        if((P1IN&0X70)==0X10)

    x=9;

    else

      if((P1IN&0X70)==0X20)

        x=10;

          else

            if((P1IN&0X70)==0x40)

              x=11;

              }

        }    

      }   

  return(x);

  }

  

  

unsignedcharkeyj(void) 

  {unsignedcharx;

  P1DIR=0x0f;

  P1OUT=0x0f;      //键盘硬件:

P10--P13为行线,最上面一根为P10

  x=(P1IN&0X70);    //      P14--P16为列线,最左边一根为P14,列线下拉

  return(x);      //无按键,返回0?

;  有按键返回非0

  }  

    

     

interrupt[PORT1_VECTOR]voidport1key(void)

      {

      if(keyj()!

=0X00)

        {

        delay(300)  ;  //消抖动

          if(keyj()!

=0X0)

            {

              keybuff[keypoint]=key();  //按键见键值保存到队列

              keypoint++;            //

              if(keypoint==10)

                keypoint=0;

            }

        }

      P1OUT=0X0F;

      P1IFG=0X0;      //清除中断标志

      }

  

voidmain(void)

  WDTCTL=WDTPW+WDTHOLD;  /*  //StopWDT*/

  P1DIR=0XF;

  P1OUT=0XF;

  P1IES=0X0;

  P1IE=0X70;  //列线上升沿允许P1中断

  _EINT();              /*/Enableinterrupts            */

  

  while

(1)

  { 

  

    LPM0;             

  _NOP();  

  

  }

}

这个是单个按键是,输入端的P1REN要设为1。

允许上拉电阻!

为网上淘来

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

关于msp430g2553的按键程序,虽然很简单,但是纠结了一个下午,错就错在看视频的时候那个老师的片子没有加上拉电阻但是正常运行,我的却不可以,现在找到问题,希望对和我一样遇着这个问题的人有所帮助;

#include"msp430g2553.h"

#definekeyin(P1IN&0x08)

voiddelay(void);

intmain(void)

{

  //Stopwatchdogtimerto

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 销售营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1