⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 16扫描键盘程序.c

📁 MSP430系列单片机适用小程序
💻 C
字号:

#include  <msp430x44x.h>
#define uchar unsigned char
#define uint unsigned int
uchar key_buffer;
uchar key_long;
unsigned char disbuffer[8]={0,1,3,8,0xf,5,0x18,7};
char digit[20] = {1,0,0,0,0,2,1,8
};
char distab[]={        0xaf,0x06,0x6d,0x4f,
	0xc6,0xcb,0xeb,0x0e,
	0xef,0xcf,      0x77,0x7c,
	0x39,0x5e,0x79,0x71
	};
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71,
	0xbf,0x86,0xdb,0xcf,
	0xe6,0xed,0xfd,0x87,
	0xff,0xef,0xf7,0xfc,
	0xb9,0xde,0xf9,0xf1,

	0x80,0x40,0x00,0x73,0xc0};

void delay(int v)
    {
        while(v!=0)v--;
    }

void disp(void)
    {
    unsigned char i=0,j=0;
    unsigned char temp_wei=0x04,temp_duan=0;
//    P1IE=0X0;
    P1DIR  =  0x1f;
    for(i=0;i<8;i++)
      {
        P1OUT  &=  ~BIT3;  
        temp_duan=seg[disbuffer[i]] ;
        for(j=0;j<8;j++)
            {
             if(temp_duan&0x80)   
                P1OUT  |=   BIT0;
             else
                P1OUT  &=  ~BIT0;
             temp_duan=temp_duan<<1;
             P1OUT  &=   ~BIT4;   P1OUT  |=  BIT4;       
            }
         P1OUT  =  (P3IN&0xf8) | temp_wei;
         P1OUT  |=   BIT3;      
         temp_wei++;
         delay(80);
      }
     for(i=0;i<8;i++)
     { P1OUT  &=  ~BIT0;   P1OUT  &=   ~BIT4;   P1OUT  |=  BIT4;     
     }
    P1DIR=0XF;
    P1OUT=0XF;
    P1IFG=0;
    P1IE=0xf0;
    }


void main(void)
{
   int i;
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer
  FLL_CTL0 |= XCAP14PF;                 // Configure load caps
//  LCDCTL = LCDON + LCD4MUX + LCDP2;     // STK LCD 4Mux, S0-S17
  LCDCTL = 0XFD;
  BTCTL = BTFRFQ1;                      // STK LCD freq 
  P5SEL = 0xFC;                         // Common and Rxx all selected
  for(i=0;i<20;i++)     
  LCDMEM[i]=0;
  
  for (i=1; i<7; ++i)                   // Display "6543210" 
  LCDMEM[i] = distab[digit[i-1]];//digit[i];
  P1DIR=0x1f;
    P1DIR=0X0f;
    P1OUT=0X0f;
    P1IE=0Xf0;
    P1IES=0;
    P1IFG=0;
  _EINT();                              // Enable interrupts
 
  for (;;)                              
  {
    _BIS_SR(CPUOFF);                    // CPU off
    _NOP();                             // Required only for C-spy
  }
}

//************************************8888888
uchar key_just(void)    //00:down  0xff:no down
    {
    P1DIR=0xf;
    P1OUT=0xf;
    if((P1IN&0xf0)==0)
          return(0xff);
    return(0);
    }
    
uchar key_code(void)    
    {uchar in;
     P1DIR=0XF;
     P1OUT=0x8;
     in=P1IN&0x0f0;
     if(in!=0)
         {
         if(in==0X10)
           return(0); //C-F
         if(in==0X20)
           return(1);
         if(in==0X40)
           return(2);
         if(in==0X80)
           return(3);
          }
     P1OUT=0X4;
     in=P1IN&0x0f0;
     if(in!=0)
         {
         if(in==0X10)
           return(4);   //8-B
         if(in==0X20)
           return(5);
         if(in==0X40)
           return(6);
         if(in==0X80)
           return(7);
         }
     P1OUT=0X2;
     in=P1IN&0x0f0;
     if(in!=0)
         {
         if(in==0X10)
           return(8);   //4-7
         if(in==0X20)
           return(9);
         if(in==0X40)
           return(10);
         if(in==0X80)
           return(11);
         }
     P1OUT=0X1;
     in=P1IN&0x0f0;
     if(in!=0)
         {
         if(in==0X10)
           return(12);   //0-3
         if(in==0X20)
           return(13);
         if(in==0X40)
           return(14);
         if(in==0X80)
           return(15);
          }
        return(0xff);
      }
    
uchar key(void)
    {
    uchar temp=0xff    ;//=key_buffer;
    uint time=0;
    P1IFG=0;
    if(key_just()==0)
        delay(500);
    if(key_just()!=0)
        return(temp);
    temp=key_code();
    key_buffer=temp;
key_loop:    
    if(key_just()==0)
       {
       time++;
       delay(300);
       if(time>200)
            key_long=0xf;
       goto  key_loop;
       }
    else
       {
       P1IFG=0;
       return(temp);
       }
    }
//***************************************   


interrupt[PORT1_VECTOR] void key_p1(void)
      {
      uchar key_;
      uchar i=0;
      P1IFG=0;
      key_=key();
      for(i=0;i<8;i++)
      disbuffer[i]=key_;
      for(i=0;i<7;i++)
      LCDMEM[i]=distab[key_];
      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -