msp430g2553的矩阵按键程序

合集下载

msp430Led按键控制灯亮程序

msp430Led按键控制灯亮程序

1.Led灯控制程序#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD; //关闭看门狗//P1DIR = 0x41;//P1OUT = 0x41; //程序点亮led1//P1DIR |=BIT0+BIT6;//P1OUT |=BIT0+BIT6; //程序点亮led2P1DIR |=BIT0;P1OUT |=BIT0;P1DIR |=BIT6;P1OUT &=~BIT6;while(1){P1OUT ^=BIT0;P1OUT ^=BIT6;__delay_cycles(1000000);} //led交替亮,持续1s2.Led按键控制灯亮#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;//关闭看门狗P1DIR &=~BIT3;P1DIR |=BIT0;P1IES |=BIT3;P1IE |=BIT3;_EINT();_BIS_SR(LPM0_bits+GIE);}#pragma vector=PORT1_VECTOR__interrupt void PORT1_ISR(void){int i;char pushkey;pushkey=P1IFG&BIT3;//第三位中断标志位for(i=0;i<1000;i++)//短暂延时软件去抖if((P1IN&pushkey)==pushkey){P1IFG=0;//中断标志清零return;}if(P1IFG&BIT3)//判断按键是否按下{P1OUT^=BIT0;}P1IFG=0;return;}3.矩阵键盘和数码管程序#include <msp430g2553.h>#include"Key&Display.h"//unsigned char Receive(void);void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;Init_4lines_Mode();//初始化4线工作模式Send_Command(CH452_RESET);//CH452芯片内部复位Send_Command(KeyDisplay_ON);//允许显示驱动并启动键盘扫描//开中断,P2.0接CH452的DOUT引脚,当有键按下时,DOUT上产生由高到低的脉冲// P2SEL &= ~(BIT6+BIT7);P2IE|=BIT0;P2IES|=BIT0;P2IFG&=~BIT0;_EINT();while(1){}}//中断处理函数#pragma vector = PORT2_VECTOR//中断处理程序,接收到DOUT脉冲信号时,运行之__interrupt void Port2(void){unsigned char Keyvalue;Send_Command(CH452_GET_KEY);//单片机向CH452发送读取按键代码命令Keyvalue=Key_Read();// Keyvalue=Receive();switch(Keyvalue){case 0x40://按键K0按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis00);//第0位数码管显示0break;}case 0x41://按键K1按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis01);//第0位数码管显示1break;}case 0x42://按键K2按下{Send_Command( NDis1); //第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis02);//第0位数码管显示2break;}case 0x43://按键K3按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis03);//第0位数码管显示3break;}case 0x48://按键K4按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis04);//第0位数码管显示4break;}case 0x49://按键K5按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis05);//第0位数码管显示5break;}case 0x4A://按键K6按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis06);//第0位数码管显示6break;}case 0x4B://按键K7按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis07);//第0位数码管显示7break;}case 0x50://按键K8按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis08);//第0位数码管显示8break;}case 0x51://按键K9按下{Send_Command( NDis1);//第1位数码管不显示//Send_Command(Dis10);Send_Command(Dis09);//第0位数码管显示9break;}case 0x52://按键K10按下{Send_Command(Dis00);//第0个数码管显示字符"0"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x53://按键K11按下{Send_Command(Dis01);//第0个数码管显示字符"1"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x58://按键K12按下{Send_Command(Dis02);//第0个数码管显示字符"2"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x59://按键K13按下{Send_Command(Dis03);//第0个数码管显示字符"3"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5A://按键K14按下{Send_Command(Dis04);//第0个数码管显示字符"4"Send_Command(Dis11);//第1个数码管显示字符"1"break;}case 0x5B://按键K15按下{Send_Command(Dis05);//第0个数码管显示字符"5"Send_Command(Dis11);//第1个数码管显示字符"1"break;}default:break;}P2IFG&=~BIT0;}4.红灯0.2秒闪一次,绿灯0.8秒闪一次#include <msp430g2553.h>void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDT BCSCTL1 &=~XTS; //配置时钟BCSCTL3 |=LFXT1S_2;IFG1 &=OFIFG;P1DIR |=BIT0+BIT6; // P1.0,P1.6 output P1OUT &=~BIT0; // P1.0,P1.6置0 P1OUT &=~BIT6;TACCR0 = 12000-1; //1秒定时,产生中断TACCR1 = 2400; //频率0.2*12000,定时0.2秒TACCR2 = 9600; //定时0.8秒TACTL = TASSEL_1 + MC_1+TAIE; // ACLK, 增计数模式TACCTL1 |=CCIE; // TACCR1中断使能TACCTL2 |=CCIE; // TACCR1中断使能_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer_A3 Interrupt Vector (TA0IV) handler#pragma vector=TIMER0_A1_VECTOR__interrupt void Timer_A(void){switch( TA0IV ){case 2: P1OUT ^= BIT0; // 捕获/比较寄存器TACCR1break;case 4: P1OUT ^= BIT6;break; // 捕获/比较寄存器TACCR2case 10: break; // 未使用,计数达到TACCRO时执行中断,即1秒执行一次}}5.PMW波控制led灯亮度#include "msp430g2553.h"void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P1DIR |=BIT6; //方向寄存器P1SEL |=BIT6; //功能寄存器TACTL=TASSEL_2+MC_1+ID_0; //定时器A控制寄存器选择增计数模式TACCTL1 |=OUTMOD_3; //捕获/比较控制寄存器TACCR0=1000-1;TACCR1=10;_BIS_SR(CPUOFF);}。

矩阵键盘显设计报告要点

矩阵键盘显设计报告要点

摘要在日常生活中,我们经常要用到键盘来实现对电子装置的控制。

小到手表手机,中到电视电脑,大到各种复杂仪器,都需要通过各种按键来实现各种操作。

本次课程设计以按键控制显示为主题,以MSP430G2553单片机及其接口芯片为核心构造一个键盘控制显示系统。

单片机最大的特点是能单独实现电路控制所要求的智能化控制功能。

单片机控制系统能够取代以前利用复杂电子线路和数字电路构成的控制系统,可以通过软件来实现。

数码管4*4矩阵键盘按键号是按下任意键时,数码管都会显示其按键序号,通过MSP430G2553单片机的程序处理,扫描程序首先判断按键发生在哪一列,然后根据所在的行附加不同的值,从而得到按键的序号。

关键词:单片机MSP430G2553 数码管键盘显示AbstractIn daily life, we often want to use the keyboard to realize the control of electronic devices. Small to watch phone, to TV in computer, big to all kinds of complex instruments, all need through all kinds of pressing buttons all kinds of operation. This course design buttons to control and display as the theme, MSP430G2553 single-chip microcomputer and its interface chip as the core structure a keyboard control and display system. The biggest characteristics is a single chip microcomputer control realization circuit can alone for the intelligent control function. Single-chip microcomputer control system can be replaced by complex before electronic circuits and digital circuit consists of the control system, by software to realize. Digital tube 4 * 4 matrix keyboard key number is press any key, digital tube will show the buttons, serial Numbers, through the MSP430G2553 microcontroller procedures, scanning program first judge where a list of key happen, then according to the line where additional different values, which get buttons serial number. Keywords: SCM MSP430G2553 digital tube keyboard display目录1 系统方案分析 (3)1.1键盘的选用 (3)1.2单片机的选用 (4)1.3显示器的选用 (4)1.4辅助功能的论证与选用 (4)2系统理论分析与计算 (5)2.1单片机主机系统电路分析 (5)2.2复位电路分析 (6)2.3矩阵式键盘电路分析 (6)2.4译码显示电路分析 (6)3.电路与程序设计 (7)3.1电路的设计 (7)3.2程序设计 (8)4 测试方案与测试结果 (9)4.1测试方案 (9)4.2 测试的结果和分析 (9)4.3 实验总结 (9)5 参考文献 (10)附录一 (10)附录二 (11)附录三 (16)1 系统方案分析本实验是基于msp430g2553的矩阵键盘显示,以msp430g2开发板为中枢系统,4*4矩阵键盘输入,LED共阴极数码管为显示输出。

msp430 按键控制LED 最基本程序

msp430 按键控制LED 最基本程序

按键篇经过一短时间的学习,下面,亲自动手编写一下程序吧。

程序的目的是:按下按键,控制LED的亮和灭。

短按键,则小灯亮1秒,然后灭;长按键,小灯常亮。

首先,完成键盘的扫描程序。

第一点:如果是扫描,就要用到定时器。

我想设计定时器每隔10ms扫描一次按键。

定时器,我选用定时器A。

它的定时中断函数如下:函数名称:TimerA_ISR功能:定时器A的中断服务函数参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void TimerA_ISR(void){GetKey();}上面这个定时中断函数的意思就是:每当定时时间到了以后,就调用GetKey()函数一次。

GetKey()函数就是扫描键盘按键的函数了。

在GetKey()函数中,会根据按键类型(长按/短按)返回不同的数值。

根据返回的数值,做小灯亮法的操作。

那么,返回的这个值,我们需要保存在一个变量中,在这里定义一个变量ucharFlagLcd ;来保存返回值。

这个变量在全局变量中定义,以保证它的作用域。

那么定时函数就变为#pragma vector = TIMERA0_VECTOR__interrupt void TimerA_ISR(void){FlagLcd =GetKey();}定时器中断的时间间隔,我在主函数中定义。

这样写:CCTL0 = CCIE; //使能CCR0中断CCR0 = 40; //设定周期0.01STACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式这样,定时器这块就算完工了。

那么,下面进行按键扫描程序。

按键的定义是这样的,根据我板子的按键原理图如下这是一个矩阵键盘。

其中KEY就是外部高电平3.3V。

我只想用其中的P1.0作为这次试验的按键。

MSP430按键程序范例(附原理图)

MSP430按键程序范例(附原理图)

