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

📄 键盘输入第一个运算数据的显示.c

📁 MSP430开发板413演示程序 MSP430开发板413演示程序
💻 C
字号:
//
//******************************************/
#include <msp430x44x.h>
#define LED_IN_USE 6
const unsigned char  NUM_LED[20]=
                       {0xd7,0x14,0xcd,0x5d,0x1E,  // 0 ~ 4
                       0x5b,0xdb,0x15,0xdf,0x5f,   // 5 ~ 9
                       0x9f,0xda,0xc3,0xdc,0xcb,   // a ~ e
                       0x8b,0x00,0x40,0x8
                       };                 //f,0x00使LED不显示
unsigned char  key_Map[12] ={    //设置键盘逻辑键值与程序计算键值的映射
                           1,2,3,10,4,5,
                           6,0,7,8,9,11
                           };
unsigned char led_Buf[6];  // LED显示缓冲区 ,                                    // 存放要显示数据
char key_val;
char key_con=0;
char yunsuanfu=0;

void key();

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


char Keyj(void)
    {	
    P1DIR |= 0x0E;    // set p1.1~p1.3 设置为输出模式
    P1OUT = 0x00;     // p1.1~p1.3 输出值清零
    return(P1IN &  0xf0 ) ;
    }

/*********************************************
* Check_Key(),检查按键,确认键值
*********************************************/
void check_Key(void){
    unsigned char row ,col,tmp1,tmp2;    // tmp1用来设置P1OUT的值,使P1.1~P1.3中有一个为0
    tmp1 = 0x08;
    for(row=0;row<3;row++){
        P1OUT |= 0x0E;                          // p1.1~P1.3=1
        P1OUT -= tmp1;                          // P1.1~p1.3中有一个为0
        tmp1 = tmp1/2;                          // tmp1 右移一位
        if ((P1IN & 0xf0) < 0xf0){              // 是否P1IN的P1.4~P1.7中有一位为0
           tmp2 = 0x80;                         // tmp2用于检测出那一位为0
           for(col =0;col<0x04;col++){          // 列检测
              if((P1IN & tmp2)==0x00){          // 是否是该列
                key_val =key_Map[ row*4 +col] ; // 获取键值
                return;                         // 退出循环
              }
              tmp2 /= 2;                        // tmp2右移
           }
        }
    }
}


/*******************************************************
*     模块初始化
*******************************************************/
void init_LED(void)
  {
    char tmpv;
    P3DIR  = 0xff;    // 设置 p3 输出
    P3OUT  = 0x00;    // 设置 初始值为0
    P4DIR |= 0x03;    // 设置 p4.0,p4.1 输出
    P4OUT &= 0xfc;    // 设置初始值
    for(tmpv=0;tmpv<LED_IN_USE;tmpv++)
    {                 // 初始化缓冲区
      led_Buf[tmpv] = 0x12;
    }

}
/****************************************************
*     LED 显示  ,该函数可以放到定时器中断中
****************************************************/
void led_Display()
{
      unsigned tmp ,i ;
      tmp    = 0x01;
      for(i=0;i<6;i++)
      {
      P3OUT  = NUM_LED[led_Buf[i]];  // 设置显示值
      P4OUT |= 0x02;                        // 打开数据锁存器
      P4OUT &= 0XFD;                        // 关闭数据锁存
      P3OUT  = ~(tmp<<i);            // 设置那只LED显示
      P4OUT  |= 0x01;                       // 打开控制锁存
      P4OUT  &= 0XFE;                       // 关闭控制锁存
      delay(300);
      }
}

void key()
    {
key_k:      
     led_Display();
     if(Keyj()!=0xf0)
           led_Display();
     if(Keyj()!=0xf0)
            check_Key();
     else   goto key_k;
key_loop:
     if(Keyj()!=0xf0)
        goto key_loop;
    }

void clr_dis(void)
  {
  char i;
  for(i=0;i<6;i++)
    led_Buf[i]= 0x10;
  }

int input_data(void)
  {
   char i;
   for(i=0;i<4;i++)
     {
     key();
     led_Buf[i]= key_val ;
     }
  return(led_Buf[0]*1000+led_Buf[1]*100+led_Buf[2]*10+led_Buf[3]);
  }




/*
main(void)
{
  WDTCTL = WDTHOLD + WDTPW;
  while(1)
  {
if(Keyj() != 0xf0 )
     {
     delay(200);		//延时消除抖动
     if(Keyj() == 0xf0 )
                ;		//没有按键  为抖动
     else			//确实有键按下
                {
                P1DIR |= BIT0;
                P1OUT = 1 ;	//处理
                delay(10000);
                P1OUT = 0 ;
                }
     }
  }
}
*/
/******************************************/
void main(void)
{
     char i=0;
     int a,b;
     WDTCTL = WDTHOLD + WDTPW;     //关闭看门狗
     init_LED();
     while(1)
     {                             //循环
        a=input_data();
        clr_dis();
        key();
        yunsuanfu = key_val ;
        
        b=input_data();
        clr_dis();
main_loop:
        key();
        if(key_val == 11 )
            a=a+b;
        else  goto main_loop;
        led_Buf[0] = a / 1000;
        a= a % 1000 ;
        led_Buf[1] = a / 100;
        a= a % 100 ;
        led_Buf[2] = a / 10;
        led_Buf[3] = a % 10;
     }
}

⌨️ 快捷键说明

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