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

📄 key.c

📁 4*4键盘程序
💻 C
字号:
/******************
#include<AT89X51.H>
#include"key.h"

unsigned char temp;
unsigned char key;
unsigned char i,j;

 void delay()
 {
   for(i=50;i>0;i--)
     for(j=200;j>0;j--);
 }
 unsigned char keyscan(void)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
 delay();
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:key=0;break;
case 0x0d:key=1;break;
case 0x0b:key=2;break;
case 0x07:key=3;break;
}
}
  }
P3=0xff;
P3_5=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay();
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:key=4;break;
case 0x0d:key=5;break;
case 0x0b:key=6;break;
case 0x07:key=7;break;
}
 }
}

P3=0xff;
P3_6=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay();
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:key=8;break;
case 0x0d:key=9;break;
case 0x0b:key=10;break;
case 0x07:key=11;break;
}
}
}

P3=0xff;
P3_7=0;
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
delay();
temp=P3;
temp=temp & 0x0f;
if (temp!=0x0f)
{
temp=P3;
temp=temp & 0x0f;
switch(temp)
{
case 0x0e:key=12;break;
case 0x0d:key=13;break;
case 0x0b:key=14;break;
case 0x07:key=15;break;
}
}
}
  return(key);
}

//-------------------------------- ------------------------------------------------------------------
// 函数名称: program_SCANkey
// 函数功能: 程序扫描键盘,
//                  有键按下完成按键处理,无键按下直接返回
//--------------------------------------------------------------------------------------------------

unsigned char i,j;
bit judge_hitkey() ;
unsigned char scan_key() ;

 void delay()
 {
   for(i=500;i>0;i--)
     for(j=200;j>0;j--);
 }
unsigned char program_SCANkey()
{
unsigned char key_code;
          if(judge_hitkey())                   //判断是否有键按下
{
              delay();                         //延时20ms左右,消除抖动干扰
              if(judge_hitkey())                   //判断是否有效按键
   {
key_code=scan_key();//      key_code=scan_key();;//           //获取键值
             while(judge_hitkey());          //等待按键释放
        {
         }
            return(key_code); //  key_manage(key_code);           //键盘扫描、键盘散转、按键处理
       }
}
}

//--------------------------------------------------------------------------------------------------
// 函数名称: judge_hitkey
// 函数功能: //判断是否有键按下,有返回1,没有返回0 
// 列判断,还可以用行判断。
//--------------------------------------------------------------------------------------------------
bit judge_hitkey()                            //判断是否有键按下,有返回1,没有返回0
{
unsigned char scancode,keycode;
scancode=0x0F;               //开始设定P1.0~P1.3输出全1(初值)即表明无键闭合
KEY=scancode;          
keycode=KEY;                 //读取P1.0~P1.3的真实状态,从而确定有没有键被按下
if(keycode==0x0F)
      return(0);                              //全1则无键闭合
else 
           return(1);                              //否则有键闭合
}
/*******************************************************
//--------------------------------------------------------------------------------------------------
// 函数名称: scan_key
// 函数功能: //扫描键盘,返回键值(高四位代表行,低四位代表列)
// 说明:scancode 扫描码,keycode 键值,keycode_line 行,keycode_row 列
// 过程:先扫描行,确定那行的按键被按下。再扫描列,确定那列的按键被按下,从而确定那个按键被按下。
//--------------------------------------------------------------------------------------------------

unsigned char scan_key()                    //扫描键盘,返回键值(高四位代表行,低四位代表列)
{
         unsigned char scancode,keycode,keycode_line,keycode_row;
    scancode=0xF0;               //列置低,行置高
    KEY = scancode;              //输入扫描码,扫描行
    keycode_line=KEY;            //KEY的值是与键盘相连的P的状态值。若没有按键按下KEY的值为0xF0,若有按键按下则KEY的值就不是0xF0
   	    delay(); 
    scancode=0x0F;                            //列置高,行置低
    KEY=scancode;                             //输入扫描码,扫描列
    keycode_row=KEY;         //KEY的值是与键盘相连的P的状态值。若没有按键按下KEY的值为0x0F,若有按键按下则KEY的值就不是0x0F
         keycode = ((keycode_line&0xF0)|(keycode_row&0x0F));
         return(keycode);
}
 *****************************************************/
#include <AT89X51.H>
#define   L1  P1_0

void delay02s(void) //延时0.2秒子程序
{
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}


void main(void)
{
while(1) 

{
L1=0;
delay02s();
L1=1;
delay02s();
}

}

⌨️ 快捷键说明

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