写这个程序的时分,彻底没有参阅,全部是建立在汇编言语的基础上,一步步的搬移到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;
}
}
}
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/261399.html