原创
MSP430 Archive.2 Digital IO,Key,LED part1
本节内容主要结合MSP430的IO总结按键及数码管的相关内容及程序。
IO简介
1、每组IO可任意组合输入输出
2、P1和P2可中断,且可独立配置其中断
3、独立的输出输入寄存器
注意,430不能位操作,所有对IO中单独位的操作均需要波兰表达式实现。在430中BIT0~BIT7是常用的组合。
比如,对P1^4置位:P1OUT |= BIT4;对P1^4复位:P1OUT &=~ BIT4.
操作
430的部分IO具有功能复用或中断,IO操作可按下面步骤设置
1、是否功能复用?设置PxSEL
2、设置IO或复用方向。设置PxDIR
3、若为输出,设置输出寄存器PxOUT。若为输入,查询输入寄存器PxIN。
4、若用到中断,开始中断PxIE;设置上升沿或下降沿PxIES;查询中断标志PxIFG。
5、设置不使用的IO。手册上是这么说的
个人觉得把IO设置成输出低电平即可,即PxDIR = 0XFF;PxOUT = 0X00;
键盘
键盘同LED一样都是基础,任何开发板都少不了,这两样是所有交互的基础,此archive试着尽量整理更多的键盘和LED的知识并提供结合430的例程。
1、键盘一般分为矩阵式和普通的单独按键,矩阵式一般为行列扫描,单独的按键一般结合中断。
2、所有的键盘均需要考虑消抖操作,消抖一般采用延时和重复查询方式。
3、键盘需要上拉电阻构成强1电平。
程序1 4*4矩阵键盘扫描子程序,采用逐行(列)扫描的方式
采用扫描方式,假设KEY0~KEY7连接到P1^0~P1^7.高4位输入,低4位输出。
key为全局变量
//**********************************************************************
// 4*4矩阵键盘扫描子程序,采用逐行(列)扫描的方式
//**********************************************************************
uchar Key_Scan_4*4(void)
{
uchar statevalue,key_checkin,key_check;
P1SEL = 0X00; //设置为普通IO,可省
P1DIR = 0X0F; //高四位输入,低4位输出
P1OUT= 0XF0; //高四位输出值无意义,低四位输出0,
//当有按键按下时,高4位输入值被拉低
key_checkin=P1IN; //读取IO口状态,判断是否有键按下
if(key_checkin!=0xf0) //IO口值发生变化则表示有键按下
{
delay_ms(20); //键盘消抖,延时20MS
key_checkin=P1IN;
if(key_checkin!=0xf0)
{
P1OUT=0xfe; //逐行扫描开始
P1OUT=0xfe; //写两次延时,下同
key_check=P1IN;
switch (key_check) //根据读到的IO口值判断按键的按下情况
{
case 0xee:key=15;break;
case 0xde:key=11;break;
case 0xbe:key=8;break;
case 0x7e:key=4;break;
}
P1OUT=0xfd;
P1OUT=0xfd;
key_check=P1IN;
switch (key_check)
{
case 0xed:key=14;break;
case 0xdd:key=10;break;
case 0xbd:key=7;break;
case 0x7d:key=3;break;
}
P1OUT=0xfb;
P1OUT=0xfb;
key_check=P1IN;
switch (key_check)
{
case 0xeb:key=13;break;
case 0xdb:key=0;break;
case 0xbb:key=6;break;
case 0x7b:key=2;break;
}
P1OUT=0xf7;
P1OUT=0xf7;
key_check=P1IN;
switch (key_check)
{
case 0xe7:key=12;break;
case 0xd7:key=9;break;
case 0xb7:key=5;break;
case 0x77:key=1;break;
}
}
}
else
{
statevalue=0xff; //无按键时返回值0XFF
key=statevalue;
return(key);
}
return(key); //有按键按下时返回按键值
}
文章评论(0条评论)
登录后参与讨论