MSP430按键程序范例(附原理图)#i ncludevoid Init_Port(void){//将P1口所有的管脚在初始化的时候设置为输入方式 P1DIR = 0; //将P1口所有的管脚设置为一般I/O口P1SEL = 0;// 将P1.4 P1.5 P1.6 P1.7设置为输出方向P1DIR |= BIT4;P1DIR |= BIT5;P1DIR |= BIT6;P1DIR |= BIT7;//先输出低电平P1OUT = 0x00;// 将中断寄存器清零P1IE = 0;P1IES = 0;P1IFG = 0;//打开管脚的中断功能//对应的管脚由高到低电平跳变使相应的标志置位P1IE |= BIT0;P1IES |= BIT0;P1IE |= BIT1;P1IES |= BIT1;P1IE |= BIT2;P1IES |= BIT2;P1IE |= BIT3;P1IES |= BIT3;_EINT();//打开中断return;}void Delay(void){int i;for(i = 100;i--;i > 0) ;//延时一点时间}int KeyProcess(void){int nP10,nP11,nP12,nP13;int nRes = 0;//P1.4输出低电平P1OUT &= ~(BIT4);nP10 = P1IN & BIT0;if (nP10 == 0) nRes = 13; nP11 = P1IN & BIT1; if (nP11 == 0) nRes = 14; nP12 = P1IN & BIT2; if (nP12 == 0) nRes = 15; nP13 = P1IN & BIT3; if (nP13 == 0) nRes = 16; //P1.5输出低电平P1OUT &= ~(BIT4);nP10 = P1IN & BIT0;if (nP10 == 0) nRes = 9; nP11 = P1IN & BIT1; if (nP11 == 0) nRes = 10; nP12 = P1IN & BIT2; if (nP12 == 0) nRes = 11; nP13 = P1IN & BIT3; if (nP13 == 0) nRes = 12; //P1.6输出低电平P1OUT &= ~(BIT4);nP10 = P1IN & BIT0;if (nP10 == 0) nRes = 5; nP11 = P1IN & BIT1; if (nP11 == 0) nRes = 6; nP12 = P1IN & BIT2; if (nP12 == 0) nRes = 7; nP13 = P1IN & BIT3; if (nP13 == 0) nRes = 8; //P1.7输出低电平P1OUT &= ~(BIT4);nP10 = P1IN & BIT0;if (nP10 == 0) nRes = 1; nP11 = P1IN & BIT1;if (nP11 == 0) nRes = 2; nP12 = P1IN & BIT2;if (nP12 == 0) nRes = 3; nP13 = P1IN & BIT3;if (nP13 == 0) nRes = 4; P1OUT = 0x00;//恢复以前值。

MSP430单片机 矩阵键盘与数码管实验(附原理图)

MSP430单片机 矩阵键盘与数码管实验(附原理图)

MSP430单片机矩阵键盘与数码管实验(附原理图)/************************************************************* *MSP430单片机矩阵键盘与数码管实验*功能:用共阳极数码管显示按键的键值*适用:MSP430各系列单片机*by:duyunfu1987*************************************************************/ #include "msp430x44x.h"#define ROW P2OUT //矩阵键盘的行宏定义#define COL P2IN //矩阵键盘的列宏定义#define DPYOUT P3OUT //数码管输出口宏定义unsigned char keyval; //键值//共“阳”极数码管的码表unsigned char LED7CA[] ={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D, ~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71,0xff};/********************************************************函数名称:keyscan()*功能:扫描4*3矩阵键盘,并返回键值*出口参数:若有按键则返回键值,若无按键返回15*4*3矩阵键盘:0 1 2 3* 4 5 6 7* 8 9 A b*******************************************************/ unsigned char keyscan(){int i=0;unsigned char key=0;ROW = 0x8f; //先置三行输出低电平if((COL & 0x0f)!= 0x0f) //是否有按键{do i++;while(i<3000); //消抖动延时ROW = 0xbf; //扫描第一行if((COL & 0x0f)== 0x0f){ ROW = 0xdf; //扫描第二行if((COL & 0x0f)== 0x0f){ ROW = 0xef; //扫描第三行if((COL & 0x0f)== 0x0f)key = 15;else key = ~((ROW & 0XF0)|(COL & 0X0F));}else key = ~((ROW & 0XF0)|(COL & 0X0F));}else key = ~((ROW & 0XF0)|(COL & 0X0F));if(key != 15)switch(key) //获取有效地键值{ case 0x48: key=0; break;case 0x44: key=1; break;case 0x42: key=2; break;case 0x41: key=3; break;case 0x28: key=4; break;case 0x24: key=5; break;case 0x22: key=6; break;case 0x21: key=7; break;case 0x18: key=8; break;case 0x14: key=9; break;case 0x12: key=10;break;case 0x11: key=11;break;default: key=15;}}else key = 15;keyval=key;return key;}void main( void ){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;P3DIR |= 0xff;P3OUT = 0xff; //共阳极数码管输出口初始化P2DIR |= BIT4 +BIT5+BIT6; //先配置矩阵键盘的行(输出)//P2.6 第一行,P2.5 第二行,P2.4 第三行//P2.3 第一列,P2.2 第二列,P2.1 第三列,P2.0 第四列keyval=16;while(1){ keyscan();if(keyval != 15 && keyval<17)DPYOUT = LED7CA[keyval];//数码管显示键值}}。

单片机msp430g2553中文教程

单片机msp430g2553中文教程

24 TSSOP 封
LF,

-
1
DCO,
VLO
20 引脚
16 TSSOP 封

16
20 引脚 PDIP 封装
24
32 引脚 QFN 封装
28 引脚
24 TSSOP 封
LF,

-
1
DCO,
VLO
20 引脚
16 TSSOPyright © 2011–2012, Texas Instruments Incorporated
• 通用串行通信接口 (USCI) – 支持自动波特率检测的增强型通用异步收发器 (UART) – IrDA 编码器和解码器 – 同步 SPI – I2C™
• 用于模拟信号比较功能或者斜率模数 (A/D) 转换的 片载比较器
• 带内部基准、采样与保持以及自动扫描功能的 10 位 200-ksps 模数 (A/D) 转换器(见 表 1)
3
MSP430G2x53 MSP430G2x13
ZHCS178E – APRIL 2011 – REVISED JANUARY 2012

