MSP430 单片机矩阵键盘程序

合集下载

MSP430矩阵键盘程序

MSP430矩阵键盘程序

MSP430矩阵键盘程序/************************************************************** **************keyboard for MSP430Designed by CUGer——Mr.Wei程序可用,当系统时钟改变时,注意修改按键消抖延时*************************************************************** *************/ #include#define KEY_DIR P1DIR#define KEY_OUT P1OUT#define KEY_IN P1IN#define KEY_IE P1IE#define KEY_IES P1IES#define KEY_IFG P1IFG/***************全局变量***************/unsigned char Key_Val; //存放键值void CtrlKey(unsigned char sw); //控制键盘开关//sw=0关sw=1开/*******************************************函数名称:Init_Keypad功能:初始化扫描键盘的IO端口参数:无返回值:无********************************************/void Init_Keypad(void){KEY_DIR = 0x0f; //P1.0~P1.3设置为输出状态,P1.4~P1.7输入状态(上拉H)KEY_OUT &=0xf0; //P1.0~P1.3输出为低电平(卫编)KEY_IES =0xf0; //P1.4~P1.7下降沿触发中断KEY_IE =0xf0; //P1.4~P1.7允许中断KEY_IFG= 0; //中断标志清0Key_Val = 16; //按键值初始设为非0~15的值均可}/*******************************************函数名称:Check_Key功能:扫描键盘的IO端口,获得键值参数:无********************************************///p14\5\6\7 接上拉电阻/***************************************key_Val 对应键值列:[p14] [p15] [p16] [p17]↓↓↓↓行:[p13]→0 1 2 3[p12]→ 4 5 6 7[p11]→8 9 10 11[p10]→12 13 14 15***************************************/void Check_Key(void){unsigned char hang ,lie,tmp1,tmp2;unsigned char keymap[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//设置键盘逻辑键值与程序计算键值的映射tmp1 = 0x08;for(hang = 0;hang < 4;hang++) //行扫描{KEY_OUT = 0x0f; //P1.0~P1.3输出全1KEY_OUT -= tmp1; //P1.0~p1.3输出四位中有一个为0tmp1 >>=1;if((KEY_IN & 0xf0)<0xf0) //是否P1IN的P1.4~P1.7中有一位为0{tmp2 = 0x10; // tmp2用于检测出哪一位为0for(lie = 0;lie < 4;lie++) // 列检测{if((KEY_IN & tmp2) == 0x00) // 是否是该列,等于0为是{Key_Val = keymap[hang*4 + lie]; // 获取键值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;KEY_OUT =0; // 设置P1OUT全为0,等待按键输入tmp = KEY_IN; // 获取p1INif((tmp & 0xf0) < 0xf0) //如果有键按下{delay(); //消除抖动Check_Key(); // 调用check_Key(),获取键值switch(Key_Val)//P2.0~P2.3接发光二极管,测试程序用{case 0: P2DIR |=BIT0;P2OUT |=BIT0; delay();P2OUT ^=BIT0;break;case 1: P2DIR |=BIT1;P2OUT |=BIT1; delay();P2OUT ^=BIT1;break;case 2: P2DIR |=BIT2;P2OUT |=BIT2; delay();P2OUT ^=BIT2;break;case 3: P2DIR |=BIT3;P2OUT |=BIT3; delay();P2OUT ^=BIT3;break;case 4: P2DIR |=BIT0;P2OUT |=BIT0; delay();P2OUT ^=BIT0;break;case 5: P2DIR |=BIT1;P2OUT |=BIT1; delay();P2OUT ^=BIT1;break;case 6: P2DIR |=BIT2;P2OUT |=BIT2; delay();P2OUT^=BIT2;break;case 7: P2DIR |=BIT3;P2OUT |=BIT3; delay();P2OUT ^=BIT3;break;case 8: P2DIR |=BIT0;P2OUT |=BIT0; delay();P2OUT ^=BIT0;break;case 9: P2DIR |=BIT1;P2OUT |=BIT1; delay();P2OUT ^=BIT1;break;case 10: P2DIR |=BIT2;P2OUT |=BIT2; delay();P2OUT ^=BIT2;break;case 11: P2DIR |=BIT3;P2OUT |=BIT3; delay();P2OUT ^=BIT3;break;case 12: P2DIR |=BIT0;P2OUT |=BIT0; delay();P2OUT ^=BIT0;break;case 13: P2DIR |=BIT1;P2OUT |=BIT1; delay();P2OUT ^=BIT1;break;case 14: P2DIR |=BIT2;P2OUT |=BIT2; delay();P2OUT ^=BIT2;break;case 15: P2DIR |=BIT3;P2OUT |=BIT3; delay();P2OUT ^=BIT3;break;default :break;}}}/************************************************************** ******* 控制打开或者关闭键盘中断SW= 0:关闭;ELSE:打开*************************************************************** ******/ void CtrlKey(unsigned char sw){if(sw==0)KEY_IE =0; //关闭端口中断elseKEY_IE =0xf0; //打开端口中断}/************************************************************** *******主函数*************************************************************** ******/void main(){WDTCTL=WDTPW+WDTHOLD; //关闭看门狗Init_Keypad(); //键盘初始化delay();CtrlKey(1); //键盘打开while(1)Key_Event(); //不断扫描,获取键值}/*端口1按键中断*/#pragma vector=PORT1_VECTOR__interrupt void Port(void){if((KEY_IFG&0xf0)!=0){Key_Event();if(Key_Val!=16) //键值!=16有键按下{CtrlKey(0); //关键盘中断}}KEY_IFG=0;KEY_OUT=0; //清中断标志}。

MSP430单片机矩阵键盘测试程序

MSP430单片机矩阵键盘测试程序

MSP430单片机矩阵键盘测试程序#include 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; 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); }unsigned char keyj(void) {unsigned char x; P1DIR=0x0f; P1OUT=0x0f; //键盘硬件:P10--P13 为行线,最上面一根为P10 x=(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(); }}tips:感谢大家的阅读,本文由我司收集整编。

MSP430单片机应用中键盘的软件设计

