📄 ps2.lst
字号:
C51 COMPILER V7.06 PS2 08/28/2006 17:44:42 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN ps2.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE ps2.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*---------------------------------------------------------------------------------------------------
2 功能:实现pc机键盘(p/s2接口)与8位单片机连接使用
3 原理:键盘时钟接在p3.2口,既8051的外部中断int0上,键盘数据接到p1.0上
4 每次按键,键盘会向单片机发脉冲使单片机发生外部中断,数据由p1.0口一位一位传进来
5 传回的数据格式为:1位开始位(0),8位数据位(所按按键的通码,用来识别按键),1位校验位(奇校验)
6 1位结束位(1)
7 实现:将键盘发回的数据放到一个缓冲区里(数组),当按键结束后发生内部中断来处理所按的按键
8 缺点:由于51单片机的容量有限所以缓冲区不可以开的太大,这就导致可以记录键盘的按键次数过少,
9 也就是容错性一般。不过如果正常使用键盘是不会出错的
10 版本:1.0
11 ====================================================================================================*/
12 #include<reg52.h>
13 #include "intrins.h"
14 #include "tcode.h" //按键通码与ascii对照表
15 sbit sda= P2^6; //键盘数据线</P><P>
16 unsigned char dat=0,dat1=0,dat2=0; //接收键盘数据变量? 存储通码变量 接受连续通码变量
17 unsigned char count=0,num=9,temp[5],shu=0; //中数次数 中断控制变量 缓冲区数组 缓冲区指针
18 extern unsigned char key=0; //按键最终值</P><P>
19 void zhongduan() interrupt 2 //外部中断0 用来接受键盘发来的数据
20 {
21 1 dat>>=1; //接受数据 低->高
22 1 if(sda) dat|=0x80;
23 1 count++;
24 1 if(count==num)
25 1 {
26 2 if(count==9)
27 2 {
28 3 dat1=dat; //中断9次后为键盘所按按键的通码(开始位始终为0在第一次中断时右移中忽略)
29 3 num=20; //使中断可以继续中断11次
30 3 }
31 2 if(count==20)
32 2 {
33 3 dat2=dat; //取回第二个通码
34 3 if(dat1==0xe0 || dat2==0xf0) //第一个通码是0xe0则证明所按按键为功能键,第二个通码是0xf0证明按键结束
35 3 {
36 4 temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //将所按按键存到缓冲区中
37 4 EX1=0; //关闭外部中断并打开内部中断来处理所按按键
38 4 TR0=1;
39 4 }
40 3 else
41 3 {
42 4 temp[shu]=dat1;temp[shu+1]=dat2; shu+=2; //如果shift键被按下则记录与它同时按下的那个键
43 4 count=0;
44 4 }
45 3 if((temp[0]==18 || temp[0]==89) && (temp[2]==18 || temp[2]==89) )
46 3 TR0=1; //如果缓冲区中有两个间隔的shift键则证明需要的铵键结束
47 3 }
48 2 }
49 1 }
50
51
52
53 void getkey() interrupt 1 //内部中断0 用来处理缓冲区里的数据
54 {
55 1 unsigned char i=0;
C51 COMPILER V7.06 PS2 08/28/2006 17:44:42 PAGE 2
56 1 TR0=0;
57 1 TH0=0;
58 1 TL0=0;
59 1 count=0; //中断记数则0
60 1 if((temp[0]==18 || temp[0]==89) && temp[1]!=0xf0 ) //shift被按下
61 1 {
62 2 for(i=0;i<21;i++)
63 2 {
64 3 if(addshift[i][0]==temp[1]) //搜索shift被按下的表
65 3 {
66 4 key=addshift[i][1];
67 4 EX1=1; //打开外部中断
68 4 return;
69 4 }
70 3 }
71 2 }
72 1 else if(temp[0]==0xe0) //所按下的按键是功能键
73 1 {
74 2 for(i=0;i<80;i++)
75 2 {
76 3 if(noshift[i][0]==temp[1]) //功能键的通码在缓冲区的第二位
77 3 {
78 4 key=noshift[i][1];
79 4 EX1=1;
80 4 return;
81 4 }
82 3 }
83 2 }
84 1 else //普通按键
85 1 {
86 2 for(i=0;i<80;i++)
87 2 {
88 3 if(noshift[i][0]==temp[0]) //普按键的通码在缓冲区的第一位
89 3 {
90 4 key=noshift[i][1];
91 4 EX1=1;
92 4 return;
93 4 }
94 3 }
95 2 }
96 1 for(i=0;i<5;i++)
97 1 {
98 2 temp[i]=0;
99 2 }
100 1 }
101
102
103
104
105
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 322 ----
CONSTANT SIZE = 254 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -