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

📄 picc_keyboard.c

📁 PIC 单片机 键盘扫描 PROTEUS 防真通过测试适合初学者
💻 C
字号:
//实验目的:熟悉键盘矩阵的扫描方法
//程序中没有做按键去抖,也没有考虑多个键同时按下的情况。
//最低两位数码管显示相应的按键(如按下S10,在显示10;按下S25,则显示25)
//无按键按下的时候显示FF 
//按键跟按键的扫描结果满足如下关系:
//   按键     扫描结果(result)        按键       扫描结果  
//   K10            0XE7                K18          0XB7
//   K11            0XEB                K19          0XBB
//   K12            0XED                K20          0XBD
//   K13            0XEE                K21          0XBE
//   K14            0XD7                K22          0X77
//   K15            0XDB                K23          0X7B
//   K16            0XDD                K24          0X7D
//   K17            0XDE                K25          0X7E

//硬件要求:拨码开关S4全部置ON
//          拨码开关S6全部置ON,拨码开关S5第5-6位置ON,其他位置OFF
//          其它拨码开关置OFF

#include<pic.h>              //包含单片机内部资源预定义
 __CONFIG(0x1832);        
//芯片配置字,看门狗关,上电延时开,掉电检测关,低压编程关,加密,4M晶体HS振荡

 int  result;
 void  delay();              //delay函数申明
 void  init();               //I/O口初始化函数申明
 void  scan();               //按键扫描程序申明
 void  display();       //显示函数申明
//---------------------------------------------------
                             //主程序  
void main()
{  
   init();
  while(1)                   //循环工作
    {
                      //调用初始化子程序
      scan();            //调用按键扫描子程序
      display();       //调用结果显示子程序
    }
 }
 
//---------------------------------------------------
//初始化函数


void init() 
 {
  TRISB=0X00;
  ADCON1=0X07;               //设置A口为普通I/O口
  TRISA=0X0f;                //设置A口高2位为输出,低4位为输入
  TRISC=0XF0;                //设置C口高4位为输入,低4位为输出
  TRISD=0X00;                //设置D口为输出
  PORTA=0Xff;              
  PORTD=0Xff;                //先清除所有显示
 }

//---------------------------------------------------
//按键扫描程序
bit pkey()//整体扫描

{
   PORTC=0XF0;
  
   if (PORTC!=0XF0)
  {
    delay();
    
    if(PORTC!=0XF0)
    return 1;
    else return 0;
  } 
  else return 0;  

}

void scan()
{ 
unsigned char key,s,k,c;
while(pkey())
{  
PORTC=0XFe;
k=0xfe;
for(c=0;c!=4;c++)
{    
s=PORTC&0xf0;
if(s==0x70)key=4*c+0;
if(s==0xb0)key=4*c+1;
if(s==0xd0)key=4*c+2;
if(s==0xe0)key=4*c+3;
/*switch(s)
{
case 0x70: key=4*c+0; break; 
case 0xb0: key=4*c+1; break;
case 0xd0: key=4*c+2; break;
case 0xe0: key=4*c+3; break;
default: break; 
}*/
k=(k<<1)|0x01;//左移一位 第二行一个低电平 然后扫描列  如果是第二列就加4
PORTC=k;  
}
while(pkey());result=key;
}
}

//----------------------------------------------------------
//显示程序
void   display()
  { 
  switch(result)                 
      {
       case 0:
                 PORTA=0X2f;PORTD=0x3f;PORTA=0X00;delay(); PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break;   //K10
       case 1:
                 PORTA=0X2f;PORTD=0x06;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break;   //K11
       case 2:
                PORTA=0X2f;PORTD=0x5b;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break;   //K12
       case 3:
                PORTA=0X2f;PORTD=0x4f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break;   //K13
       case 4:
                PORTA=0X2f;PORTD=0x66;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break;   //K14
       case 5:
                PORTA=0X2f; PORTD=0x6d;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x3f;PORTA=0X00;delay();break;   //K15
       case 6:
                 PORTA=0X2f;PORTD=0x7d;PORTA=0X00;delay();PORTA=0X1f;PORTD=0X3f;PORTA=0X00;delay();break;   //K16
       case 7:
                 PORTA=0X2f;PORTD=0x7f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0X3f;PORTA=0X00;delay();break;   //K17
       case 8:
               PORTA=0X2f; PORTD=0x6f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0X3f;PORTA=0X00;delay();break;   //K18
       case 9:
                 PORTA=0X2f;PORTD=0x77;PORTA=0X00;delay();PORTA=0X1f;PORTD=0X06;PORTA=0X00;delay();break;   //K19
       case 10:
                PORTA=0X2f; PORTD=0x3f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break;   //K20
       case 11:
                PORTA=0X2f; PORTD=0x06;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break;   //K21
       case 12:
                PORTA=0X2f; PORTD=0x5b;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break;   //K22
       case 13:
                PORTA=0X2f; PORTD=0x4f;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break;   //K23
       case 14:
                PORTA=0X2f; PORTD=0x66;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break;   //K24
       case 15:
                PORTA=0X2f; PORTD=0x6d;PORTA=0X00;delay();PORTA=0X1f;PORTD=0x06;PORTA=0X00;delay();break;   //K25
       case 16:
                PORTA=0X2f; PORTD=0x8e;PORTA=0X00;delay(); PORTA=0X1f;PORTD=0x8e; PORTA=0X00; delay();break;      //无按键按下

      }
   }

//------------------------------------------------------------------
//延时程序
void  delay()              //延时程序
    {
     int i;                 //定义整形变量
     for(i=50;i>0;i--);     //延时
    }

⌨️ 快捷键说明

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