MSP430单片机应用中键盘的软件设计
30
按键设计在行、 列线交叉上, 行列线分别连接到按键开关 的两端。当行线通过上拉电阻接 +5V 时, 被钳位在高电平状 态。 键盘中有无按键按下是由列线送人全扫描字, 行线读人行 线状态来判断的。 其方法是:先给列线的所有 珊 线均置成低 电平, 然后将行线电平状态读人累加器 A 中。如果有键按下, 总会有一根行线电平被拉至电平, 从而使行输人不全为 1。 键 盘中哪一个键按下是由列线逐列置低电平, 检查输人状态。 其 方法是:依次给列线送低电平, 然后检查所有行线状态, 如果 全为 1, 则所按下之键不在此列。而且是在与 0 电平行线相交 点上的那个键。 (2)键盘工作方式的选择 一般在实践应用中,由于应用系统在工作时并不经常需 要按键输人 , 所以为了提高 CPU 的工作效率, 可采用中断扫 描工作方式,即只有在键盘有按键按下时,才发中断请求, CPU 响应中断请求后, 转到中断服务程序, 进行键盘扫描, 识 别键码。 具体应用程序举例:(下面程序经过调试验证正确)下 面介绍通过 MSP430 的 P1 口接的 4*4=16 个按键 ( 编号为
l
P10UTI=BIT7;
if(PI IN&BITI)
e lse
if(Pl IN&B1 T4)
x=7;
void Comm- Sent(unsigned char Byte) { unsigned char i, a[3]二 , '430";
{
for(i=O ;i<3;i++)
{ TXBUFO =aa[i]; while((UTCTLO &0x01)二 =0);
x=2;
e lse
{
int i;
BCSCTLI &=- X'IS ;

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);}。

MSP430 键盘程序

MSP430 键盘程序

/*MSP430F42X系列单片机16位ADC通用程序库说明:该驱动程序库包含了常用的16位ADC操作与控制功能函数,如选择通道、设置信号放大/*带有缓冲区及长短键的键盘通用程序库说明:该程序库包含了读取键盘的相关函数,并且包含了一个键盘缓冲区,当主程序执行较慢,而遇到连续快速的键盘输入来不及及时读取的情况下,新的按键信息将会自动存入键盘缓冲队列内,每次调用读键盘函数时会依顺序读取,保证键盘操作不会丢失。

并且带有长短按键识别功能,当按键时间小于2秒时,返回短键,按键超过2秒后,每隔0.25秒返回一次长按键。

该键盘程序可以作为各种程序的底层驱动使用。

要使用该库函数,需要将本文件(Key.c)添加进工程,并在需要调用键盘函数的文件开头处包含"Key.h";还需要开启一个定时器,在定时中断内调用Key_ScanIO()函数。

设置定时中断的频率在16~128次/秒之间。

*///+-------------+//|定时中断|软件结构//+-------------+//|//+-------------++-------------++-------------+// KEY1_IN -->| Key_ScanIO||KeyBuff[]||Key_GetKey() |// KEY2_IN -->|键盘扫描|-->|键盘缓冲|-->|Key_WaitKey()|-->应用程序// KEY3_IN -->|函数||队列(FIFO) ||键盘读取函数|//+-------------++-------------++-------------+//////MSP430F4XX//+---------------+//+---KEY1--|P1.5|//||XOUT|-----//+---KEY2--|P1.6|32.768KHz Watch Crystal//||XIN|-----//+---KEY3--|P1.7|//|+---------------+//GND//#include<msp430x42x0.h>#define KEYBUFF_SIZE8/*键盘缓冲区大小,根据程序需要自行调整*/ char KeyBuff[KEYBUFF_SIZE]; //定义键盘缓冲队列数组(FIFO)char Key_IndexW=0;//键盘缓冲队列写入指针(头指针)char Key_IndexR=0;//键盘缓冲队列读取指针(尾指针char Key_Count=0;//键盘缓冲队列内记录的按键次数char KEY1_State=0;char KEY2_State=0;char KEY3_State=0;/*3个按键的状态变量*/#define NOKEY0#define PUSH_KEY1#define LONG_PUSH 2#define KEY1_IN (P5IN&BIT5) //KEY1输入IO的定义(P6.4)#define KEY2_IN (P5IN&BIT6) //KEY2输入IO的定义(P6.5)#define KEY3_IN (P5IN&BIT7) //KEY3输入IO的定义(P6.6)#define KEY1 0x01//SET按键#define KEY2 0x02//增加按键#define KEY3 0x04//减小按键#define LONG0x80/*连续长键标志位宏定义*/#define FIRSTLONG 0xC0/*首次长键标志位宏定义*//***************************************************************** ************名称:Key_InBuff()*功能:将一次键值压入键盘缓冲队列*入口参数:Key:被压入缓冲队列的键值*出口参数:无********************************************************************* *******/void Key_InBuff(char Key){if(Key_Count>=KEYBUFF_SIZE) return;//若缓冲区已满,放弃本次按键_DINT();Key_Count++;//按键次数计数增加KeyBuff[Key_IndexW] = Key;//从队列头部追加新的数据if (++Key_IndexW >=KEYBUFF_SIZE) //循环队列,如果队列头指针越界{Key_IndexW = 0;//队列头指针回到数组起始位置}_EINT();}/*********************************************************** ******************名称:Key_GetKey()*功能:从键盘缓冲队列内读取一次键值*入口参数:无*出口参数:若无按键,返回0,否则返回一次按键键值。

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作为这次试验的按键。

基于MSP430F149矩阵键盘设计程序附仿真图

基于MSP430F149矩阵键盘设计程序附仿真图
基于MSP430F149矩阵键盘设计程序附仿真图
#include<msp430F249.h>
#define ROW P1OUT //矩阵键盘的行宏定义
#define COL P1IN //矩阵键盘的列宏定义
#define DPYOUT P2OUT //数码管输出口宏定义
unsigned char keyval;
if((COL & 0x0f)== 0x0f)
{ROW=0xdf;
if((COL & 0x0f)== 0x0f)
{ROW=0xef;
if((COL & 0x0f)== 0x0f)
key=17;
else key=((ROW&0xf0)|(COL&0x0f));
}
else key=((ROW&0xf0)|(COL&0x0f));
case 0xeb:DPYOUT=seg[13];break;
case 0xed:DPYOUT=seg[14];break;
case 0xee:DPYOUT=seg[15];break;
}
}
仿真图:
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,
0x5e,0x79,0x71,0xff};
unsigned char P1key(void)
{
unsigned char x;
x=(P1IN&0xf0);
case 0xd7:DPYOUT=seg[8];break;
case 0xdb:DPYOUT=seg[9];break;

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];//数码管显示键值}}。

MSP430单片机按键实验教程

MSP430单片机按键实验教程

按键实验教程2015/7/24官网地址:http://www.fengke.club目录第一节矩阵键盘介绍 (2)第二节GPIO基础寄存器介绍 (3)第三节实验 (5)第四节实验现象 (7)第一节矩阵键盘介绍在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。

由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵键盘原理:先设置行线输入,列线输出低电平。

不断检测行线的输入电平,无按键时为高电平,当有按键按下则某个信号线为低电平。

进行延时消抖。

将行线设置为输出低电平,列线设置为输入,检测列线的输入电平,就可以确定哪个按键按下。

第二节GPIO基础寄存器介绍1.输入寄存器PxINPxIN:位7~0 数据输入,只读寄存器。

2.输出寄存器PxOUTPxOUT:位7~0 Px 口输出当IO 口配置为输出模式时:0,输出低电平;1,输出高电平;当IO 口配置为输入模式并且上拉/下拉使能时:0,下拉;1,上拉。

3.方向寄存器PxDIRPxDIR:位7~0 Px口的方向0,配置为输入;1,配置为输出。

4.上拉/下拉电阻使能寄存器PxRENPxREN:位7~0 Px上拉/下拉电阻使能。

当对应的端口配置为输入,设置该位将使能上拉或者下拉。

0,上拉或者下拉无效;1,上拉/下拉使能。

5.驱动能力寄存器PxDSPxDS:位7-0 Px口输出驱动能力0,减弱输出驱动能力1,全力输出驱动能力详细的寄存器介绍可以参考官方数据手册中的相关章节。

第三节实验键盘连接到单片机的P6口,如下图所示:开发接口连接可以参考《开发接口连接教程》,路径为:..\MSP430\0.从这里开始\2.快速上手。

MSP430矩阵键盘程序源码

MSP430矩阵键盘程序源码

// 上一次按键值刷新
}
if (K_STOP_HV&key) key = K_STOP_HV;
} //***************************************************************************
//*************************************************************************** //***************************************************************************
shift<<=1;
}
//--------------------------------------------------------------------------
if (code_now == key_last)
{
if (++key_delay >= T_delay)
// 同一按键按住是否超过预定时间
{
key_delay = T_delay - T_dlyup; // 设置新值以使按键快输反应,
f_key = 1;
// 设置标志
f_key_all=1;
}
}
else
// 有新键按下
{
f_key = 1;
// 设置标志
key_delay = 0;
// 计数器复位
key = key_last = code_now;
#define BASE_T0 10
// T0 基本定时周期为 20ms,用于键盘定时扫描
#define T_dlyup (100/BASE_T0)

msp430单片机程序(LT-1B_Programs)

msp430单片机程序(LT-1B_Programs)

一、基础实验【10个】1、入门试验:LED闪烁(1个)2、时钟实验:设置MCLK、ACLK、SMCLK(1个)3、低功耗实验:设置低功耗模式(1个)4、IO端口试验:IO端口寄存器设置(1个)5、定时器:看门狗定时器、TimerA寄存器设置(2个)6、比较器:比较器A寄存器(1个)7、Flash:flash读写(1个)8、异步通信:异步通信寄存器设置(1个)9、ADC:ADC12寄存器设置(1个)二、开发板模块简单程序【56个】1、LED流水灯实验(红、黄、绿)(1)LED1:检测开发板(2)LED2:普通IO控制闪烁(3)LED3:PWM信号控制闪烁2、蜂鸣器实验(1)蜂鸣器1:单频音(步进变音调)(2)蜂鸣器2:奏乐(祝你平安)3、数码管实验(1)数码管1(显示123456)(2)数码管2(动态显示0~F)(3)数码管3(流动光圈)(4)数码管4(来回光标)4、4×1独立按键实验(1)4×1键盘1:扫描数码管显示(2)4×1键盘2:中断数码管显示(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蜂鸣器6、1602液晶实验(1)1602液晶1:动态字符显示(2)1602液晶2:静态字符显示(3)1602液晶3:内部时钟显示7、3.3V-5V电平转换实验(1)电平转换1:输出5V方波(2)电平转换2:输出不同占空比的方波(3)电平转换3:MCLK,SMCLK,ACLK8、RS232接口实验(1)RS232接口1:MCU发送数据PC机显示(2)RS232接口2:按键控制MCU发送数据PC机显示(3)RS232接口3:PC机发送数据MCU液晶显示(4)RS232接口4:MCU回发接收到的PC机数据(5)RS232接口5:RS232控制蜂鸣器9、RS485接口实验(1)RS485接口1:发送程序(2)RS485接口2:接收程序10、USB接口实验(1)USB接口1:简单连接测试(2)USB接口2:USB接收数据(3)USB接口3:USB发送数据11、PS2接口实验(1)PS2接口1:PS2控制1602显示(2)PS2接口2:PS2控制数码管显示(3)PS2接口3:PS2控制LED和蜂鸣器12、12-Bit高精度温度传感器实验(1)温度传感器1:DS18B20在数码管显示(2)温度传感器2:DS18B20在液晶显示13、RTC实时时钟实验(1)实时时钟1:DS1302测试(2)实时时钟2:DS1302电子钟14、2k Bit EEPROM实验(1)EEPROM1:AT24C02测试(2)EEPROM2:读出数据通过串口在PC机显示15、12-Bit模数转换器(ADC)接口实验(1)模数转换器1:ADC在数码管显示(2)模数转换器2:ADC在1602液晶在显示(3)模数转换器3:ADC通过串口在PC机显示16、8-Bit数模转换器(DAC)实验(1)数模转换器1:DAC控制LED(2)数模转换器2:DAC输出电压,ADC采样转换并在液晶上显示17、12864液晶实验(和12864液晶配套)(1)12864液晶并口1:字符显示(2)12864液晶并口2:汉字显示(3)12864液晶并口3:图形显示(4)12864液晶并口4:综合演示(5)12864液晶串口5:字符显示(6)12864液晶串口6:汉字显示(7)12864液晶串口7:图形显示(8)12864液晶串口8:综合演示18、射频模块CC1000实验(1)射频模块1:发送数据(2)射频模块2:接收数据19、ucos移植注:17、18程序随模块赠送三、开发板综合程序【30】1、键盘综合实验(1)4×4键盘+蜂鸣器+LED+数码管显示(2)4×4键盘+蜂鸣器+LED+1602液晶显示(3)4×4键盘+蜂鸣器+LED+PC机显示(4)PS2键盘+UART+PC机显示(5)PS2键盘+USB+PC机显示2、接口综合实验(1)USB UART(2)UART USB(3)RS232 RS485(4)RS485 RS2323、温度时间综合实验(1)DS18B20 + DS1302 + 数码管(2)DS18B20 + DS1302 + USB(3)DS18B20 + DS1302 + UART(4)DS18B20 + DS1302 + 16024、AD DA综合实验(1)ADC + 1602(2)ADC + UART(3)ADC + USB(4)DAC + LED + KEY(5)DAC + UART(6)DAC + USB(7)ADC + UART + DS1302(8)ADC + DAC + 1602 + KEY(9)ADC + DAC + UART + KEY5、其他综合实验(1)AT24C02高级使用(搜索,擦除,读出全部)(2)DS1302高级使用(内部RAM存取数据)6、12864液晶综合实验(1)汉字库(2)图形库7、3.2寸TFT触摸屏实验(1)静态图片(2)动画/***************************************************程序功能:BoardConfig.h 头文件---------------------------------------------------***************************************************/ typedef unsigned char uchar;typedef unsigned int uint;//控制位的宏定义#define Ctrl_Out P3DIR |= BIT3 + BIT6 + BIT7;#define SRCLK_1 P3OUT |= BIT7#define SRCLK_0 P3OUT &= ~BIT7#define SER_1 P3OUT |= BIT6#define SER_0 P3OUT &= ~BIT6#define RCLK_1 P3OUT |= BIT3#define RCLK_0 P3OUT &= ~BIT3//板上资源配置函数void BoardConfig(uchar cmd){uchar i;Ctrl_Out;Ctrl_0;for(i = 0; i < 8; i++){SRCLK_0;if(cmd & 0x80) SER_1;else SER_0;SRCLK_1;cmd <<= 1;}RCLK_1;_NOP();RCLK_0;}/***************************************************程序功能:控制8个LED闪烁,用于测试下载功能是否正常---------------------------------------------------测试说明:观察LED闪烁***************************************************/#include <msp430x14x.h>#include "BoardConfig.h"/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗BoardConfig(0xf0); //关闭数码管和电平转换,打开流水灯CCTL0 = CCIE; //使能CCR0中断CCR0 = 2047; //设定周期0.5STACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式P2DIR = 0xff; //设置P2口方向为输出P2OUT = 0xff;_EINT(); //使能全局中断LPM3; //CPU进入LPM3模式}函数名称:Timer_A功能:定时器A的中断服务函数参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){P2OUT ^= 0xff; //P2口输出取反}/***********************************************程序功能:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"------------------------------------------------测试说明:观察流水灯流动顺序和速度的变化************************************************/#include <msp430x14x.h>#include "BoardConfig.h"uint i = 0,j = 0,dir = 0;uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度/****************主函数****************/void main(void){WDTCTL = WDTPW + WDTHOLD; //关闭看门狗BoardConfig(0xf0);CCTL0 = CCIE; //使能CCR0中断CCR0 = 50000;TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式P2DIR = 0xff; //设置P2口方向为输出P2OUT = 0xff;_EINT(); //使能全局中断LPM0; //CPU进入LPM0模式}/*******************************************函数名称:Timer_A功能:定时器A的中断服务函数,在这里通过标志控制流水灯的流动方向和流动速度参数:无返回值:无********************************************/#pragma vector = TIMERA0_VECTOR__interrupt void Timer_A (void){if(flag == 0)P2OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1}else if(flag == 1){P2OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8}else{if(dir) //灯的点亮顺序D8 -> D1,D1 -> D8,循环绕圈{P2OUT = ~(0x80>>(i++));}else{P2OUT = ~(0x01<<(i++));}}if(i == 8){i = 0;dir = ~dir;}j++;if(j == 40){i = 0;j = 0;flag++;if(flag == 4) flag = 0;switch(speed){case 0:TACTL &=~ (ID0 + ID1);TACTL |= ID_3;break;case 1:TACTL &=~ (ID0 + ID1);TACTL |= ID_2;break;case 2:TACTL &=~ (ID0 + ID1);TACTL |= ID_1;break;case 3:TACTL |= ID_0;break;default:break;}if(flag != 3) speed++;if(speed == 4) speed = 0;}}/*******************************************************程序功能:用从P2.3和P2.4输出的PWM波形驱动LED闪烁P2.3口输出方波的占空比为75%P2.4口输出方波的占空比为25%-------------------------------------------------------测试说明:观察LED的亮灭的时间长短*******************************************************/#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // 关狗BoardConfig(0xb0); // 关闭数码管和电平转换,打开流水灯P2DIR = 0xff; // P2端口设置为输出P2OUT = 0xff; // 关闭其他LEDP2SEL |= BIT3 + BIT4; // P2.3和P2.4连接内部模块CCR0 = 4096-1; // PWM周期为1SCCTL1 = OUTMOD_7; // CCR1 reset/setCCR1 = 3072; // CCR1 PWM duty cycleCCTL2 = OUTMOD_7; // CCR2 reset/setCCR2 = 1024; // CCR2 PWM duty cycleTACTL = TASSEL_1 + ID_3 + MC_1; // ACLK/8, up mode_BIS_SR(LPM3_bits); // Enter LPM3}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, Output Buffered SMCLK, ACLK and MCLK//// Description: Output buffered MCLK, SMCLK and ACLK.// ACLK = LFXT1 = 32768, MCLK = DCO Max, SMCLK = XT2// //* XTAL's REQUIRED - NOT INSTALLED ON FET *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *////// MSP430F149// -----------------// /|\| XIN|-// --|RST XOUT|-// | |// | XT2IN|-// | | XTAL (455k - 8Mhz)// |RST XT2OUT|-// | |// | P5.4|-->MCLK = DCO Max// | P5.5|-->SMCLK = XT2// | P5.6|-->ACLK = 32kHz//// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW +WDTHOLD; // Stop Watchdog Timer DCOCTL = DCO0 + DCO1 + DCO2; // Max DCOBCSCTL1 = RSEL0 + RSEL1 + RSEL2; // XT2on, max RSELBCSCTL2 |= SELS; // SMCLK = XT2P5DIR |= 0x70; // P5.6,5,4 outputsP5SEL |= 0x70; // P5.6,5,5 optionswhile(1){}}//****************************************************************************** // MSP-FET430P140 Demo - Basic Clock, LPM3 Using WDT ISR, 32kHz ACLK//// Description: This program operates MSP430 normally in LPM3, pulsing P3.4// at 4 second intervals. WDT ISR used to wake-up system. All I/O configured// as low outputs to eliminate floating inputs. Current consumption does// increase when LED is powered on P3.4. Demo for measuring LPM3 current.// ACLK= LFXT1/4= 32768/4, MCLK= SMCLK= default DCO// //* External watch crystal on XIN XOUT is required for ACLK *//////// MSP430F149// ---------------// /|\| XIN|-// --|RST XOUT|-// | |// | P3.5|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);BCSCTL1 |= DIVA_2; // ACLK/4WDTCTL = WDT_ADL Y_1000; // WDT 1s/4 interval timerIE1 |= WDTIE; // Enable WDT interruptP1DIR = 0xFF; // All P1.x outputsP1OUT = 0; // All P1.x resetP2DIR = 0xFF; // All P2.x outputsP2OUT = 0; // All P2.x resetP3DIR = 0xFF; // All P3.x outputsP3OUT = 0x30; // All P3.x resetP4DIR = 0xFF; // All P4.x outputsP4OUT = 0; // All P4.x resetP5DIR = 0xFF; // All P5.x outputsP5OUT = 0; // All P5.x resetP6DIR = 0xFF; // All P6.x outputsP6OUT = 0x80; // All P6.x resetwhile(1){uint i;_BIS_SR(LPM3_bits + GIE); // Enter LPM3P3OUT &= ~BIT5; // Set P3.5 LED onfor (i = 18000; i>0; i--); // DelayP3OUT |= BIT5; // Clear P3.5 LED off}}#pragma vector=WDT_VECTOR__interrupt void watchdog_timer (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)//// Description: Toggle P3.4 by xor'ing P3.4 inside of a software loop.// ACLK= n/a, MCLK= SMCLK= default DCO ~800k//// MSP430F149// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerP3DIR |= BIT4; // Set P3.4 to output directionfor (;;){volatile unsigned int i;P3OUT ^= BIT4; // Toggle P3.4 using exclusive-ORi = 50000; // Delaydo (i--);while (i != 0);}}// MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, DCO SMCLK//// Description: Toggle P3.4 using software timed by the WDT ISR. Toggle rate// is approximately 30ms based on default ~ 800khz DCO/SMCLK clock source// used in this example for the WDT.// ACLK= n/a, MCLK= SMCLK= default DCO~ 800k//// MSP430F149// -----------------// /|\| XIN|-// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xbf); //关闭数码管、流水灯和电平转换WDTCTL = WDT_MDLY_32; // Set Watchdog Timer interval to ~30ms IE1 |= WDTIE; // Enable WDT interruptP3DIR |= BIT4; // Set P3.4 to output direction_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR}//****************************************************************************** // MSP-FET430P140 Demo - WDT, Toggle P3.4, Interval Overflow ISR, 32kHz ACLK//// Description: Toggle P3.4 using software timed by WDT ISR. Toggle rate is// exactly 250ms based on 32kHz ACLK WDT clock source. In this example the// WDT is configured to divide 32768 watch-crystal(2^15) by 2^13 with an ISR// triggered @ 4Hz.// ACLK= LFXT1= 32768, MCLK= SMCLK= DCO~ 800kHz// //* External watch crystal installed on XIN XOUT is required for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDT_ADL Y_250; // WDT 250ms, ACLK, interval timer IE1 |= WDTIE; // Enable WDT interruptP3DIR |= BIT4; // Set P3.4 to output direction_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interrupt}// Watchdog Timer interrupt service routine#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P3OUT ^= BIT4; // Toggle P3.4 using exclusive-OR}//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, CCR0 Cont. Mode ISR, DCO SMCLK//// Description: Toggle P3.4 using software and TA_0 ISR. Toggles every// 50000 SMCLK cycles. SMCLK provides clock source for TACLK.// During the TA_0 ISR, P3.4 is toggled and 50000 clock cycles are added to// CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and// used only during TA_ISR.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"{WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8); //关闭数码管、流水灯和电平转换P3DIR |= BIT4; // P3.4 outputCCTL0 = CCIE; // CCR0 interrupt enabledCCR0 = 50000;TACTL = TASSEL_2 + MC_2; // SMCLK, contmode_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P3OUT ^= BIT4; // Toggle P3.4CCR0 += 50000; // Add Offset to CCR0}//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, CCR0 Up Mode ISR, DCO SMCLK//// Description: Toggle P3.4 using software and TA_0 ISR. Timer_A is// configured for up mode, thus the timer overflows when TAR counts// to CCR0. In this example, CCR0 is loaded with 20000.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputCCR0 = 20000;TACTL = TASSEL_2 + MC_1; // SMCLK, upmode_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer A0 interrupt service routine#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void){P3OUT ^= BIT4; // Toggle P3.4}//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, DCO SMCLK//// Description: Toggle P3.4 using software and Timer_A overflow ISR.// In this example an ISR triggers when TA overflows. Inside the TA// overflow ISR P3.4 is toggled. Toggle rate is approximatlely 12Hz.// Proper use of the TAIV interrupt vector generator is demonstrated.// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~800kHz//// MSP430F149// ---------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputTACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, contmode, interrupt_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}// Timer_A3 Interrupt Vector (TAIV) handler#pragma vector=TIMERA1_VECTORswitch( TAIV ){case 2: break; // CCR1 not usedcase 4: break; // CCR2 not usedcase 10: P3OUT ^= BIT4; // overflowbreak;}}//****************************************************************************** // MSP-FET430P140 Demo - Timer_A, Toggle P3.4, Overflow ISR, 32kHz ACLK//// Description: Toggle P3.4 using software and the Timer_A overflow ISR.// In this example an ISR triggers when TA overflows. Inside the ISR P3.4// is toggled. Toggle rate is exactly 0.5Hz. Proper use of the TAIV interrupt// vector generator is demonstrated.// ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO ~800kHz// //* An external watch crystal on XIN XOUT is required for ACLK *////// MSP430F149// ---------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|-->LED//// Dasheng// LiTian Electronic Inc.// Feb 2008// Built with IAR Embedded Workbench Version: 3.42A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop WDTBoardConfig(0xb8);P3DIR |= BIT4; // P3.4 outputTACTL = TASSEL_1 + MC_2 + TAIE; // ACLK, contmode, interrupt_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt}// Timer_A3 Interrupt Vector (TAIV) handler#pragma vector=TIMERA1_VECTORswitch( TAIV ){case 2: break; // CCR1 not usedcase 4: break; // CCR2 not usedcase 10: P3OUT ^= BIT4; // overflowbreak;}}#include <msp430x14x.h>#include "BoardConfig.h"void main(void){WDTCTL = WDTHOLD + WDTPW; // 关看门狗BoardConfig(0xb0); //开流水灯,关数码管和电平转换CACTL1 = CARSEL + CAREF0 + CAON ; // Vcc/4 = - cmpCACTL2 = P2CA0; // 使用CA0P2DIR = 0xff;P2OUT = 0xff;while(1){if((CACTL2 | 0xfe) ==0xff){ // 比较电压是否超过0.25VccP2OUT &= ~BIT4;CACTL1 &= 0xfe; // CAIFG = 0}else{P2OUT |= BIT4;}}}//**************************************************************************** // MSP-FET430P140 Demo - Flash In-System Programming, Copy SegA to SegB//// Description: This program first erases flash seg A, then it increments all// values in seg A, then it erases seg B, then copies seg A to seg B.// Assumed MCLK 550kHz - 900kHz.// //* Set Breakpoint on NOP in the Mainloop to avoid Stressing Flash *////// MSP430F149// -----------------// /|\| XIN|-// | | |// | |//// M. Mitchell// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"uchar value; // 8-bit value to write to segment Auchar DataBuffer[128];// Function prototypesvoid write_SegA (uchar value);void copy_A2B (void);void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timerFCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator value = 0; // Initialize valuewhile(1) // Repeat forever{write_SegA(value++); // Write segment A, increment valuecopy_A2B(); // Copy segment A to B_NOP(); // SET BREAKPOINT HERE}}void write_SegA (uchar value){uchar *Flash_ptr; // Flash pointeruint i;Flash_ptr = (uchar *) 0x1080; // Initialize Flash pointerFCTL1 = FWKEY + ERASE; // Set Erase bitFCTL3 = FWKEY; // Clear Lock bit*Flash_ptr = 0; // Dummy write to erase Flash segmentFCTL1 = FWKEY + WRT; // Set WRT bit for write operationfor (i=0; i<128; i++){*Flash_ptr++ = value; // Write value to flash}FCTL1 = FWKEY; // Clear WRT bitFCTL3 = FWKEY + LOCK; // Set LOCK bit}void copy_A2B (void)uchar *Flash_ptrA; // Segment A pointeruchar *Flash_ptrB; // Segment B pointeruint i;Flash_ptrA = (uchar *) 0x1080; // Initialize Flash segment A pointerFlash_ptrB = (uchar *) 0x1000; // Initialize Flash segment B pointerFCTL1 = FWKEY + ERASE; // Set Erase bitFCTL3 = FWKEY; // Clear Lock bit*Flash_ptrB = 0; // Dummy write to erase Flash segment B FCTL1 = FWKEY + WRT; // Set WRT bit for write operationfor (i=0; i<128; i++){DataBuffer[i] = *Flash_ptrA++;*Flash_ptrB++ = DataBuffer[i]; // Copy value segment A to segment B}FCTL1 = FWKEY; // Clear WRT bitFCTL3 = FWKEY + LOCK; // Set LOCK bit}//****************************************************************************** // MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 2400 Echo ISR, 32kHz ACLK //// Description: Echo a received character, RX ISR used. In the Mainloop UART0// is made ready to receive one character with interrupt active. The Mainloop// waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after// receiving one character which echo's back the received character.// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k// Baud rate divider with 32768hz XTAL @2400 = 32768Hz/2400 = 13.65 (000Dh)// //* An external watch crystal is required on XIN XOUT for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | |// | P3.4|----------->// | | 2400 - 8N1// | P3.5|<-----------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//******************************************************************************#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop WDTP3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x0D; // 32k/2400 - 13.65UBR10 = 0x00; //UMCTL0 = 0x6B; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt// Mainloopfor (;;){_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interruptwhile (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0}}// UART0 RX ISR will for exit from LPM3 in Mainloop#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)}// MSP-FET430P140 Demo - USART0, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK //// Description: Echo a received character, RX ISR used. In the Mainloop UART0// is made ready to receive one character with interrupt active. The Mainloop// waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3 after// receiving one character which echo's back the received character.// ACLK = UCLK0 = LFXT1 = 32768, MCLK = SMCLK = DCO~ 800k// Baud rate divider with 32768hz XTAL @9600 = 32768Hz/9600 = 3.41 (0003h 4Ah )// //* An external watch crystal is required on XIN XOUT for ACLK *////// MSP430F149// -----------------// /|\| XIN|-// | | | 32kHz// --|RST XOUT|-// | P3.4|----------->// | | 9600 - 8N1// | P3.5|<-----------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop WDTP3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 32k/9600 - 3.41UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt// Mainloopfor (;;){_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/interruptwhile (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0}}// UART0 RX ISR will for exit from LPM3 in Mainloop#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){_BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR)}//****************************************************************************** // MSP-FET430P140 Demo - USART0, UART 19200 Echo ISR, XT2 HF XTAL ACLK//// Description: Echo a received character, RX ISR used. Normal mode is LPM0,// USART0 RX interrupt triggers TX Echo. Though not required, MCLK = XT2.// ACLK = n/a, MCLK = SMCLK = UCLK0 = XT2 = 8MHz// Baud rate divider with 8Mhz XTAL @19200 = 8MHz/19200 = 416.66 ~ 417 (01A0h)// //* An external 8MHz XTAL on X2IN X2OUT is required for XT2CLK *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//////// MSP430F149// -----------------// /|\| XT2IN|-// | | | 8Mhz// --|RST XT2OUT|-// | |// | P3.4|------------>// | | 19200 - 8N1// | P3.5|<------------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){volatile unsigned int i;BoardConfig(0xb8);P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDWDTCTL = WDTPW + WDTHOLD; // Stop WDTBCSCTL1 &= ~XT2OFF; // XT2ondo{IFG1 &= ~OFIFG; // Clear OSCFault flagfor (i = 0xFF; i > 0; i--); // Time for flag to set}while ((IFG1 & OFIFG)); // OSCFault flag still set?BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2 (safe)ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL1; // UCLK = SMCLKUBR00 = 0xA0; // 8Mhz/19200 ~ 417UBR10 = 0x01; //UMCTL0 = 0x00; // no modulationUCTL0 &= ~SWRST; // Initialize USART state machineIE1 |= URXIE0; // Enable USART0 RX interrupt_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}#pragma vector=UART0RX_VECTOR__interrupt void usart0_rx (void){while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0}// MSP-FET430P140 Demo - USART0, UART 115200 Echo ISR, XT2 HF XTAL ACLK//// Description: Echo a received character, RX ISR used. Normal mode is LPM0,// USART0 RX interrupt triggers TX Echo. Though not required, MCLK= XT2.// ACLK = n/a, MCLK = SMCLK = UCLK0 = XT2 = 8MHz// Baud rate divider with 8Mhz XTAL = 8000000/115200 = 0069 (0045h)// //* An external 8MHz XTAL on X2IN X2OUT is required for XT2CLK *//// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//////// MSP430F149// -----------------// /|\| XT2IN|-// | | | 8Mhz// --|RST XT2OUT|-// | |// | P3.4|------------>// | | 115200 - 8N1// | P3.5|<------------////// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with IAR Embedded Workbench Version: 3.21A//****************************************************************************** #include <msp430x14x.h>#include "BoardConfig.h"void main(void){volatile unsigned int i;BoardConfig(0xb8);WDTCTL = WDTPW + WDTHOLD; // Stop WDTP3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXDBCSCTL1 &= ~XT2OFF; // XT2ondo。

单片机矩阵式键盘连接方法及工作原理

单片机矩阵式键盘连接方法及工作原理

矩阵式键盘的连接方法和工作原理什么是矩阵式键盘?当键盘中按键数量较多时,为了减少I/O 口线的占用,通常将按键排列成矩阵形式。

在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

这样做有什么好处呢?大家看下面的电路图,一个并行口可以构成4*4=16 个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别就越明显。

比如再多加一条线就可以构成20 键的键盘,而直接用端口线则只能多出一个键(9 键)。

由此可见,在需要的按键数量比较多时,采用矩阵法来连接键盘是非常合理的。

矩阵式结构的键盘显然比独立式键盘复杂一些,识别也要复杂一些,在上图中,列线通过电阻接电源,并将行线所接的单片机4 个I/O 口作为输出端,而列线所接的I/O 口则作为输入端。

这样,当按键没有被按下时,所有的输出端都是高电平,代表无键按下,行线输出是低电平;一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了,具体的识别及编程方法如下所述:二.矩阵式键盘的按键识别方法确定矩阵式键盘上任何一个键被按下通常采用“行扫描法”或者“行反转法”。

行扫描法又称为逐行(或列)扫描查询法,它是一种最常用的多按键识别方法。

因此我们就以“行扫描法”为例介绍矩阵式键盘的工作原理:1.判断键盘中有无键按下将全部行线X0-X3 置低电平,然后检测列线的状态,只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中;若所有列线均为高电平,则表示键盘中无键按下。

2.判断闭合键所在的位置在确认有键按下后,即可进入确定具体闭合键的过程。

其方法是:依次将行线置为低电平(即在置某根行线为低电平时,其它线为高电平),当确定某根行线为低电平后,再逐行检测各列线的电平状态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

下面给出一个具体的例子:单片机的P1 口用作键盘I/O 口,键盘的列线接到P1 口的低4 位,键盘的行线接到P1 口的高4位,也就是把列线P1.0-P1.3 分别接4 个上拉电阻到电源,把列线P1.0-P1.3 设置为输入线,行线P1.4-P1.7 设置为输出线,4 根行线和4 根列线形成16 个相交点,如上图所示。

MSP430程序库七按键

MSP430程序库七按键

MSP430程序库七按键msp430程序库按键键是单片机系统中最常用的输入设备之一;几乎只要需要交互式输入,就必须有键盘。

这个博客实现了一个通用键盘程序。

只要它提供一个读取键值(底部键值)的函数,程序就会完成一些列处理,比如去抖振、存储在队列中等等。

同时,本程序提供了最常用的4*4矩阵键盘程序和4键程序。

硬件介绍:本文主要实现了一个键盘的通用框架,可以很方便的改为不同的键盘函数,这里实现了两种按键4个单独按键和4*4行列扫描的键盘。

四个按键的工作原理如下:四个按键的一端接地,另一端连接上拉电阻,然后输入单片机0-P1的P1。

3个港口;这样,当按键时,单片机接收到一个低电平。

释放时,单片机输入信号具有上拉电阻,并固定在高电平。

4*4的按键:行输入信号配有桑拉电阻,无按键时默认电平高电平;列扫描信号线直接接到按键列线;读键时,列扫描信号由单片机给出低电平信号(按列逐列扫描),读取行信号,从而判断具体是哪个按键;电路图大概如下:在图中,In是键盘的列扫描线,out是键盘输出的行信号线。

扫描也可以按行扫描。

此时,in是行扫描行,out是键输出的列信号行。

我的程序按列扫描(行和列扫描的原理相同,但行和列是交换的)。

这里,同时实现了4*4按键的scanf函数的移植,同时,加入了之前实现的液晶的printf函数的移植,搭建了一个可以交互输入输出的完整的一个系统;液晶的printf又加入了函数,实现了退格;可以在输入错误数字的时候退格重新输入。

程序实现:首先,我们来谈谈这个项目的结构。

该程序实现了一个循环队列来存储按下的键值。

可以保存最新的四把钥匙,防止钥匙丢失;程序使用中断模式按键。

每16毫秒读取一次按键(使用看门狗的间隔中断),以判断按键值是否有效。

如果有效,将其放入队列并等待读取。

循环队列的实现:通过数组实现。

为了判断队列是否已满,数组的最后一个元素不需要存储密钥代码值:/**********************宏定义***********************/#definekeysize4//键码值队列#definelengthkeysize+1//队列数组元素个数/***************************************************//**********************键值队列*********************///可keysize(length-1)个键码循环队列占用一个元素空间charkey[length];入队函数:入队时,队满则出队一个,以保存最新的四个按键。

MSP430按键输入和led点阵显示

MSP430按键输入和led点阵显示

XT2OUT XT2IN
RST/NMI TCK
TDI/TCLK TDO/TDI
TMS
52 53 58 57 55 54 56
MSP430F249
R8
R9
10k
10k
F
B
7
E
A6Βιβλιοθήκη D95C
8
4
R10
R11
10k
10k
3
2
1
0
7
第4章 MSP430
确定矩阵式键盘上哪个键被按下通常采用行扫描法,又称为逐行 (或列)扫描查询法,其软件主要基于扫描方式完成。关于 键盘扫描查询的程序大致可分为以下几个步骤:
P3.0/UCB0STE/UCA0CLK P3.1/UCB0SIMO/UCB0SDA P3.2/UCB0SOMI/UCB0SCL
P3.3/UCB0CLK/UCA0STE P3.4/UCA0TXD/UCA0SIMO P3.5/UCA0RXD/UCA0SOMI P3.6/UCA1TXD/UCA1SIMO P3.7/UCA1RXD/UCA1SOMI
4.2 LED点阵显示
第4章 MSP430
第4章 MSP430
LED点阵显示器与LED数码管类似,常用的工作方式有静态显 示和动态显示两种方式。所谓静态显示,就是当显示器显示 一个字符时,相应的发光二极管始终保持导通或截止,在显 示的这个过程中,其状态是静止不变的,直到一个字符显示 完毕,将要显示下一个字符时其状态才改变。而动态显示方 式则不同,它在显示每一个字符的过程中,都是按列(或行) 不停扫描,一位一位地轮流点亮要显示的各个位,如此反复 循环。动态显示方式利用了人眼的视觉暂留性质,当扫描的 速度足够快时,可以得到静态的显示效果。由于 LED点阵引 脚设计的特殊性,一般采用动态扫描显示方式。

430矩阵键盘及LED显示

430矩阵键盘及LED显示

以下是两个关于矩阵键盘及七段数码管的程序,希望能给大家一些帮助。

#include<msp430x13x.h>unsigned char segment[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};unsigned char data;display(data){P5OUT=0x00;P2OUT=0x00;P2OUT=segment[data];}void delay1800ms() //1200毫秒的延时。

{unsigned char m,n,z;for(m=0;m<100;m++)for(n=0;n<200;n++)for(z=0;z<2;z++);}void delay30ms() //30毫秒的延时。

{unsigned char m,n;for(m=0;m<50;m++)for(n=0;n<10;n++);}void keyscan(void){unsigned char keyin;P4OUT=0x0E;keyin=P4IN;if(keyin!=0xFE){delay30ms();if(keyin!=0xFE){switch(keyin){case 0xEE: display(0);break;case 0xDE: display(1);break;case 0xBE: display(2);break;case 0x7E: display(3);break;default:display(0);}}while(P4IN!=0xFE);}P4OUT=0x0D;keyin=P4IN;if(keyin!=0xFD){delay30ms();if(keyin!=0xFD){switch(keyin){case 0xED: display(4);break;case 0xDD: display(5);break;case 0xBD: display(6);break;case 0x7D: display(7);break;default:display(0);}}while(P4IN!=0xFD);}P4OUT=0x0B;keyin=P4IN;if(keyin!=0xFB){delay30ms();if(keyin!=0xFB){switch(keyin){case 0xEB: display(8);break;case 0xDB: display(9);break;case 0xBB: display(8);break;case 0x7B: display(7);break;default:display(0);}}while(P4IN!=0xFB);}keyin=P4IN;if(keyin!=0xF7){delay30ms();if(keyin!=0xF7){switch(keyin){case 0xE7: display(6);break;case 0xD7: display(5);break;case 0xB7: display(4);break;case 0x77: display(3);break;default:display(0);}}while(P4IN!=0xF7);}}void main(void){// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD; //关闭看门狗P4SEL=0x00; //1为外围模块的功能,0为普通的I/O端口P4DIR=0x0F; //设置寄存器方向,1为输出,0为输入。

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