蓝桥杯完美按键(无延时)

通过改变KEY的值改变模式
.h
#ifndef _key_h
#define _key_h
#include<STC15F2K60S2.h>
#define u8 unsigned char
#define u16 unsigned int
#define KEY 1
sbit key1=P4^4;
sbit key2=P4^2;
sbit key3=P3^5;
sbit key4=P3^4;
sbit key_row1=P3^0;
sbit key_row2=P3^1;
sbit key_row3=P3^2;
sbit key_row4=P3^3;
extern u8 key_value;
extern bit key_flag;
void Key_Scan();
void Key_Judge();
#endif

.c

#include<key.h>
u8 key_value=0;
bit key_flag=0;
#if KEY
u8 pdata key_catch[4]={0xff,0xff,0xff,0xff};
u8 pdata key_backup[4]={1,1,1,1};
u8 pdata key_state[4]={1,1,1,1};
u8 code key_button[4]={1,2,3,4};
void Key_Scan()
{
 u8 i=0;
 key_catch[0]=key_catch[0]<<1|keyrow1;
 key_catch[1]=key_catch[1]<<1|keyrow2;
 key_catch[2]=key_catch[2]<<1|keyrow3;
 key_catch[3]=key_catch[3]<<1|keyrow4;
 for(;i<4;i++)
 {
  if((key_catch[i]&0xff)==0xff)
  {
   key_state[i]=1;
  }
  else if((key_catch[i]&0xff)==0x00)
  {
   key_state[i]=0;
  }
 }
}
void Key_Judge()
{
 u8 i=0;
 for(;i<4;i++)
 {
  if(key_state[i]!=key_backup[i])
  {
   if(key_backup[i]==0)
   {
    key_value=key_button[i];
    key_flag=1;
   }
   key_backup[i]=key_state[i];
  }
 }
}
#else
u8 pdata key_catch[4][4]={0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff};
u8 pdata key_backup[4][4]={1,1,1,1,
1,1,1,1,
1,1,1,1,
1,1,1,1};
u8 pdata key_state[4][4]={1,1,1,1,
1,1,1,1,
1,1,1,1,
1,1,1,1};
u8 code key_button[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
void Key_Scan()
{
 u8 i=0;
 static u8 row=0;
 key_catch[row][0]=key_catch[row][0]<<1|keyrow1;
 key_catch[row][1]=key_catch[row][1]<<1|keyrow2;
 key_catch[row][2]=key_catch[row][2]<<1|keyrow3;
 key_catch[row][3]=key_catch[row][3]<<1|keyrow4;
 for(;i<4;i++)
 {
  if((key_catch[row][i]&0x0f)==0x0f)
  {
   key_state[row][i]=1;
  }
  else if((key_catch[row][i]&0x0f)==0x00)
  {
   key_state[row][i]=0;
  }
 }
 row++;
 row&=0x03;
  switch(row)
 {
  case 0:key1=0;key4=1;break;
  case 1:key2=0;key1=1;break;
  case 2:key3=0;key2=1;break;
  case 3:key4=0;key3=1;break;
  default:break;
 }
}
void Key_Judge()
{
 u8 i=0,j=0;
 for(i=0;i<4;i++)
 {
  for(j=0;j<4;j++)
  {
  if(key_state[i][j]!=key_backup[i][j])
  {
   if(key_backup[i][j]==0)
   {
    key_value=key_button[i][j];
    key_flag=1;
   }
   key_backup[i][j]=key_state[i][j];
  }
  }
 }
}

#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值