📄 ps2.lst
字号:
C51 COMPILER V7.06 PS2 05/18/2008 14:29:18 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PS2
OBJECT MODULE PLACED IN PS2.OBJ
COMPILER INVOKED BY: E:\My Electronic\Tools\Design tools\keil7.06\C51\BIN\C51.EXE PS2.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <REG52.H>
2 #include "intrins.h"
3 //#include "ku.h" //按键通码与ascii对照表
4 #include <string.h>
5
6 #define uchar unsigned char
7
8 sbit sda= P2^5; //键盘数据线
9
10 extern uchar inbuf1[];
11 //extern uchar PS2_Busy;
12 extern uchar PS2_ok;
13
14 uchar PS2_ok;
15 //uchar PS2_Busy;
16 uchar Ps2_Data=0x00; //最终按键值(第二套键扫码)
17 uchar PS2_Dat_Temp=0x00; //接收键盘数据临时变量
18 uchar count=0,num;//shu; //控制标志
19 Ps2_Receice_Data[2]={0x00,0x00}; //临时接收按键值(第二套键扫码)
20
21
22 /*******LCD函数调用声明******/
23 void sent_string(uchar x,uchar y,uchar *sent_data,uchar length);
24 void LCD_clr_pic();
25
26 void init_PS2(void)
27 {
28 1 EX0=1;
29 1 IT0=1;
30 1 EA=1;
31 1
32 1 //shu=0;
33 1 PS2_Dat_Temp=0x00;
34 1 num=9;
35 1 count=0;
36 1 PS2_ok=0;
37 1 }
38
39
40 //外部中断0 用来接收键盘发来的数据
41 void zhongduan() interrupt 0
42 {
43 1 EX1=0; //关外部中断0,防止红外中断同时发生,串口优先
44 1 PS2_Dat_Temp>>=1; //接收数据 低->高
45 1 if(sda)
46 1 {
47 2 PS2_Dat_Temp|=0x80;
48 2 }
49 1
50 1 count++;
51 1 if(count==num)
52 1 {
53 2 if(count==9)
54 2 {
55 3 if((PS2_Dat_Temp==0xE0)||(PS2_Dat_Temp==0xF0)) //忽略0xE0和0xF0
C51 COMPILER V7.06 PS2 05/18/2008 14:29:18 PAGE 2
56 3 {
57 4 count=0; //重新记录第一个数据
58 4 PS2_Dat_Temp=0x00;
59 4 }
60 3 else //if(
61 3 {
62 4 Ps2_Receice_Data[0]=PS2_Dat_Temp; //保存第一个数据
63 4 PS2_Dat_Temp=0x00;
64 4 num=20; //使中断可以继续中断11次
65 4 //shu++;
66 4 //Ps2_Data=Ps2_Receice_Data[0];
67 4 }
68 3 }
69 2 if(count==20)
70 2 {
71 3 if((PS2_Dat_Temp==0xE0)||(PS2_Dat_Temp==0xF0)) //忽略0xE0和0xF0
72 3 {
73 4 count=9; //重新记录第二个数据
74 4 PS2_Dat_Temp=0x00;
75 4 }
76 3 else
77 3 {
78 4 Ps2_Receice_Data[1]=PS2_Dat_Temp; //保存第二个数据
79 4 PS2_Dat_Temp=0x00;
80 4 if(Ps2_Receice_Data[0]!=Ps2_Receice_Data[1]) //如果两组数据错位
81 4 {
82 5 Ps2_Receice_Data[0]=Ps2_Receice_Data[1]; //以最新的一次按键为准
83 5 }
84 4 Ps2_Data=Ps2_Receice_Data[0]; //确认最终按键并保存到Ps2_Data中
85 4
86 4 //shu=0;
87 4 num=9;
88 4 count=0;
89 4 PS2_ok=1;
90 4 }
91 3 }
92 2 }
93 1 EX1=1;
94 1 }
95
96 //译码函数,用来处理缓冲区里的数据
97 void Ps2_Getkey(void)
98 {
99 1 unsigned char i=0;
100 1
101 1 EX0=0; EX1=0; //关外部中断
102 1 if(PS2_ok==1) //若有按键解出
103 1 {
104 2 if(Ps2_Receice_Data[0]==Ps2_Receice_Data[1])
105 2 {
106 3 switch (Ps2_Data)
107 3 {
108 4 case 0x16:init_PS2(); if(inbuf1[19]=='1')inbuf1[19]='0';else inbuf1[19]='1';break; // 1
109 4 case 0x1E:init_PS2(); if(inbuf1[20]=='1')inbuf1[20]='0';else inbuf1[20]='1';break; // 2
110 4 case 0x26:init_PS2(); if(inbuf1[21]=='1')inbuf1[21]='0';else inbuf1[21]='1';break; // 3
111 4 case 0x25:init_PS2(); if(inbuf1[22]=='1')inbuf1[22]='0';else inbuf1[22]='1';break; // 4
112 4 case 0x2E:init_PS2(); if(inbuf1[23]=='1')inbuf1[23]='0';else inbuf1[23]='1';break; // 5
113 4 case 0x36:init_PS2(); if(inbuf1[24]=='1')inbuf1[24]='0';else inbuf1[24]='1';break; // 6
114 4 case 0x3D:init_PS2(); if(inbuf1[25]=='1')inbuf1[25]='0';else inbuf1[25]='1';break; // 7
115 4 case 0x3E:init_PS2(); if(inbuf1[26]=='1')inbuf1[26]='0';else inbuf1[26]='1';break; // 8
116 4 default:init_PS2(); break;
117 4 }
C51 COMPILER V7.06 PS2 05/18/2008 14:29:18 PAGE 3
118 3 }
119 2 //Ps2_Data=0;
120 2 }
121 1 PS2_ok=0;
122 1 EX0=1;EX1=1; //开外部中断
123 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 376 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 9 1
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 + -