PS2键盘51测试程序1

发布者:q13358975046最新更新时间:2016-10-30 来源: eefocus关键字:PS2键盘  51测试程序 手机看文章 扫描二维码
随时随地手机看文章
// PS2键盘测试程序1

// 功能:数码管显示PS2键盘第1类按键通码和断码,单个按键有效,不考虑组合键。
// 例如:按下按键a,显示其通码1C,断码F0 1C,   1C-F0-1C

// 按下按键b,显示其通码32,断码F0 32, 32-F0-32

// 指示灯: 接收按键值 P30(run) 取反。  键盘上电P31亮,接收按键值,P31灭。

#include

void delayms(unsigned int k);// ms 延时子程序
void leddisplay();  // 数码管显示

sbit PS2CLK=P3^3;    // PS2时钟
sbit PS2DATA=P3^4;   // PS2数据

sbit RUN=P3^0;       // 运行标志指示灯
sbit P31=P3^1;       // 运行标志指示灯

unsigned char bitnum=0;  // 中断接收键盘数据位的个数
unsigned char keyval=0;  // 存放按键值
unsigned char keynum=0;  // 存放中断接收键盘数据的个数
unsigned char key[3]={0,0,0};    // 存放按键的1B通码和2B断码
unsigned char ledxs[8]={0,0,18,0,0,18,0,0}; // LED显示

unsigned char code tab[]=

{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,0xff,0x40};
                          //共阴极代码 0-F,  全灭,全亮,‘-’

void main()
{
   EA=1;    // 开总中断
   EX1=1;   // 开外部中断1
   IT1=1;   // 外部中断1下降沿触发
   while(1)
   {
     if(keynum==3)       // 接收3B数据   1B通码   2B断码
     {
       P31=1;     //  接收键值  P31指示灯灭
       keynum=0;
       ledxs[0]=key[0]/16;
       ledxs[1]=key[0]%16;   // 按键通码拆分成2B

       ledxs[3]=key[1]/16;
       ledxs[4]=key[1]%16;   // 按键断码拆分成2B
       
       ledxs[6]=key[2]/16;
       ledxs[7]=key[2]%16;   // 按键断码拆分成2B

     }
     leddisplay();  //  数码管显示
   }
}

void kbinter(void) interrupt 2
{
   RUN=~RUN;  // RUN指示灯取反
   //EX1=0;   // 关外部中断1
   if((bitnum>0)&&(bitnum<9))    //  保留接收数据的第1到第8位,即D0-D7,去掉起始位、校验位、停止位
   {
     keyval=keyval>>1;          //   先接收到的是数据的D0位
     if(PS2DATA==1)
       keyval=keyval|0x80;
   }
   bitnum++;      // 中断1次,位数加1
   while(!PS2CLK);   //等待PS2CLK拉高
   if(bitnum>10)  // 接收完1帧数据(11位)
   {
     bitnum=0;
     key[keynum]=keyval;  // 保存接收到的数据
     keynum++;
     if(keyval==0xaa)   // 键盘上电正常发送来的信息
     {
       P31=0;           //    P31指示灯亮
       keynum=0;
       ledxs[0]=0;
       ledxs[1]=0;
       ledxs[3]=0;
       ledxs[4]=0;
       ledxs[6]=0x0a;
       ledxs[7]=0x0a;  // 数码管显示   00-00-AA
     }
   }

   //EX1=1;   // 开外部中断1
}

void leddisplay()

  P2=0xdf;
  P0=tab[ledxs[0]];
  delayms(1);
  P0=0x00;

  P2=0x5f;
  P0=tab[ledxs[1]];
  delayms(1);
  P0=0x00;

  P2=0x9f;
  P0=tab[ledxs[2]];
  delayms(1);
  P0=0x00;

  P2=0x1f;
  P0=tab[ledxs[3]];
  delayms(1);
  P0=0x00;

  P2=0xff;
  P0=tab[ledxs[4]];
  delayms(1);
  P0=0x00;

  P2=0x7f;
  P0=tab[ledxs[5]];
  delayms(1);
  P0=0x00;

  P2=0xbf;
  P0=tab[ledxs[6]];
  delayms(1);
  P0=0x00;

  P2=0x3f;
  P0=tab[ledxs[7]];
  delayms(1);
  P0=0x00;
}
void delayms(unsigned char k)  //延时 n ms
{
  while(k)
  {
  int i;
  i=110;
  while(i--);
  k=k-1;
  }
}

关键字:PS2键盘  51测试程序 引用地址:PS2键盘51测试程序1

上一篇:PS2键盘51测试程序2
下一篇:51单片机串口发送和中断接收程序

推荐阅读最新更新时间:2024-03-16 15:18

PIC16F72单片机---NOKIA5110测试程序
/*************PIC16F72单片机程序******************************/ /*************************************************************/ /*****File Function : NOKIA5110练习程序 *****/ /*****Program Author : ZhengWen(ClimberWin) *****/ /*****MCU : PIC16F72 外部晶振6MHZ *****/ /*****Compile Date : 2010/11/9
[单片机]
PIC16F72单片机---NOKIA<font color='red'>51</font>10<font color='red'>测试程序</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved