新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > msp430矩陣式按鈕驅(qū)動(dòng)程序

msp430矩陣式按鈕驅(qū)動(dòng)程序

作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
寫這個(gè)程序的時(shí)候,完全沒有參考,全部是建立在匯編語(yǔ)言的基礎(chǔ)上,一步步的搬移到c語(yǔ)言上的。但是測(cè)試后,感覺效果還是十分理想,所以拿出來(lái)與眾位分享了,希望對(duì)一些朋友有所幫助~

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

本文引用地址:http://m.butianyuan.cn/article/201611/320417.htm

void ADD()
{
P4OUT+=1;
}

void SUB()
{
P4OUT-=1;
}

unsigned int key_check(void) //檢測(cè)是否有按鍵按下
{
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) //掃描對(duì)應(yīng)按鍵的鍵號(hào)
{
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; //標(biāo)志檢測(cè)出來(lái)
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) //延時(shí)子程序
{
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;
}
}
}
}



評(píng)論


技術(shù)專區(qū)

關(guān)閉