[技术问答] PS2键盘解码(可以IO模拟)

[复制链接]
1340|7
 楼主| DreamofOven 发表于 2016-2-28 22:36 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. /**************1602部分******************/
  5. sbit lcden=P1^2;
  6. sbit lcdrs=P1^0;
  7. sbit lcdrw=P1^1;
  8. sbit psdat=P3^4;
  9. sbit psclk=P3^3;
  10. /*char code Tab[]={'0','1','2','3','4','5','6','7','8',
  11. '9','A','B','C','D','E','F'};*/
  12. char code Tab[]="0123456789abcdef";
  13. uchar key[3];
  14. uchar numbit,keyv,keynum,m,n,o,p,q,r;
  15. void delay(uint z) //延时子程序
  16. {
  17.   uint x,y;
  18.   for(x=z;x>0;x--)
  19.      for(y=110;y>0;y--);
  20. }

  21. void write_com(uchar com)//定义一个带参数的写命令子程序
  22. {
  23. lcdrs=0; //1602的rs为0时,接收命令,为1时接收数据
  24. P0=com;//把void write_com(uchar com)中的COM中的数据给P0口
  25. delay(2);
  26. lcden=1;
  27. delay(2);
  28. lcden=0;
  29. delay(2);
  30. }


  31. void init_1602()//定义一个初始化子程序
  32. {
  33. lcden=0;
  34. lcdrw=0;
  35. write_com(0x38);//调用 write_com子程序并把0x38赋给P0口,显示模式打开
  36. write_com(0x0f);//调用 write_com子程序并把“开显示,显示光标,光标闪烁”指令码赋给P0口
  37. write_com(0x06);//调用 write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口
  38. write_com(0x80);//数据指针初始化,让指针指向最左端,显示从第一行开始
  39. write_com(0x01);//调用 write_com子程序并把"清零指"令码赋给P0口
  40. }

  41. void write_dat(uchar dat)//定义一个带参数的写数据子程序
  42. {
  43. lcdrs=1; //1602的rs为0时,接收命令,为1时接收数据
  44. P0=dat;//把void write_shu(uchar shu)中的COM中的数据给P0口
  45. delay(2);
  46. lcden=1;
  47. delay(2);
  48. lcden=0;
  49. delay(2);
  50. }

  51. /******************/

  52. void main()
  53. {
  54. init_1602();
  55. IT1=1;//接P3^3,所以用外部中断1,用下降沿IT1=0是用低电平
  56. EX1=1;// 打开外部中断1。
  57. EA=1;//打开总中断
  58. while(1)
  59.      {
  60.    if(keynum==3)
  61.      {
  62.     keynum=0;
  63.     m=key[0]/16;
  64.     n=key[0]%16;
  65.     o=key[1]/16;
  66.     p=key[1]%16;
  67.     q=key[2]/16;
  68.     r=key[2]%16;
  69.   write_com(0x80);
  70.      write_dat(Tab[m]);
  71.      write_dat(Tab[n]);
  72.   write_dat(Tab[o]);
  73.   write_dat(Tab[p]);
  74.   write_dat(Tab[q]);
  75.   write_dat(Tab[r]);
  76.   }

  77.   }
  78. }
  79. void int1() interrupt 2
  80. {
  81. if((numbit>0)&&(numbit<9))
  82.   {
  83.    keyv=keyv>>1;
  84.    if(psdat)
  85.      keyv=keyv|0x80;
  86.   }
  87.   numbit++;
  88.      if(numbit>10)

  89.   {
  90.   numbit=0;
  91.   key[keynum]=keyv;
  92.   keynum++;
  93.   }
  94. }


zwwoshi 发表于 2016-3-17 14:51 | 显示全部楼层
谢谢分享
dongnanxibei 发表于 2016-3-17 19:34 | 显示全部楼层
随着计算机工业的发展,作为计算机最常用输入设备的键盘也日新月异。1981年IBM推出了IBM PC/XT键盘及其接口标准。该标准定义了83键,采用5脚DIN连接器和简单的串行协议。实际上,第一套键盘扫描码集并没有主机到键盘的命令。为此,1984年IBM推出了IBM AT键盘接口标准。该标准定义了84~101键,采用5脚DIN连接器和双向串行通讯协议,此协议依照第二套键盘扫描码集设有8个主机到键盘的命令。到了1987年,IBM又推出了PS/2键盘接口标准。该标准仍旧定义了84~101键,但是采用6脚mini-DIN连接器,该连接器在封装上更小巧,仍然用双向串行通讯协议并且提供有可选择的第三套键盘扫描码集,同时支持17个主机到键盘的命令。市面上的键盘都和PS/2及AT键盘兼容,只是功能不同而已。
dongnanxibei 发表于 2016-3-17 19:35 | 显示全部楼层
物理连接
一般,具有五脚连接器的键盘称之为AT键盘,而具有六脚mini-DIN连接器的键盘则称之为PS/2键盘。其实这两种连接器都只有四个脚有意义。它们分别是Clock(时钟脚)、Data(数据脚)、+5V(电源脚)和Ground(电源地)。在PS/2键盘与PC机的物理连接上只要保证这四根线一一对应就可以了。PS/2键盘靠PC的PS/2端口提供+5V电源,另外两个脚Clock(时钟脚)和Data(数据脚)都是集电极开路的,所以必须接大阻值的上拉电阻。它们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高电平。
Micachl 发表于 2016-3-20 21:43 | 显示全部楼层
以前用FPGA的时候用vhdl写过ps2的程序
ofsummer 发表于 2016-3-27 20:57 | 显示全部楼层
现在还有人玩ps2吗,用USB都可以实现了
 楼主| DreamofOven 发表于 2016-3-29 21:05 | 显示全部楼层
PS2的解码程序这么简单吗,我记得挺复杂的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

178

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部