找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3883|回復: 0
打印 上一主題 下一主題
收起左側

MSP430F5438A單片機的獨立鍵盤

[復制鏈接]
跳轉到指定樓層
樓主
ID:226180 發(fā)表于 2017-8-12 18:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 吳曉京123 于 2017-8-14 21:44 編輯

本程序是用獨立鍵盤切換流水燈樣式,


用到中斷來控制按鍵,源代碼如下:
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  unsigned temp1;
  delay(20);
  if((P1IN&0x0f)!=0x0f)    //P1IN的值先跟0x0f與,
                                //再判斷是不是等于0X0f如果不等就執(zhí)行下一步

  {
    temp1 = P1IFG;          //  P1IFG=0X00;
    if(temp1==0x01)
    {
      LED_State = 1;
    }
     else if(temp1==0x02)
    {
      LED_State = 2;
    }
     else if(temp1==0x04)
    {
      LED_State = 3;
    }
   else
   {
      LED_State = 0;
   }
  }
  P1IFG = 0x00;
}

這里只有這樣寫1中斷只能控制按鍵1,后面的按鍵都控制不了,所以我又加了一個while(1);循環(huán),代碼如下:
while(1)
{
   if(LED_State == 1)
     lamp1();
   else if (LED_State == 2)
     lamp2();
   else if (LED_State == 3)
     lamp3();
    else
    {
          P2OUT=0x00;
          _NOP();
    }
}加這個循環(huán)的原因,我也不太清楚,我也是個初學者,

主要的部分就這樣了,接下來就是寫按鍵要切換的流水燈花樣了,


這里要說明一下,這個獨立按鍵是單片機上面自帶有的按鍵,不是像3x3,4x4矩陣鍵盤的按鍵,
下面是我的完整代碼:
#include<MSP430F5438A.h>
void delay();
void lamp1();
void lamp2();
void lamp3();
unsigned int  LED_State,a,b,j,k;
char LCD_a[]={0xFF,0x7E,0x3E,0x3C,0x0E,0x18,0x08};
void main()
{
        WDTCTL=WDTPW+WDTHOLD;
        P1DIR=0xf0;
        P1IE=0X0F;    //中斷使能寄存器
        P1IES=0X0F;    //中斷觸發(fā)邊沿選擇寄存器
        P1IFG=0X00;    //中斷標志寄存器
        _EINT();
while(1)
{
   if(LED_State == 1)
     lamp1();
   else if (LED_State == 2)
     lamp2();
   else if (LED_State == 3)
     lamp3();
    else
    {
          P2OUT=0x00;
          _NOP();
    }
}
}
void delay(int xms)

{
         unsigned int i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}


void lamp1()//按鍵1控制的流水燈
{
        
      unsigned char lcd;
        P2DIR=0XFF;
        lcd=0xfe;
        P2OUT=lcd;
        
        for(a=0;a<23;a++)
        {
                lcd<<=1;
                lcd|=1;
                P2OUT=lcd;
                if(P2OUT==0xff)       //判斷LCD是否移動到最左端
                {
                        lcd=0x7e;
                        P2OUT=lcd;
                }
                delay(500);
         }
}

void lamp2()     // 按鍵2控制的流水燈
{
        P2DIR=0XFF;
         for(b=0;b<23;b++)
        {
                P2OUT=0x55;     //10101010
                delay(500);
                P2OUT=0xAA;     //01010101
                delay(700);
        }
}
void lamp3()            // 按鍵2控制的流水燈
{
          P2DIR=0XFF;
        for(k=0;k<7;k++)
        {
                P2OUT=LCD_a[k];
                delay(500);
         }
}

#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
  unsigned temp1;
  delay(20);
  if((P1IN&0x0f)!=0x0f)    //P1IN的值先跟0x0f與,
                                //再判斷是不是等于0X0f如果不等就執(zhí)行下一步

  {
    temp1 = P1IFG;          //  P1IFG=0X00;
    if(temp1==0x01)
    {
      LED_State = 1;
    }
     else if(temp1==0x02)
    {
      LED_State = 2;
    }
     else if(temp1==0x04)
    {
      LED_State = 3;
    }
   else
   {
      LED_State = 0;
   }
  }
  P1IFG = 0x00;
}






評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表