pic 4*4按键

2019-04-15 16:06发布

/*******************************************************************
  Name:        唐湘衡
  Copyright:
  Author:
  Date: 26-10-09 17:52   Description:
********************************************************************/
/*******************************************************************
    功能:检测4*4键盘是否按下,如有按下,在中间两数码管显示按键序号
     如无按键,显示HH s5开启3,4拨码开关,s6 8个开关全开
    定义C口进行输出,选XT震荡,关闭看门狗定时器,低电压复位
    器件:pic DEMOII 工程板,pic18f4520芯片,pic16-mcd2
    在线调试器
********************************************************************/
#include void  delay();                      //延时函数申明
void  init();                      //I/O口初始化函数申明
void  display(int x);             //显示函数申明
int   result;      
//*****************************************************************
void main()
{
     init() ;
     PORTC = 0xf7;                     //开通Rc3       
    
     if (RC3==0&& RC4==0)              //判断k1是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x01;                  
     }
     if (RC3==0 && RC5==0)              //判断k5是否被按下           
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x05;        
     }          
     if (RC3==0 && RC6==0)           // 判断k9是否被按下    
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x09;        
     }
     if (RC3==0 && RC7==0)             // 判断k13是否被按下        
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x13;        
     }        //******************************************************
    
     PORTC = 0xfb;                     //开通Rc2
     if (RC2==0&& RC4==0)              //判断k2是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x02;                  
     }
     if (RC2==0 && RC5==0)            //判断k6是否被按下  
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x06;        
     }          
     if (RC2==0 && RC6==0)            //判断k10是否被按下  
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x10;        
     }
     if (RC2==0 && RC7==0)              //判断k14是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x14;        
     }
    
     //*****************************************************
     PORTC = 0xfd;                     //开通Rc1
     if (RC1==0&& RC4==0)              //判断k3是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x03;                  
     }
     if (RC1==0 && RC5==0)              //判断k7是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x07;        
     }          
     if (RC1==0 && RC6==0)              //判断k11是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x11;        
     }
     if (RC1==0 && RC7==0)             //判断k15是否被按下 
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x15;        
     }
    
     //****************************************************
    
     PORTC = 0xfe;                     //开通Rc0
     if (RC0==0&& RC4==0)              //判断k4是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x04;                  
     }
     if (RC0==0 && RC5==0)              //判断k8是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x08;        
     }          
     if (RC0==0 && RC6==0)              //判断k12是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定         
           result = 0x12;        
     }
     if (RC0==0 && RC7==0)              //判断k6是否被按下
     {
           asm("nop");                //插入一定延时,确保电平稳定这里为1us         
           result = 0x16;        
     }
    
     //*************************************************
     PORTC = 0xf0;
     if (PORTC==0xf0)
     {
          asm("nop");
          result = 0xff;
     }                              display(result);
     
}
//*********************************************************************
void delay()
{
     int i;
     for (i=1000; i>0; i--){;}
}
//******************************************************************
//初始化函数
void init()
 {
  ADCON1=0X07;               //设置A口为普通I/O口
  TRISA=0X33;                //设置(打开第3和4数码管)
  TRISC=0XF0;                //设置C口高4位为输入,低4位为输出
  TRISD=0X00;                //设置D口为输出
  PORTA=0XFF;             
  PORTD=0XFF;                //先清除所有显示
 }
//******************************************************************** void  display(int x)
{
      switch(result)                
      {
       case 0x01:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0xf9;PORTA=0X3b;delay();break;   //k1按下
       case 0x02:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0xa4;PORTA=0x3b;delay();break;    //k1按下
       case 0x03:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0xb0;PORTA=0x3b;delay();break;    //k1按下
       case 0x04:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0x99;PORTA=0x3b;delay();break;   //k1按下
       case 0x05:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0x92;PORTA=0x3b;delay();break;    //k1按下
       case 0x06:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0x82;PORTA=0x3b;delay();break;    //k1按下
       case 0x07:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0Xf8;PORTA=0x3b;delay();break;   //k1按下
       case 0x08:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0X80;PORTA=0x3b;delay();break;    //k1按下
       case 0x09:
                 PORTD=0xc0;PORTA=0x37;delay();PORTD=0X90;PORTA=0x3b;delay();break;    //k1按下
       case 0x10:
                 PORTD=0xf9;PORTA=0x37;delay();PORTD=0Xc0;PORTA=0x3b;delay();break;    //k1按下
       case 0x11:
                 PORTD=0xf9;PORTA=0x37;delay();PORTD=0xf9;PORTA=0x3b;delay();break;    //k1按下
       case 0x12:
                 PORTD=0xf9;PORTA=0x37;delay();PORTD=0xa4;PORTA=0x3b;delay();break;    //k1按下
       case 0x13:
                 PORTD=0xf9;PORTA=0x37;delay();PORTD=0xb0;PORTA=0x3b;delay();break;    //k1按下
       case 0x14:
                 PORTD=0xf9;PORTA=0x37;delay();PORTD=0x99;PORTA=0x3b;delay();break;    //k1按下
       case 0x15:
                 PORTD=0xf9;PORTA=0x37;delay();PORTD=0x92;PORTA=0x3b;delay();break;    //k1按下
       case 0x16:
                 PORTD=0xf9;PORTA=0x37;delay();PORTD=0x82;PORTA=0x3b;delay();break;    //k1按下
       case 0xff:
                 PORTD=0x89;PORTA=0x37;delay(); PORTD=0x89; PORTA=0x3b; delay();      //无按键按下
      }
}