msp430g2553的矩阵按键程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

IAR环境下的程序!

矩阵按键在单片机设计中经常见到,下面给大家几个程序!如果有需求可以看看!矩阵按键,扫描

下面程序是淘来的!

#include

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

unsigned char Key_V al; //存放键值

void CtrlKey(unsigned char sw); //控制键盘开关//sw=0关sw=1开

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

函数名称:Init_Keypad

功能:初始化扫描键盘的IO端口

参数:无

返回值:无

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

void Init_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_V al = 0;

}

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

函数名称:Check_Key

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

参数:无

返回值:无

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

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

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

key_V al 对应键值

列:[p14] [p15] [p16] [p17]

↓↓↓↓

行:

[p13]→ 1 2 3 4

[p12]→ 5 6 7 8

[p11]→9 10 11 12

[p10]→13 14 15 16

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

void Check_Key(void)

{

unsigned char row ,col,tmp1,tmp2;

unsigned char keymap[] = {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_V al = keymap[row*4 + col]; // 获取键值

return; // 退出循环

}

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

}

}

}

}

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

函数名称:delay

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

参数:无

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

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

void delay(void)

{

unsigned int tmp;

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

}

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

函数名称:Key_Event

功能:检测按键,并获取键值

参数:无

返回值:无

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

void Key_Event(void)

{

unsigned char tmp;

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

tmp = P1IN; // 获取p1IN

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

{

delay(); //消除抖动

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

}

}

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

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

SW= 0:关闭;ELSE:打开

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

void CtrlKey(unsigned char sw)

{

if(sw==0)

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

else

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

}

/*端口1按键中断*/

#pragma vector=PORT1_VECTOR

__interrupt void Port(void)

{

if((P1IFG&0xf0)!=0)

{

Key_Event();

if(Key_V al!=0) //键值!=0有键按下

{

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

}

}

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

}

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

按键矩阵也发生了变化!

/****************************************************************************** *****************************************************************************/ #include

相关文档
最新文档