微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > msp430矩阵式按钮驱动程序

msp430矩阵式按钮驱动程序

时间:11-23 来源:互联网 点击:
写这个程序的时候,完全没有参考,全部是建立在汇编语言的基础上,一步步的搬移到c语言上的。但是测试后,感觉效果还是十分理想,所以拿出来与众位分享了,希望对一些朋友有所帮助~

#include "msp430x14x.h"
unsigned char LineScan[4]={0xef,0xdf,0xbf,0x7f}; //列值列举

void ADD()
{
P4OUT+=1;
}

void SUB()
{
P4OUT-=1;
}

unsigned int key_check(void) //检测是否有按键按下
{
unsigned char temp;
P1DIR=0xf0; //定义P1.4~P1.7为输出
temp=P1IN & 0x0f;
if(temp!=0x0f)
return 1;
else
return 0;
}

unsigned char scan_key(void) //扫描对应按键的键号
{
P1DIR=0xf0;
unsigned char count;
unsigned char i,temp,m,n; //m为列的值,n为行的值
unsigned int flag=0;
for(i=0;i<4;i++) //列扫描
{
P1OUT=LineScan[i]; //获取扫描的列
temp=P1IN&0x0f;

if(temp==0x07) //为第一行
{n=0; //记录按下按钮的行
flag=1; //标志检测出来
break;}
else if(temp==0x0b) //为第二行
{n=1;
flag=1;
break;}
else if(temp==0x0d) //为第三行
{n=2;
flag=1;
break;}
else if(temp==0x0e) //为第四行
{n=3;
flag=1;
break;}
}
if(flag==1)
{m=i;
flag=0;
count=n*4+m;
switch(count)
{
case 0: {;break;}
case 1: {;break;}
case 2: {;break;}
case 3: {;break;}
case 4: {;break;}
case 5: {;break;}
case 6: {;break;}
case 7: {;break;}
case 8: {;break;}
case 9: {;break;}
case 10:{;break;}
case 11:{SUB();break;}
case 12:{;break;}
case 13:{;break;}
case 14:{;break;}
case 15:{ADD();break;}
}
return;
}
else
return;
}

void Delay(char wDelay) //延时子程序
{
while(wDelay!=0)
wDelay--;
}

int main( void )
{
WDTCTL = WDTPW + WDTHOLD;
P4DIR =0xff;
P4OUT=0X00;
while(1)
{
if(key_check())
{Delay(10000);
if(key_check())
{
scan_key();
while(key_check());
P1OUT=0x0f;
}
}
}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top