pic 4*4按鍵

來源:互聯網
上載者:User

/*******************************************************************
  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<pic18.h>

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();      //無按鍵按下
      }
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.