器件引出脚配置、MSP430G2x13 和 MSP430G2x53、20 引脚器件、 TSSOP 和 PDIP 封装
DVCC 1 P1.0/TA0CLK/ACLK/A0/CA0 2 P1.1/TA0.0/UCA0RXD/UCA0SOMI/A1/CA1 3 P1.2/TA0.1/UCA0TXD/PUCA0SIMO/A2/CA2 4 P1.3/ADC10CLK/CAOUT/VREF-/VEREF-/A3/CA3 5 P1.4/SMCLK/UCB0STE/UCA0CLK/VREF+/VEREF+/A4/CA4/TCK 6 P1.5/TA0.0/UCB0CLK/UCA0STE/A5/CA5/TMS 7

OPT3001 MSP430G2553完整程序

OPT3001 MSP430G2553完整程序
if(ManufacturerIDNum==0x5449&&DeviceIDNum==0x3001) //如果读出来的ID都正确表示初始化成功
{
return 0;
}
else//否则初始化不成功
{
return 1;
}
}
//OPT3001寄存器配置
//12-15位RN[0,3]:0x1100,设置为Full-Scale Mode
OPT3001IIC_Init();//OPT3001端口初始化
OPT3001Config(); //配置OPT3001并且唤醒OPT3001
delay();
ManufacturerIDNum=GetOPT3001ManufacturerID();
delay();
DeviceIDNum=GetOPT3001DeviceID();
write1();
stop();//停止信号
}
//*********************************************************
//读出BMP085内部数据,连续两个
//*********************************************************
}
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
}
void Opt3001WriteRegister(unsigned char registerName, unsigned int value)
{
start(); //起始信号
write1byte(0x88); //发送设备地址+写信号

我们所用的MSP430G2553...

我们所用的MSP430G2553...

电设工作小结之——MSP430G2553学习笔记——1一,MSP430G2553单片机的各个功能模块(一),IO口模块,1,我们所用的MSP430G2553有两组IO口,P1和P2。

2,IO口的寄存器有:方向选择寄存器PxDIR,输出寄存器PxOUT,输入寄存器PxIN,IO口内部上拉或下拉电阻使能寄存器PxREN,IO口功能选择寄存器PxSEL和PxSEL2,IO口中断使能寄存器PxIE,中断沿选择寄存器PxIES,IO口中断标志寄存器PxIFG。

3,所有的IO都带有中断,其中所有的P1口公用一个中断向量,所有的P2口公用一个中断向量。

所以在使用中断时,当进入中断后,还要判断到底是哪一个IO口产生的中断,判断方法可以是判断各个IO口的电平。

4,中断标志PxIFG需要软件清除,也可以用软件置位,从而用软件触发一个中断。

注意:在设置PxIESx时根据PxINx有可能会引起相应的PxIFGx置位(具体的情况见用户指南),所以在初始化完IO口中断以后,正式使用IO中断前要先将对应的PxIFGx清零。

程序如下:void IO_interrupt_init() //IO中断初始化函数{P1REN |= BIT4+BIT5+BIT6+BIT7; // pull up 内部上拉电阻使能//使用中断时,使能内部的上拉电阻这样当该脚悬空是,电平不会跳变,防止悬空时电平跳变不停的触发中断P1OUT = BIT4+BIT5+BIT6+BIT7; // 当引脚上的上拉或下拉电阻使能时,PxOUT选择是上拉还是下来//0:下拉,1:上拉P1IE |= BIT4+BIT5+BIT6+BIT7; // interrupt enabled P13中断使能P1IES |= BIT4+BIT5+BIT6+BIT7; // Hi/lo edge 下降沿中断//P1IES &= ~BIT3; //上升沿触发中断P1IFG &= ~(BIT4+BIT5+BIT6+BIT7); //中断标志位清零}5,PxOUT:如果引脚选择了内部的上拉或下拉电阻使能,则PxOUT设定电阻是上拉还是下拉,0:下拉,1:上拉6,当IO口不用时,最好不要设为输入,且为浮动状态(这是IO口的默认状态),因为当输入为浮动时,输入电压有可能会在VIL和VIH之间,这样会产生击穿电流。

MSP430G2553定时器捕获之红外遥控器编码破解

MSP430G2553定时器捕获之红外遥控器编码破解

MSP430G2553应用之红外遥控器按键编码的破解(ls_core)之前笔者利用51单片机、FPGA 和S3C2440对红外遥控器的编码破解过。

由于最近手里使用的单片机为MSP430G2553,同时也为了扩展LaunchPad 开发板按键所需,笔者还是将之前弄使用过的红外遥控器拿了起来。

使用遥控器作为开发板的按键使有个好处就是,占用一个IO 口即可扩展出很多按键。

但是,这样做的不足就是,占用了一个定时器和相应中断的资源。

所以,建议大家应该依据具体的项目工程而确定具体的解决方案。

好了进入正题。

一 红外时序在这里笔者探讨的问题是破解红外遥控器的编码,而不是对其编码。

所以,我们直接谈谈红外接收头1838T 接收到红外遥控器发送出的按键编码时序。

笔者在普源(RIGOL)示波器上观察到的时序波形如图1红外遥控器按键编码时序所示:图1 红外遥控器按键编码时序面对这样一列串行的序列,笔者将其测量、记录、整理并为其制作了一张时序图以便讲解,绘制的时序图如下图2 红外编码时序图 所示:ls _c o r e Q Q 1021480125 837278968图2 红外编码时序图接下来,让我们一起详细地探讨一下这一列时序波形。

首先当我们手中的遥控器的按键被按下时,其红外发射头会发射出红外线(该红外线载有数据信息,即对应的按键编码),然后红外接收头1838T 会接收该红外线对其解码还原载波信息。

所还原的信息即为按键编码的串行时序信息,如上图2所示。

那笔者所讲的破解编码是指的什么呢?很显然,笔者所讲的破解就是要把图2所示的串行数据转化成方便微机或者是人记忆识别的并行数据。

好,接着让我们一起分析一下这个时序。

⑴ 空闲状态:当红外接收头1838T 没有数据时(无按键按下,或是数据转化完成),红外接收头的输出引脚会一直保持高电平,即上图2所指的空闲状态。

⑵ 引导码:当红外接收头1838T 接收到了数据,其输出引脚首先会由空闲的高电平状态跳转为低电平状态,该低电平状态会保持9ms ,那么着9ms 的高电平状态即称之为引导码。

一些MSP430G2553简单程序讲解

一些MSP430G2553简单程序讲解

MSP430基础时钟模块包含以下3个时钟输入源。

一、4个时钟振荡源1、LFXT1CLK: 外部晶振或时钟1 低频时钟源低频模式:32768Hz 高频模式:(400KHz-16MHz)2、XT2CLK: 外部晶振或时钟2 高频时钟源(400KHz-16MHz)3、DCOCLK: 内部数字RC振荡器,复位值1.1MHz4、VLOCLK: 内部低功耗振荡器12KHz注:MSP430x20xx: LFXT1 不支持HF 模式, XT2 不支持, ROSC 不支持.(1)LFXT1CLK低频时钟源:由LFXT1振荡器产生(如图2所示)。

通过软件将状态寄存器中OSCOff 复位后,LFXT1开始工作,即系统采用低频工作。

如果LFXT1CLK没有用作SMCLK或MCLK信号,则可以用软件将OSCOff置位,禁止LFXT1工作。

(2)XT2CLK高频时钟源:由XT2振荡器产生。

它产生时钟信号XT2CLK,其工作特性与LFXT1振荡器工作在高频模式时类似。

可简单地通过软件设置XT2振荡器是否工作,当XT2CLK没有用作SMCLK或MCLK信号时,关闭XT2,选择其他时钟源。

3)DCOCLK数字控制RC振荡器。

