key_lcd.c

来自「适用于msp430f449的键盘输入程序」· C语言 代码 · 共 158 行

C
158
字号
#include  "msp430x44x.h "
//---------------------------------------------------------
//-----flag byte define------
//---------------------------------------------------------
#define     key_press       0x2
//---------------------------------------------------------
//-----vaule define----------
//---------------------------------------------------------
static  unsigned char flag;                       //flag register
static  unsigned char key_buff;                   //key vaule buffer
static  unsighed char sign2;                      //是否为等号的标志
static  unsighed char sign1;                      //运算号的标志,+。-,*,/
const   unsigned char lcd_table[12]={
0x7b,       //*"0"*//
0x12,       //*"1"*//
0x4f,       //*"2"*//
0x1f,       //*"3"*//                             //lcd display table
0x36,       //*"4"*//
0x3d,       //*"5"*//
0x7d,       //*"6"*//
0x13,       //*"7"*//
0x7f,       //*"8"*//
0x3f,       //*"9"*//
0x6d,       //*"e"*//
0x65,       //*"f"*//
};
const   unsigned char key_table[12]={
0x0b,       //*(key_vaule)          00(key_num)
0x09,       //9                     01
0x08,       //8                     02
0x07,       //7                     03
0x00,       //0                     04
0x06,       //6                     05            //key vaule table,
0x05,       //5                     06            //键值是从最后一个定义从右往左定义的!!!
0x04,       //4                     07            
0x0a,       //#                     08
0x03,       //3                     09
0x02,       //2                     0a
0x01,       //1                     0b
};


void main(void)
{
    int i;
    WDTCTL = WDTPW + WDTHOLD;
    BTCTL=BTSSEL+BT_ADLY_250+BTFRFQ1;     //BT 0.25 S interrupt
    IE2|=BTIE;
    
    P5SEL=0xfc;                           //enable lcd display
    LCDCTL=LCDON+LCD4MUX+LCDP2;
    for (i=0; i<8; ++i)                   // clear lcd
    LCDMEM[i] = 0x00;
    
    _EINT();
//*mainloop*//
    for(;;)
    {
       _BIS_SR(LPM3_bits);                //in LPM3
       _NOP();

    }
}


// Basic Timer interrupt service routine
//interrupt[BASICTIMER_VECTOR] void basic_timer(void)
#pragma vector=BASICTIMER_VECTOR
__interrupt void basic_timer(void)
{
}










//---------------------------------------------------------
//------- SCAN KEY PROGRAM---------------------------------
//---------------------------------------------------------
void scan_key_deal(void)
{
unsigned char counter;
unsigned char buffer;
unsigned char com_byte;
unsigned char key_num;

P1DIR=0x0f;
/*需要将P1.4到1.7的方向置成输出才能驱动行列键盘*/

com_byte=0xff;


P1OUT&=~0x08;
P1OUT&=~0x04;
P1OUT&=~0x02; 

/*这三句或是用来将P1.1,1.2,1.3置零*/

buffer=P1IN;
/*读取P1的键值,传入buffer*/

if(0xf0!=(buffer&0xf0))                    //judge if the key was press

/*判断是否有键按下,若有那么高四位就不会是全1*/

    {
    P1OUT|=0x08;
    P1OUT|=0x04;
    P1OUT|=0x02;  
   
    /*把低三位置1,高四位不变*/
    
    com_byte=0xff;
    key_num=0x00;
    
    com_byte=0x02;            //从P1.1开始
    for(counter=0x03;counter>0;counter--)  //get the key num
        {
        P1OUT&=~com_byte;                  //scan the row,置P1.1为0
        if(!(P1IN&BIT4))                   //判断P1.4是不是0,
                                           // 若是则key_num为0,P1.1和1.4为0对应为*,table[0]为*
        {
          if(counter==0x03)
          {
            sign2=1;
          }
          
          else if(counter==0x01)
          {
            sign1++;
          }
          break;
        }
        key_num++;
        if(!(P1IN&BIT5))
        break;
        key_num++;
        if(!(P1IN&BIT6))
        break;
        key_num++;
        if(!(P1IN&BIT7))
        break;
        key_num++;
        com_byte=com_byte<<1;
        }
     flag|=key_press;
     buffer=P1IN;
     buffer=P1IN;
     key_buff=key_table[key_num];         //get the key value
     return;
     }
//     flag&=~key_press;
}

⌨️ 快捷键说明

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