4*4矩阵键盘C51程序

#include <reg51.h>
#include <intrins.h>
#define key_port  P0   //键盘接口定义
sbit key_port_0=key_port^0;
sbit key_port_1=key_port^1;
sbit key_port_2=key_port^2;
sbit key_port_3=key_port^3;
/*******************************
STC89C59单片机一毫秒延时函数
*******************************/
void delay_ms(unsigned int ms)   
{
    unsigned int i,j;
  for( i=0;i<ms;i++)
  for(j=0;j<332;j++); //1947是STC89C58在22.1184MHz晶振下,通过软件仿真反复实验得到的数值
}
/**************************
   串口发送一个字符
**************************/
void com_send_dat( unsigned char dat)
{
    SBUF=dat;
 while (TI== 0);
 TI= 0 ;
}
/**************************
   串口初始化
**************************/
void init_com( void )
{
 SCON=0x50 ;    //SCON: serail mode 1, 8-bit UART, enable ucvr   //UART为模式1,8位数据,允许接收
    TMOD|=0x20 ;   //TMOD: timer 1, mode 2, 8-bit reload            //定时器1为模式2,8位自动重装
 TH1=0xfa ;      //Baud:19200 fosc="22.1184MHz
 TL1=0xfa;
 PCON|=0x80;   //SMOD=1;波特率加倍;  
 ES=1;       //Enable Serial Interrupt
   TR1 = 1 ;        // timer 1 run
}
/**************************
   键盘扫描函数
**************************/
unsigned char keyscan(void)

 unsigned char key,i;
    unsigned char code key_table[16]=
 {0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};
    key_port=0x0f;         //确定行列位置
    if(key_port==0x0f)return(0);//无键按下返回0
    delay_ms(10);               //调用延时函数 ,目的是去前沿键抖。
    if(key_port==0x0f)return(0);//再次判断。目的是确保检测正确
    else
    {
  for(i=0;i<4;i++)       //以下为经典的计算键值(判断闭合键所在的位置)
        {
   P0=_cror_(0x7f,i);
     if(key_port_0==0)break;
           if(key_port_1==0)break;
           if(key_port_2==0)break;
           if(key_port_3==0)break;
        } 
     key=key_port;       //取得键值
  for(;key_port!=0x0f;key_port=0x0f);  //等待键松开,目的是去后沿键抖
  for(i=0;key_table[i]!=key && i<16;i++); //查表取key的值0-F
  key=i;
     return(key);                           //带键值返回主调函数
   }
}
/**************************
   键盘扫描测试主函数
**************************/
void main(void)
{
 unsigned char key;
 init_com(); //串口初始化
 while(1)
 {
  key=keyscan();
  if(key!=0)
  {
  com_send_dat(key);
  delay_ms(200);
  }
 }
}

你可能感兴趣的:(4*4矩阵键盘C51程序)