由集成在时钟模块中的DCO振荡器产生。

DCO振荡器是一个RC 振荡器,频率可以通过软件调节,其控制逻辑如图3所示。

当振荡器LFXT1、XT2被禁止或失效时,DCO振荡器被自动选作MCLK的时钟源。

因此由振荡器失效引起的系统中断请求可以得到响应,甚至在CPU关闭的情况下也能得到处理。

由基础时钟模块可以提供系统所需的3种时钟信号,即:ACLK、MCLK、SMCLK。

其中辅助时钟ACLK是LFXT1CLK信号经1、2、4、8分频后得到的。

ACLK可由软件选作各个外围模块的时钟信号,一般用于低速外设;系统主时钟MCLK可由软件选择来自LFXT1CLK、XT2CLK、DCOCLK三者之一,然后经1、2、4、8分频得到。

我的矩阵键盘使用笔记——基于msp430g2553

我的矩阵键盘使用笔记——基于msp430g2553

我的矩阵键盘使用笔记——基于msp430g2553 Createdon:2012-9-6Author:zhangbin
学习笔记
formsp430g2553
redesignedbyzhangbin
2012-09-06
versions:12_09_01
AllRightsReserved
这里主要记录我的使用矩阵键盘输入数据的方法。

在系统的设计中,输入数据是经常遇到的,而矩阵键盘是最常用的输入设备。

如果矩阵键盘的扫描没有了问题,那么怎样用矩阵键盘输入数据呢,例如我要输入253.45这个数,该怎么实现呢。

下面是我用的两个实现方法:
一、是借用一个诡异的值,也就是键盘扫描时不可能扫到的值,这个数与键盘完全无关,主要是用来标志有新的按键按下。

我使用的是msp430g2553的中断检测按键的,原理是任意一个按键按下时,就会进入中断函数,然后在中断中再进行判断按下的是哪一个键。

能够实现这种方法的基础是msp430g2553的一个IO口组(比如P1,P2)的8个IO口都共用一个中断向量,一组中,无论哪一个IO口触发了中断,都会进入同一个中断中。

所以这样就可以用中断。

MSP430G2553_

MSP430G2553_

ZeroMemory(&wrOverlapped,sizeof(wrOverlapped)); if (wrOverlapped.hEvent != NULL) { ResetEvent(wrOverlapped.hEvent); wrOverlapped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL); } PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); txIndex=0; rxIndex=0; } virtual ~ComPort(void) { if(bComOpened) CloseHandle(hCom); } unsigned char rxIndex; unsigned char lpInBuffer[1024]; int Sync(void){ int i=1000; while(rxIndex!=txIndex && txIndex!=0 && (--i)){ int size=Read(); for(int i=0;i<size;i++) if(((lpInBuffer[i]&0x80)==0) && (lpInBuffer[i]!=0)) rxIndex=lpInBuffer[i]; } if(i<1) return -1; return rxIndex; } int Read(void){ DWORD dwBytesRead=1024; COMSTAT ComStat; DWORD dwErrorFlags; OVERLAPPED m_osRead; memset(&m_osRead,0,sizeof(OVERLAPPED)); m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); ClearCommError(hCom,&dwErrorFlags,&ComStat); dwBytesRead=min(dwBytesRead,(DWORD)ComStat.cbInQue); //clear port buffer

基于MSP430G2553的按键测试程序

基于MSP430G2553的按键测试程序

基于msp430G2系列的按键测试程序本程序有扫描和中断两种方式,代码均附后。

4、4×1独立按键实验(1)4×1键盘1:扫描数码管显示(2)4×1键盘2:xx数码管显示(3)4×1键盘3:控制LED(4)4×1键盘4:控制蜂鸣器5、4×4矩阵键盘实验(1)4×4键盘1:行列扫描数码管显示(2)4×4键盘2:行列扫描1602液晶显示3)4×4键盘3:控制LED蜂鸣器#include <msp430g2452.h>#defineBUTTONBIT3#defineLED_REDBIT0#defineLED_GREENBIT6#defineLED_DIRP1DIR#defineBUTTON_DIRP1DIR#defineBUTTON_OUTP1OUT#defineLED_OUTP1OUT#defineBUTTON_RENP1REN#defineBUTTON_ON(P1IN&BIT3)#defineBUTTON_OFF!(P1IN&BIT3)#defineLED_RED_ON()P1OUT|=BIT0#defineLED_RED_OFF()P1OUT&=~BIT0#defineLED_GREEN_ON()P1OUT|=BIT6#defineLED_GREEN_OFF()P1OUT&=~BIT6 volatile unsigned char i=0,flag=0;void main(void){WDTCTL = WDTPW + WDTHOLD; BUTTON_DIR &= ~BUTTON;LED_DIR|= LED_RED+LED_GREEN;BUTTON_REN |= BUTTON;BUTTON_OUT= BUTTON;while(1){/*通过按键改变选择标志位*/if(BUTTON_OFF){flag=!flag;while(BUTTON_OFF);}if(flag){LED_RED_ON();i=10;while(i--)_delay_cycles(500);LED_RED_OFF();LED_GREEN_ON();i=10;while(i--)_delay_cycles(500);LED_GREEN_OFF();}else{LED_OUT |= LED_RED+LED_GREEN;i=10;while(i--)_delay_cycles(500);LED_OUT ^= (LED_RED+LED_GREEN);i=10;while(i--)_delay_cycles(500);}}}/**************该版本编译后的代码与第一个版本是一致的,请看差别在哪儿************/#include <msp430g2452.h>#defineBUTTONBIT3#defineLED_REDBIT0#defineLED_GREENBIT6#defineLED_DIRP1DIR#defineBUTTON_DIRP1DIR#defineBUTTON_OUTP1OUT#defineLED_OUTP1OUT#defineBUTTON_RENP1REN#defineBUTTON_ON(P1IN&BIT3)#defineBUTTON_OFF!(P1IN&BIT3)#defineBIT_SET(x , y)x |= (y)#defineBIT_CLR(x , y)x &=~(y)volatile unsigned char i=0,flag=1;void main(void){WDTCTL = WDTPW + WDTHOLD;BIT_CLR(BUTTON_DIR , BUTTON);BIT_SET(LED_DIR , LED_RED+LED_GREEN);BIT_SET(BUTTON_REN , BUTTON);BIT_SET(BUTTON_OUT , BUTTON);/********************************************************/while(1){/*通过按键改变选择标志位*/if(BUTTON_OFF){flag=!flag;while(BUTTON_OFF);}/*********************************************** ******/if(flag){BIT_SET(LED_OUT , LED_RED);i=10;while(i--)_delay_cycles(500);BIT_CLR(LED_OUT , LED_RED);/*****************************************************/BIT_SET(LED_OUT , LED_GREEN);i=10;while(i--)_delay_cycles(500);BIT_CLR(LED_OUT ,LED_GREEN);}/*****************************************************/ else{BIT_SET(LED_OUT ,LED_RED+LED_GREEN);i=10;while(i--)_delay_cycles(500);/*****************************************************/BIT_CLR(LED_OUT , LED_RED+LED_GREEN);}}}i=10;while(i--)_delay_cycles(500);。

MSP430G2553数据手册

MSP430G2553数据手册

8
512 2x TA3
8
8
256 2x TA3
8
8
256 2x TA3
8
8
256 2x TA3
8
8
512 2x TA3
8
-

USCI A0/B0
时钟
I/O 封装类型
24 32-QFN
28 引脚
24 TSSOP 封
LF,DC

1
O,VL
20 引脚
O
16 TSSOP 封

16
20 引脚 PDIP 封装
LF,DC

1
O,VL
20 引脚
O
16 TSSOP 封

16
20 引脚 PDIP 封装
24 32-QFN
28 引脚
24 TSSOP 封
LF,DC

1
O,VL
20 引脚
O
16 TSSOP 封

16
20 引脚 PDIP 封装
24 32-QFN
28 引脚
24 TSSOP 封
LF,DC

1
O,VL
20 引脚
3
MSP430G2x53 MSP430G2x13
ZHCS178D – APRIL 2011 – REVISED NOVEMBER 2011

器件引出脚配置、MSP430G2x13 和 MSP430G2x53、20 引脚器件、 TSSOP 和 PDIP 封装
DVCC 1 P1.0/TA0CLK/ACLK/A0/CA0 2 P1.1/TA0.0/UCA0RXD/UCA0SOMI/A1/CA1 3 P1.2/TA0.1/UCA0TXD/PUCA0SIMO/A2/CA2 4 P1.3/ADC10CLK/CAOUT/VREF-/VEREF-/A3/CA3 5 P1.4/SMCLK/UCB0STE/UCA0CLK/VREF+/VEREF+/A4/CA4/TCK 6 P1.5/TA0.0/UCB0CLK/UCA0STE/A5/CA5/TMS 7

