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

📄 int.c

📁 嵌入式键盘
💻 C
字号:
#include <at89s52.h>
#include <stdio.h>
#include <per.h>
#include <intrins.h>

extern unsigned char MS[BUFFNUM+1];//
//extern bit receive_flag;
//extern bit first_receive_b;
//extern bit receive_time_begin_b;
//extern unsigned char receive_time;
//extern unsigned char interrupt_times;
//unsigned char px,sum_temp;
//extern bit send_flag;
extern bit SomeKeyEnableFlag,SomeKeyKeepFlag;
extern unsigned char SomeKeyKeepTime;
extern bit ReadKeyOnceFlag;

extern unsigned char DatTemp1,DatTemp2,DatTemp11,DatTemp22;
unsigned int time;
extern unsigned char KeyWobbleTime;
extern bit   NewKeyFlag;
extern unsigned char makecode;
extern unsigned char KeyT;
extern unsigned int testtime;

void INT_S(void)  interrupt S_VECTOR
 {
//设计思想:当接收第一个数据时,判断是否是本机的地址数据,如果不是,SM2=1,因主机后来数据的TB8=0,数据再不会接收,除非主机发送新的一桢;//
//如果是本机地址,SM2=0,开始计时,保证6ms内把数据接收完,否则接受数据全部清除//
   unsigned char dat_temp;
   if(RI)
     {
	  RI=0;
	  dat_temp=SBUF;
	 }
	else if(TI)
	 {
	   TI=0;
	  }
 }
void INT_TO()interrupt TI0_VECTOR//1ms interrupt 
{
  TL0=T0_L;
  TH0=T0_H;
  if(KeyT>0)
    KeyT--;
 // if(testtime>0)
 //   testtime--;
//===============键盘扫描
  if(KeyT==0)
   {
  if(!ReadKeyOnceFlag)
    { 
          P1|=0x3f;//P10,P11,P12,P13,P14,P15口线置高
          P2=0;//P2口拉低
          DatTemp11=P1&0x3f;//读取P10,P11,P12,P13,P14,P15口状态
          //if(DatTemp11==0x3f)
          //   NewKeyFlag=0;//取消上次按键标志
          P2=0xff;//把P2口拉高
          P1&=0xc0;//P10,P11,P12,P13,P14,P15口线拉低
 	      DatTemp22=P2;//读取P2口状态
          //if(DatTemp22==0xff)
          //   NewKeyFlag=0;//取消上次按键标志
          P1|=0x3f;//P10,P11,P12,P13,P14,P15口线置高
          //20ms去抖动处理
          if((DatTemp1==DatTemp11)&&(DatTemp2==DatTemp22))
            {//两次读取的值相同
			  if(KeyWobbleTime<30)
                   KeyWobbleTime++;
              if((!NewKeyFlag)&&(KeyWobbleTime>=20))//20ms
                {
                   ReadKeyOnceFlag=1;//建立一次成功读取开关标志
                   NewKeyFlag=1;//本次按键标志
                }
            }
          else
            {//两次读取的值不同,可能是抖动,也可能是新的按键出现
               DatTemp1=DatTemp11;
               DatTemp2=DatTemp22;
               KeyWobbleTime=0;//重新开始抖动计时
			   NewKeyFlag=0;//取消上次按键标志
            }
    }
    }
}
void INT_T1()interrupt TI1_VECTOR//20ms interrupt 
{
  TL1=T1_L;
  TH1=T1_H;
  if(SomeKeyKeepFlag)
   {
     SomeKeyKeepTime++;
   }
}

⌨️ 快捷键说明

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