×
嵌入式 > 技术百科 > 详情

msp430矩阵式按钮驱动程序

发布时间:2020-06-20 发布时间:
|
写这个程序的时候,完全没有参考,全部是建立在汇编语言的基础上,一步步的搬移到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;
      }
   }
 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
NTMD6N03R2G的技术参数