msp430g2553的矩阵按键程序

msp430g2553的矩阵按键程序

IAR环境下的程序!矩阵按键在单片机设计中经常见到,下面给大家几个程序!如果有需求可以看看!矩阵按键,扫描下面程序是淘来的!#include<msp430g2553.h>/***************全局变量***************/unsigned char Key_Val;//存放键值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.7允许中断P1IE=0xf0;//P1.4~P1.7下降沿触发中断P1IFG=0;//中断标志清0Key_Val = 0;}/*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无********************************************/ //p14\5\6\7接上拉电阻/***************************************key_Val对应键值列:[p14][p15][p16][p17]↓↓↓↓行:[p13]→1234[p12]→5678[p10]→***************************************/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输出全1P1OUT -= tmp1;//P1.0~p1.3输出四位中有一个为0tmp1 >>=1;if((P1IN & 0xf0)<0xf0)//是否P1IN的P1.4~P1.7中有一位为0{tmp2 = 0x10;// tmp2用于检测出哪一位为0for(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值********************************************/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;//获取p1INif((tmp & 0xf0) < 0xf0)//如果有键按下{delay();//消除抖动Check_Key();//调用check_Key(),获取键值}}/***************************************************************** ****控制打开或者关闭键盘中断SW= 0:关闭;ELSE:打开***************************************************************** ****/void CtrlKey(unsigned char sw){if(sw==0)P1IE =0;//关闭端口中断elseP1IE =0xf0; //打开端口中断}/*端口1按键中断*/#pragma vector=PORT1_VECTOR__interrupt void Port(void){if((P1IFG&0xf0)!=0){Key_Event();if(Key_Val!=0)//键值!=0有键按下{CtrlKey(0);//关键盘中断}}P1IFG=0;P1OUT=0;//清中断标志}下面的程序是自己改了下,端口发生了变化!按键矩阵也发生了变化!/***************************************************************** ********************************************************************* *********************/#include<msp430g2553.h>/***************全局变量***************/unsigned char Key_Val;//存放键值void main(){WDTCTL=WDTPW+WDTHOLD;Init_Keypad();_BIS_SR(LPM3_bits + GIE); //最低功耗睡眠while(1);}/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/ void Init_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;//中断标志清0Key_Val = 0;}/*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无********************************************/ //p13\14\15接上拉电阻/***************************************key_Val对应键值列:[p13][p14][p15]↓↓↓行:[p17]→123[p16]→456***************************************/void Check_Key(void){unsigned char row ,col,tmp1,tmp2;unsigned char keymap[] = {1,2,3,4,5,6};//设置键盘逻辑键值tmp1 = 0x08;//从(xx1xxx相左移)for(row = 0;row < 3;row++)//列扫描{P1OUT = 0x38;//P1.3~P1.5输出全1P1OUT -= tmp1;//P1.3~p1.5输出四位中有一个为0tmp1 <<=1;if((P1IN & 0xC0)<0xC0)//是否P1IN的P1.4~P1.7中有一位为0{tmp2 = 0x80;// tmp2用于检测出哪一位为0for(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值********************************************/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;//获取p1INif((tmp & 0xf0) < 0xf0)//如果有键按下{delay();//消除抖动Check_Key();//调用check_Key(),获取键值}}#pragma vector=PORT1_VECTOR__interrupt void Port(void){delay();if((P1IN&0XC0)<0XC0){Check_Key();switch(Key_Val){case 1:{;自己接相应按键的功能break;}case 2:{;自己接相应按键的功能break;}case 3:{;自己接相应按键的功能break;}case 4:{;自己接相应按键的功能break;}case 5:{;自己接相应按键的功能break;}case 6:{;自己接相应按键的功能break;}default:break;}}P1IFG=0;//清中断标志}下面这个按键用了数组了,存放按键的值,可以应用于密码锁之类的应用!为网上淘来/********************************************************************* ********************************************************************* ******************///此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中//此示例程序没有显示,//键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列//在其他的中断服务程序中通过键值队列中的数据引导程序的流程#include <msp430x14x.h>unsigned char keybuff[10];unsigned char keypoint=0;void delay(int v){while(v!=0)v--;}unsigned char key(void){unsigned char x=0xff;P1DIR=0X0F;P1OUT=0X01;//扫描第一行if((P1IN&0X70)==0X10)x=0;elseif((P1IN&0X70)==0X20)elseif((P1IN&0X70)==0x40)x=2;else{P1OUT=0X2;//扫描第二行if((P1IN&0X70)==0X10)x=3;elseif((P1IN&0X70)==0X20)x=4;elseif((P1IN&0X70)==0x40)x=5;else{P1OUT=0X4;//扫描第三行if((P1IN&0X70)==0X10)x=6;elseif((P1IN&0X70)==0X20)x=7;elseif((P1IN&0X70)==0x40)else{P1OUT=8;//扫描第四行if((P1IN&0X70)==0X10)x=9;elseif((P1IN&0X70)==0X20)x=10;elseif((P1IN&0X70)==0x40)x=11;}}}return(x);}unsigned char keyj(void){unsigned char x;P1DIR=0x0f;P1OUT=0x0f;//键盘硬件:P10--P13为行线,最上面一根为P10x=(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;//清除中断标志}void main(void){WDTCTL = WDTPW + WDTHOLD;/*// Stop WDT */P1DIR=0XF;P1OUT=0XF;P1IES=0X0;P1IE=0X70;//列线上升沿允许P1中断_EINT();/*/ Enable interrupts*/while(1){LPM0;_NOP();}}这个是单个按键是,输入端的P1REN要设为1。

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

