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

📄 key.c

📁 51单片机串口键盘程序
💻 C
字号:
#include <stdio.h>
#include "STC89C51RC.H"

sbit  ACC_0 = ACC^0;
sbit  ACC_1 = ACC^1;

sbit  SPEAK = P3^6;

unsigned char  UartStauts;
unsigned char  SpeakOn;

unsigned char code keynum[8][8]={

/* A~Z*/
0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,
0x17,0x24,0x25,0x26,0x32,0x31,0x18,0x19,
0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,
0x15,0x2C,

/* 0......9*/
0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,
/*F1..….f10*/
0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,
/* . ; + - /  */
0x34,0x27,0x0D,0x0C,0x35,
/* ↑↓←→空格 */
0x1E,0x1F,0x20,0x21,0x22,
/* Ctrl Alt Shift Esc Del */
0x23,0x24,0x25,0x1E,0x1F,
/* Insert BackSpace 回车 Pageup Pagedown  End */
0x52,0x0E,0x1C,0x49,0x51,0x4F,


}; //key1~key5,enter,right,left.

unsigned char code keynum1[3]={0x01,0x02,0x03};

unsigned char Key_flag;  //有键按下标志
unsigned char Key_num;   //按下键盘值


/******************************************************************************

******************************************************************************/
void Delay()
{
  unsigned int i;
  for(i=0;i<1000;i++){i=i;}
}
/******************************************************************************

******************************************************************************/
void Delay20ms()
{
  unsigned int i;
  for(i=0;i<500;i++){i=i;}
}
/******************************************************************************

******************************************************************************/
void mcu_int()
{
  SCON = 0x50; //串口方式1,允许接收
  TMOD = 0x20; //定时器1定时方式2
  TCON = 0x40; //设定时器1开始计数
  TH1 = 0xFC; //14.3184MHz 9600波特率
  TL1 = 0xFC;
  PS = 1;

  ES=1;                            //Enable serial
  EA=1;

  TI = 0;
  TR1 = 1; //启动定时器  
}


/******************************************************************************

******************************************************************************/
void Char_send(unsigned char chr)
{

    SBUF=chr;
    while(!TI);
	TI=0;
 
}

char Getdata(unsigned char num)
{
   switch(num)
   {
     case 0x01 : return 0; break;
	 case 0x02 : return 1; break;
	 case 0x04 : return 2; break;
	 case 0x08 : return 3; break;
	 case 0x10 : return 4; break;
	 case 0x20 : return 5; break;
	 case 0x40 : return 6; break;
	 case 0x80 : return 7; break;

   }
}
/******************************************************************************

******************************************************************************/
void Key_scan()
{
 unsigned char temp,i=0;
 unsigned char line,col,s1,s2;
  P2 = 0;
  if((P0 != 0xff)||((P1&0x1c)!=0x1c))
  { 
    if(SpeakOn == 1)
      SPEAK = 1;
    Delay20ms();
	
    if(P0 != 0xff)
	 {
	    Key_flag=1; 
		
	    line = 0xfe;
		  for(i=0;i<8;i++)
		    {
		       P2 = line;
		       if(P0 != 0xff)
		         {
				    col = P0;
 				    s1=Getdata(~line);
					s2=Getdata(~col);				
					Key_num = keynum[s1][s2];
                     break;
		          }else 
		           line=(line<<1)|0x01;
			
	        } 

		 while(P0 != 0xff);		
	 }
    
     if ((P1&0x1c)!=0x1c)
	 {
	   Key_flag=1; 
	    temp = P1&0x1c ;
		switch(temp)
	     {	

			case 0x0c: Key_num=keynum1[0];  //enter
			break;

             case 0x14: Key_num=keynum1[1];  //right
			break;

			 case  0x18: Key_num=keynum1[2];  //left
			break;

			default :
			break;
		 }
	 }

   }
   else SPEAK = 0;
}

/******************************************************************************

******************************************************************************/
void Key_send()
{
   while(P1!=0xff);
   Char_send(0xeb); //包头
   Delay();
   Char_send(0x67);
   Delay();
   Char_send(Key_num);
   Delay();
   Char_send(0xfb);	 
}




/*******************UART 中断处理程序*****************************/
void serial0_process(void)  interrupt  4 using 1
{
 unsigned char  temp;  
 if(RI)
 {
  EA=0;RI=0;
  
  switch(UartStauts)
   {
    case  0 :       
			if(SBUF != 0xeb)UartStauts=0x00;
			else UartStauts=0x01;
			    break;

	case  1 :       
			temp = SBUF;
			if(temp == 0x66)
		    
            UartStauts=0X02;
			    break;

	case  2 :       
	       temp = SBUF;
		   if (temp == 1) 
		   SpeakOn = 1;
		   		   if (temp == 0) 
		   SpeakOn = 0;
		   UartStauts=0x03;		  
 		  
			    break;
	 				
	 case  3 :       
	       temp = SBUF;
		   UartStauts=0x00;	 
 		  
		        break;
   }
  
  EA=1;
  }
}


/******************************************************************************

******************************************************************************/

void main(void)
{
 SPEAK = 0;
  mcu_int();

  while(1)
  { 
   
    Key_scan();
    if(Key_flag == 1)	
	{
	  Key_flag = 0; 
    
	  Key_send();
	  
	}
  }
}

⌨️ 快捷键说明

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