12859|2

449

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

单片机驱动标准PC机键盘的C51程序 [复制链接]

单片机驱动标准PC机键盘的C51程序 功能:实现pc机键盘(p/s2接口)与8位单片机连接使用 原理:键盘时钟接在p3.2口,既8051的外部中断int0上,键盘数据接到p1.0上 每次按键,键盘会向单片机发脉冲使单片机发生外部中断,数据有p1.0口一位一位传进来 传回的数据格式为:1位开始位(0),8位数据位(所按按键的通码,用来识别按键),1位 校验位(奇校验) 1位结束位(1) 实现:将键盘发回的数据放到一个缓冲区里(数组),当按键结束后发生内部中断来处理所 按的按键 缺点:由于51单片机的容量有限所以缓冲区不可以开的太大,这就导致可以记录键盘的按键 次数过少, 也就是容错性一般。不过如果正常使用键盘是不会出错的。 ================================================================================ ====================
  1. #include"reg51.h"
  2. #include "intrins.h"
  3. #include "ku.h" //按键通码与ascii对照表
  4. sbit sda= p1^0; //键盘数据线</P><P>unsigned char dat=0,dat1=0,dat2=0; //接收键盘
  5. 数据变量? 存储通码变量 接受连续通码变量
  6. unsigned char count=0,num=9,temp[5],shu=0; //中数次数 中断控制变量 缓冲区数组 缓
  7. 冲区指针
  8. unsigned char key=0; //按键最终值</P><P>void zhongduan() interrupt 0 //外部中断
  9. 0 用来接受键盘发来的数据
  10. {
  11. dat>>=1; //接受数据 低->高
  12. if(sda) dat|=0x80;
  13. count++;
  14. if(count==num)
  15. {
  16. if(count==9)
  17. {
  18. dat1=dat; //中断9次后为键盘所按按键的通码(开始位始终为0在第一次中断时右移中忽
  19. 略)
  20. num=20; //使中断可以继续中断11次
  21. }
  22. if(count==20)
  23. {
  24. dat2=dat; //取回第二个通码
  25. if(dat1==0xe0 || dat2==0xf0) //第一个通码是0xe0则证明所按按键为功能键,第二个通
  26. 码是0xf0证明按键结束
  27. {
  28. temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //将所按按键存到缓冲区中
  29. ie=0x82; //关闭外部中断并打开内部中断来处理所按按键
  30. tr0=1;
  31. }
  32. else
  33. {
  34. temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //如果shift键被按下则记录与它同时按下的
  35. 那个键
  36. count=0;
  37. }
  38. if((temp[0]==18 || temp[0]==89) && (temp[2]==18 || temp[2]==89) ) tr0=1; //如果
  39. 缓冲区中有两个间隔的shift键则证明需要的铵键结束
  40. }
  41. }
  42. }</P><P>
  43. void getkey() interrupt 1 //内部中断0 用来处理缓冲区里的数据
  44. {
  45. unsigned char i=0;
  46. tr0=0;
  47. th0=0;
  48. tl0=0;
  49. count=0; //中断记数则0
  50. if((temp[0]==18 || temp[0]==89) && temp[1]!=0xf0 ) //shift被按下
  51. {
  52. for(i=0;i<21;i++)
  53. {
  54. if(addshift[i][0]==temp[1]) //搜索shift被按下的表
  55. {
  56. key=addshift[i][1];
  57. ie=0x83; //打开外部中断
  58. return;
  59. }
  60. }
  61. }
  62. else if(temp[0]==0xe0) //所按下的按键是功能键
  63. {
  64. for(i=0;i<80;i++)
  65. {
  66. if(noshift[i][0]==temp[1]) //功能键的通码在缓冲区的第二位
  67. {
  68. key=noshift[i][1];
  69. ie=0x83;
  70. return;
  71. }
  72. }
  73. }
  74. else //普通按键
  75. {
  76. for(i=0;i<80;i++)
  77. {
  78. if(noshift[i][0]==temp[0]) //普按键的通码在缓冲区的第一位
  79. {
  80. key=noshift[i][1];
  81. ie=0x83;
  82. return;
  83. }
  84. }
  85. }
  86. for(i=0;i<5;i++)
  87. {
  88. temp[i]=0;
  89. }
  90. }
复制代码
此帖出自51单片机论坛

最新回复

单片机驱动标准PC机键盘的C51程序 很实用  详情 回复 发表于 2009-10-23 14:17
点赞 关注
个人签名世界是个圈,人生也是个圈。
 

回复
举报

8

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

代码

谢谢,代码还可以...
此帖出自51单片机论坛
 
 
 

回复

176

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
单片机驱动标准PC机键盘的C51程序
很实用
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表