IAR环境下的程序!矩阵按键在单片机设计中经常见到,下面给大家几个程序!如果有需求可以看看!矩阵按键,扫描下面程序是淘来的!#include<msp430g2553.h>/***************全局变量***************/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; //中断标志清0Key_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输出全1P1OUT -= tmp1; //P1.0~p1.3输出四位中有一个为0tmp1 >>=1;if((P1IN & 0xf0)<0xf0) //是否P1IN的P1.4~P1.7中有一位为0 {tmp2 = 0x10; // tmp2用于检测出哪一位为0for(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; // 获取p1INif((tmp & 0xf0) < 0xf0) //如果有键按下{delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值}}/*********************************************************************控制打开或者关闭键盘中断SW= 0:关闭;ELSE:打开*********************************************************************/void CtrlKey(unsigned char sw){if(sw==0)P1IE =0; //关闭端口中断elseP1IE =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<msp430g2553.h>/***************全局变量***************/unsigned char Key_V al; //存放键值void main(){WDTCTL=WDTPW+WDTHOLD;Init_Keypad();_BIS_SR(LPM3_bits + GIE); //最低功耗睡眠while(1);}/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/void Init_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; //中断标志清0Key_V al = 0;}/*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无返回值:无********************************************///p13\14\15 接上拉电阻/***************************************key_V al 对应键值列:[p13] [p14] [p15]↓↓↓行:[p17]→ 1 2 3[p16]→ 4 5 6***************************************/void Check_Key(void)unsigned char row ,col,tmp1,tmp2;unsigned char keymap[] = {1,2,3,4,5,6};//设置键盘逻辑键值tmp1 = 0x08; //从(xxxx1xxx相左移)for(row = 0;row < 3;row++) //列扫描{P1OUT = 0x38; //P1.3~P1.5输出全1P1OUT -= tmp1; //P1.3~p1.5输出四位中有一个为0 tmp1 <<=1;if((P1IN & 0xC0)<0xC0) //是否P1IN的P1.4~P1.7中有一位为0 {tmp2 = 0x80; // tmp2用于检测出哪一位为0for(col = 0;col < 2;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; // 获取p1INif((tmp & 0xf0) < 0xf0) //如果有键按下{delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值}}#pragma vector=PORT1_VECTOR__interrupt void Port(void){delay();if((P1IN&0XC0)<0XC0){Check_Key();switch(Key_V al){case 1:{ ;自己接相应按键的功能break;}case 2:{ ;自己接相应按键的功能break;}case 3:{ ;自己接相应按键的功能break;}case 4:{ ;自己接相应按键的功能break;}case 5:{ ;自己接相应按键的功能break;}case 6:{ ;自己接相应按键的功能break;}default:break;}}P1IFG=0; //清中断标志}下面这个按键用了数组了,存放按键的值,可以应用于密码锁之类的应用!为网上淘来/****************************************************************************** ******************************************************************************/ // 此示例程序为中断方式,得到键盘的键值,存放在队列keybuff[10]中// 此示例程序没有显示,// 键盘的按键按下引起P1口的中断服务程序,得到键盘的键值,保存到键值队列// 在其他的中断服务程序中通过键值队列中的数据引导程序的流程#include <msp430x14x.h>unsigned char keybuff[10];unsigned char keypoint=0;void delay(int v){while(v!=0)v--;}unsigned char key(void){unsigned char x=0xff;P1DIR=0X0F;P1OUT=0X01; //扫描第一行if((P1IN&0X70)==0X10)x=0;elseif((P1IN&0X70)==0X20)x=1;elseif((P1IN&0X70)==0x40)x=2;else{P1OUT=0X2; //扫描第二行if((P1IN&0X70)==0X10)x=3;elseif((P1IN&0X70)==0X20)x=4;elseif((P1IN&0X70)==0x40)x=5;else{P1OUT=0X4; //扫描第三行if((P1IN&0X70)==0X10)x=6;elseif((P1IN&0X70)==0X20)x=7;elseif((P1IN&0X70)==0x40)x=8;else{P1OUT=8; //扫描第四行if((P1IN&0X70)==0X10)x=9;elseif((P1IN&0X70)==0X20)x=10;elseif((P1IN&0X70)==0x40)x=11;}}}return(x);}unsigned char keyj(void){unsigned char x;P1DIR=0x0f;P1OUT=0x0f; //键盘硬件:P10--P13为行线,最上面一根为P10x=(P1IN&0X70); // P14--P16为列线,最左边一根为P14,列线下拉return(x); // 无按键,返回0?; 有按键返回非0}interrupt[PORT1_VECTOR] void port1key(void){if(keyj()!=0X00){delay(300) ; //消抖动if(keyj()!=0X0){keybuff[keypoint]=key(); //按键见键值保存到队列keypoint++; //if(keypoint==10)keypoint=0;}}P1OUT=0X0F;P1IFG=0X0; //清除中断标志}void main(void){WDTCTL = WDTPW + WDTHOLD; /* // Stop WDT */P1DIR=0XF;P1OUT=0XF;P1IES=0X0;P1IE=0X70; //列线上升沿允许P1中断_EINT(); /*/ Enable interrupts */while(1){LPM0;_NOP();}}这个是单个按键是,输入端的P1REN要设为1。

相关文档
最新文档