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

📄 kb.c

📁 4*4键盘检测程序
💻 C
字号:



#include <reg52.h>

#define uchar unsigned char

sbit P10=P1^0;

unsigned char BUFF[8];

uchar key;



unsigned int C,D,E,F;

unsigned char i,j,k,Temp,PD,TX,TXL,ALS,ALSL;

//向串口输出一个字符(非中断方式) 
void ComOutChar(unsigned char OutData) 
{ 
SBUF = OutData; //输出字符 
while(!TI); //空语句判断字符是否发完 
TI = 0; //清TI 
} 


//串口初始化
void init_serialcomm(void)
{
    SCON= 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr 
    TMOD= 0x21;       //TMOD: timer 1, mode 2, 8-bit reload 
    PCON= 0x80;       //SMOD=1; 
    TH1=0xfa;
    TL1=0xfa;           //Baud:9600   fosc=11.0592MHz
    ES=1;
    TR1= 1;          //timer 1 run 
}

//10ms定时器初始化
void init_timer(void)
{
    TMOD=0x21;           //timer0:16bit unreload  timer1:16bit unreload
    TH0=-(9216/256);     //load timer0 (10ms per interrupt 11.0592MHz)
    TL0=-(9216%256); 
    ET0=1;               //T/C0开中断  
    TR0=1;               //启动定时器
}
//利用定时器0的方式1编程,采用中断方式
void timer0 (void) interrupt 1 
{
    TH0=-(9216/256);  //load timer0 (10ms per interrupt 11.0593MHz)
    TL0=-(9216%256);

    F=F+1;
    

	    if(F==100)   //0.20秒时间到,检测是否有报警
	
		{
	
		 F=0; 
	
	     P10=!P10; 
	
	     C=1;

         
	
		}



}

//串行中断程序
void serial () interrupt 4 using 3 
{

   if(RI)//当接受完一个字节后
    {
	   
	  
	   Temp=SBUF;
       
       if (Temp!=0x80)

	   {

	     BUFF[j]=Temp;

	     j=j+1;

	   }

       

       if (Temp==0x80)  //命令接收完成,置位PD
	   {

	     j=0;

	     PD=0x01;  

	   }

       RI=0;

    }

 



}

void delay10ms(void)   //10毫秒延时程序

{
        unsigned char i,j,k;
         for(i=5;i>0;i--)
         for(j=4;j>0;j--)
         for(k=248;k>0;k--);  //248
}



uchar kbscan(void)    // 键盘扫描程序
{

uchar sccode,recode;

P0=0xf0;             //置所有行为低电平,行扫描,列线输入(此时)

if((P0&0xf0)!=0xf0) //判断是否有有键按下(读取列的真实状态,若第4列有键按下则P1的值会变成0111                       0000),有往下执行
{
   delay10ms();                   //延时去抖动(10ms)
   if((P0&0xf0)!=0xf0)         //再次判断列中是否是干扰信号,不是则向下执行
   {
    sccode=0xFE;           //逐行扫描初值(即先扫描第1行) 
    while((sccode&0x10)!=0)//行扫描完成时(即4行已经全部扫描完成)sccode为1110 1111 停止while程序     
    {
     P0=sccode;                 //输出行扫描码
if ((P0&0xf0)!=0xf0)           //本行有键按下(即P1(真实的状态)的高四位不全为1)
     {
      recode=(P0&0xf0)|0x0f; //列
      return(sccode&recode); //返回行和列
     }
          else //所扫描的行没有键按下,则扫描下一行,直到4行都扫描
         {
           sccode=(sccode<<1)|0x01;//行扫描码左移一位
          }
         }
        }
}
          else
{
           return 0;        //无键按下,返回0
}
}




//主函数入口
void main(void)
{   
    

  
    init_timer();
    init_serialcomm();
    EA=1;
    TR0=1;
    ES=1;
    while(1)

    {

      if (C==1) 

      {

        C=0;

        key=kbscan();


		if (key!=0x00)
		
		{
		   ComOutChar(key);

           
        }

       

      }

	}
	
}
 

⌨️ 快捷键说明

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